Jelajahi Sumber

Proper deserialization for events

Lukas Angerer 3 tahun lalu
induk
melakukan
dab221626b

+ 18 - 2
src/RunnersMeet.Client/src/app/events-api.service.ts

@@ -17,10 +17,26 @@ export class EventsApiService {
 	) { }
 
 	public getEvents(searchParams: EventSearchParams): Promise<ResultPage<GroupEvent>> {
-		return lastValueFrom(this.http.get<ResultPage<GroupEvent>>(this.config.apiUri(`/api/events`), { params: searchParams.toHttpParams() }));
+		return lastValueFrom(this.http.get<ResultPage<GroupEvent>>(this.config.apiUri(`/api/events`), { params: searchParams.toHttpParams() }))
+			.then(page => (ResultPage<GroupEvent>).deserialize(page, GroupEvent));
 	}
 
 	public createEvent(groupEvent: GroupEvent): Promise<GroupEvent> {
-		return lastValueFrom(this.http.post<GroupEvent>(this.config.apiUri(`/api/events`), groupEvent));
+		return lastValueFrom(this.http.post<GroupEvent>(this.config.apiUri(`/api/events`), groupEvent))
+			.then(event => GroupEvent.deserialize(event));
+	}
+
+	public getEvent(eventId: string): Promise<GroupEvent> {
+		return lastValueFrom(this.http.get<GroupEvent>(this.config.apiUri(`/api/events/${eventId}`)))
+			.then(event => GroupEvent.deserialize(event));
+	}
+
+	public updateEvent(event: GroupEvent): Promise<GroupEvent> {
+		return lastValueFrom(this.http.put<GroupEvent>(this.config.apiUri(`/api/events/${event.eventId}`), event))
+			.then(event => GroupEvent.deserialize(event));
+	}
+
+	public deleteEvent(event: GroupEvent): Promise<void> {
+		return lastValueFrom(this.http.delete(this.config.apiUri(`/api/events/${event.eventId}`))).then();
 	}
 }

+ 1 - 1
src/RunnersMeet.Client/src/app/events/event-edit/event-edit.component.html

@@ -20,6 +20,6 @@
 	</mat-form-field>
 	<div class="button-group">
 		<button type="submit" mat-raised-button color="primary">Save</button>
-		<button type="submit" mat-raised-button color="warn" (click)="deleteEvent()">Delete</button>
+		<button *ngIf="!isCreateMode" type="submit" mat-raised-button color="warn" (click)="deleteEvent()">Delete</button>
 	</div>
 </form>

+ 22 - 17
src/RunnersMeet.Client/src/app/events/event-edit/event-edit.component.ts

@@ -26,36 +26,41 @@ export class EventEditComponent {
 	public ngOnInit(): void {
 		if (this.isCreateMode) {
 			this.event = new GroupEvent();
+		} else {
+			this.eventsApi.getEvent(this.eventId).then(event => {
+				this.event = event;
+				this.startDate = new Date(this.event.startTime ?? new Date());
+				this.startTime =
+					(this.event.startTime?.getHours() ?? 0).toString().padStart(2, '0')
+					+ ':'
+					+ (this.event.startTime?.getMinutes() ?? 0).toString().padStart(2, '0');
+			});
 		}
-		// this.eventsApi.getTrack(this.trackId).then(track => {
-		// 	this.track = track;
-		// });
 	}
 
 	public updateEvent(event: SubmitEvent): void {
-		console.log({ date: this.startDate, time: this.startTime});
 		const match = this.startTime.match(/(\d{1,2}):(\d{1,2})/);
 		if (this.startDate && match) {
 			this.startDate.setHours(parseInt(match[1]));
 			this.startDate.setMinutes(parseInt(match[2]));
 			this.event!.startTime = this.startDate;
 		}
-		console.log(this.event);
-		if (this.isCreateMode) {
-			this.eventsApi.createEvent(this.event!);
+
+		if (this.event)
+		{
+			if (this.isCreateMode) {
+				this.eventsApi.createEvent(this.event);
+			} else {
+				this.eventsApi.updateEvent(this.event);
+			}
 		}
-		// if (this.track) {
-		// 	this.tracksApi.updateTrack(this.track).then(result => {
-		// 		this.track = result;
-		// 	});
-		// }
 	}
 
 	public deleteEvent(): void {
-		// if (this.track) {
-		// 	this.tracksApi.deleteTrack(this.track).then(() => {
-		// 		this.router.navigateByUrl("/tracks");
-		// 	});
-		// }
+		if (this.event) {
+			this.eventsApi.deleteEvent(this.event).then(() => {
+				this.router.navigateByUrl("/events");
+			});
+		}
 	}
 }

+ 7 - 0
src/RunnersMeet.Client/src/app/events/group-event.ts

@@ -8,4 +8,11 @@ export class GroupEvent {
 	public title: string = '';
 	public description: string = '';
 	public track?: Track;
+
+	public static deserialize(data: Readonly<GroupEvent>): GroupEvent {
+		const obj = new GroupEvent();
+		Object.assign(obj, data);
+		obj.startTime = new Date(obj.startTime as unknown as string);
+		return obj;
+	}
 }

+ 1 - 1
src/RunnersMeet.Client/src/app/pages/events-page/events-page.component.html

@@ -16,7 +16,7 @@
 </form>
 
 <ul>
-	<li *ngFor="let event of groupEvents | async">{{ event.title }}</li>
+	<li *ngFor="let event of groupEvents | async">{{ event.title }} <a [routerLink]="['/events/view', event.eventId]">View</a> <a [routerLink]="['/events/edit', event.eventId]">Edit</a></li>
 </ul>
 
 <button mat-raised-button color="accent" [disabled]="!hasMore" (click)="loadMore()">More</button>

+ 7 - 0
src/RunnersMeet.Client/src/app/result-page.ts

@@ -2,4 +2,11 @@ export class ResultPage<T> {
 	public items: T[] = [];
 	public page: number = 0;
 	public hasMore: boolean = false;
+
+	public static deserialize<T>(data: Readonly<ResultPage<T>>, itemType: { deserialize(data: Readonly<T>): T }): ResultPage<T> {
+		const obj = new ResultPage<T>();
+		Object.assign(obj, data);
+		obj.items = obj.items.map(i => itemType.deserialize(i));
+		return obj;
+	}
 }

+ 3 - 3
src/RunnersMeet.Server/Persistence/DeleteEventCommand.cs

@@ -14,14 +14,14 @@ public class DeleteEventCommand : IRequestHandler<EventReference, bool>
 
 	public bool Handle(EventReference request)
 	{
-		var dbTrack = _database.Events.FindById(request.EventId);
+		var dbEvent = _database.Events.FindById(request.EventId);
 
-		if (dbTrack == null)
+		if (dbEvent == null)
 		{
 			throw new ArgumentException($"Event with OID {request.EventId} does not exist", nameof(request.EventId));
 		}
 
-		if (dbTrack.Owner.UserId != request.Owner)
+		if (dbEvent.Owner.UserId != request.Owner)
 		{
 			throw new SecurityException("Trying to delete an event owned by somebody else");
 		}