From 96d6a18f88724d9f9589435671861244394c343b Mon Sep 17 00:00:00 2001 From: itskovacs Date: Wed, 15 Oct 2025 23:44:31 +0200 Subject: [PATCH] :sparkles: Trip attachments, Backups --- src/src/app/services/api.service.ts | 170 ++++++++++++++++------------ 1 file changed, 97 insertions(+), 73 deletions(-) diff --git a/src/src/app/services/api.service.ts b/src/src/app/services/api.service.ts index 36e19a0..5227ed9 100644 --- a/src/src/app/services/api.service.ts +++ b/src/src/app/services/api.service.ts @@ -3,12 +3,13 @@ import { HttpClient } from '@angular/common/http'; import { Category, Place } from '../types/poi'; import { BehaviorSubject, map, Observable, shareReplay, tap } from 'rxjs'; import { Info } from '../types/info'; -import { ImportResponse, Settings } from '../types/settings'; +import { Backup, ImportResponse, Settings } from '../types/settings'; import { ChecklistItem, PackingItem, SharedTripURL, Trip, + TripAttachment, TripBase, TripDay, TripInvitation, @@ -95,16 +96,16 @@ export class ApiService { return this.httpClient.post(`${this.apiBaseUrl}/places/batch`, places); } - putPlace(place_id: number, place: Partial): Observable { - return this.httpClient.put(`${this.apiBaseUrl}/places/${place_id}`, place); + putPlace(placeId: number, place: Partial): Observable { + return this.httpClient.put(`${this.apiBaseUrl}/places/${placeId}`, place); } - deletePlace(place_id: number): Observable { - return this.httpClient.delete(`${this.apiBaseUrl}/places/${place_id}`); + deletePlace(placeId: number): Observable { + return this.httpClient.delete(`${this.apiBaseUrl}/places/${placeId}`); } - getPlaceGPX(place_id: number): Observable { - return this.httpClient.get(`${this.apiBaseUrl}/places/${place_id}`); + getPlaceGPX(placeId: number): Observable { + return this.httpClient.get(`${this.apiBaseUrl}/places/${placeId}`); } getTrips(): Observable { @@ -123,97 +124,97 @@ export class ApiService { return this.httpClient.post(`${this.apiBaseUrl}/trips`, trip); } - deleteTrip(trip_id: number): Observable { - return this.httpClient.delete(`${this.apiBaseUrl}/trips/${trip_id}`); + deleteTrip(tripId: number): Observable { + return this.httpClient.delete(`${this.apiBaseUrl}/trips/${tripId}`); } - putTrip(trip: Partial, trip_id: number): Observable { - return this.httpClient.put(`${this.apiBaseUrl}/trips/${trip_id}`, trip); + putTrip(trip: Partial, tripId: number): Observable { + return this.httpClient.put(`${this.apiBaseUrl}/trips/${tripId}`, trip); } - postTripDay(tripDay: TripDay, trip_id: number): Observable { - return this.httpClient.post(`${this.apiBaseUrl}/trips/${trip_id}/days`, tripDay); + postTripDay(tripDay: TripDay, tripId: number): Observable { + return this.httpClient.post(`${this.apiBaseUrl}/trips/${tripId}/days`, tripDay); } - putTripDay(tripDay: Partial, trip_id: number): Observable { - return this.httpClient.put(`${this.apiBaseUrl}/trips/${trip_id}/days/${tripDay.id}`, tripDay); + putTripDay(tripDay: Partial, tripId: number): Observable { + return this.httpClient.put(`${this.apiBaseUrl}/trips/${tripId}/days/${tripDay.id}`, tripDay); } - deleteTripDay(trip_id: number, day_id: number): Observable { - return this.httpClient.delete(`${this.apiBaseUrl}/trips/${trip_id}/days/${day_id}`); + deleteTripDay(tripId: number, day_id: number): Observable { + return this.httpClient.delete(`${this.apiBaseUrl}/trips/${tripId}/days/${day_id}`); } - postTripDayItem(item: TripItem, trip_id: number, day_id: number): Observable { - return this.httpClient.post(`${this.apiBaseUrl}/trips/${trip_id}/days/${day_id}/items`, item); + postTripDayItem(item: TripItem, tripId: number, day_id: number): Observable { + return this.httpClient.post(`${this.apiBaseUrl}/trips/${tripId}/days/${day_id}/items`, item); } - putTripDayItem(item: Partial, trip_id: number, day_id: number, item_id: number): Observable { - return this.httpClient.put(`${this.apiBaseUrl}/trips/${trip_id}/days/${day_id}/items/${item_id}`, item); + putTripDayItem(item: Partial, tripId: number, day_id: number, item_id: number): Observable { + return this.httpClient.put(`${this.apiBaseUrl}/trips/${tripId}/days/${day_id}/items/${item_id}`, item); } - deleteTripDayItem(trip_id: number, day_id: number, item_id: number): Observable { - return this.httpClient.delete(`${this.apiBaseUrl}/trips/${trip_id}/days/${day_id}/items/${item_id}`); + deleteTripDayItem(tripId: number, day_id: number, item_id: number): Observable { + return this.httpClient.delete(`${this.apiBaseUrl}/trips/${tripId}/days/${day_id}/items/${item_id}`); } getSharedTrip(token: string): Observable { return this.httpClient.get(`${this.apiBaseUrl}/trips/shared/${token}`, { headers: NO_AUTH_HEADER }); } - getSharedTripURL(trip_id: number): Observable { - return this.httpClient.get(`${this.apiBaseUrl}/trips/${trip_id}/share`).pipe( + getSharedTripURL(tripId: number): Observable { + return this.httpClient.get(`${this.apiBaseUrl}/trips/${tripId}/share`).pipe( map((t) => window.location.origin + t.url), shareReplay(), ); } - createSharedTrip(trip_id: number): Observable { + createSharedTrip(tripId: number): Observable { return this.httpClient - .post(`${this.apiBaseUrl}/trips/${trip_id}/share`, {}) + .post(`${this.apiBaseUrl}/trips/${tripId}/share`, {}) .pipe(map((t) => window.location.origin + t.url)); } - deleteSharedTrip(trip_id: number): Observable { - return this.httpClient.delete(`${this.apiBaseUrl}/trips/${trip_id}/share`); + deleteSharedTrip(tripId: number): Observable { + return this.httpClient.delete(`${this.apiBaseUrl}/trips/${tripId}/share`); } - getPackingList(trip_id: number): Observable { - return this.httpClient.get(`${this.apiBaseUrl}/trips/${trip_id}/packing`); + getPackingList(tripId: number): Observable { + return this.httpClient.get(`${this.apiBaseUrl}/trips/${tripId}/packing`); } getSharedTripPackingList(token: string): Observable { return this.httpClient.get(`${this.apiBaseUrl}/trips/shared/${token}/packing`); } - postPackingItem(trip_id: number, p_item: PackingItem): Observable { - return this.httpClient.post(`${this.apiBaseUrl}/trips/${trip_id}/packing`, p_item); + postPackingItem(tripId: number, p_item: PackingItem): Observable { + return this.httpClient.post(`${this.apiBaseUrl}/trips/${tripId}/packing`, p_item); } - putPackingItem(trip_id: number, p_id: number, p_item: Partial): Observable { - return this.httpClient.put(`${this.apiBaseUrl}/trips/${trip_id}/packing/${p_id}`, p_item); + putPackingItem(tripId: number, p_id: number, p_item: Partial): Observable { + return this.httpClient.put(`${this.apiBaseUrl}/trips/${tripId}/packing/${p_id}`, p_item); } - deletePackingItem(trip_id: number, p_id: number): Observable { - return this.httpClient.delete(`${this.apiBaseUrl}/trips/${trip_id}/packing/${p_id}`); + deletePackingItem(tripId: number, p_id: number): Observable { + return this.httpClient.delete(`${this.apiBaseUrl}/trips/${tripId}/packing/${p_id}`); } - getChecklist(trip_id: number): Observable { - return this.httpClient.get(`${this.apiBaseUrl}/trips/${trip_id}/checklist`); + getChecklist(tripId: number): Observable { + return this.httpClient.get(`${this.apiBaseUrl}/trips/${tripId}/checklist`); } getSharedTripChecklist(token: string): Observable { return this.httpClient.get(`${this.apiBaseUrl}/trips/shared/${token}/checklist`); } - postChecklistItem(trip_id: number, item: ChecklistItem): Observable { - return this.httpClient.post(`${this.apiBaseUrl}/trips/${trip_id}/checklist`, item); + postChecklistItem(tripId: number, item: ChecklistItem): Observable { + return this.httpClient.post(`${this.apiBaseUrl}/trips/${tripId}/checklist`, item); } - putChecklistItem(trip_id: number, id: number, item: Partial): Observable { - return this.httpClient.put(`${this.apiBaseUrl}/trips/${trip_id}/checklist/${id}`, item); + putChecklistItem(tripId: number, id: number, item: Partial): Observable { + return this.httpClient.put(`${this.apiBaseUrl}/trips/${tripId}/checklist/${id}`, item); } - deleteChecklistItem(trip_id: number, id: number): Observable { - return this.httpClient.delete(`${this.apiBaseUrl}/trips/${trip_id}/checklist/${id}`); + deleteChecklistItem(tripId: number, id: number): Observable { + return this.httpClient.delete(`${this.apiBaseUrl}/trips/${tripId}/checklist/${id}`); } getHasTripsInvitations(): Observable { @@ -224,24 +225,24 @@ export class ApiService { return this.httpClient.get(`${this.apiBaseUrl}/trips/invitations`); } - getTripMembers(trip_id: number): Observable { - return this.httpClient.get(`${this.apiBaseUrl}/trips/${trip_id}/members`); + getTripMembers(tripId: number): Observable { + return this.httpClient.get(`${this.apiBaseUrl}/trips/${tripId}/members`); } - deleteTripMember(trip_id: number, username: string): Observable { - return this.httpClient.delete(`${this.apiBaseUrl}/trips/${trip_id}/members/${username}`); + deleteTripMember(tripId: number, username: string): Observable { + return this.httpClient.delete(`${this.apiBaseUrl}/trips/${tripId}/members/${username}`); } - inviteTripMember(trip_id: number, user: string): Observable { - return this.httpClient.post(`${this.apiBaseUrl}/trips/${trip_id}/members`, { user }); + inviteTripMember(tripId: number, user: string): Observable { + return this.httpClient.post(`${this.apiBaseUrl}/trips/${tripId}/members`, { user }); } - acceptTripMemberInvite(trip_id: number): Observable { - return this.httpClient.post(`${this.apiBaseUrl}/trips/${trip_id}/members/accept`, {}); + acceptTripMemberInvite(tripId: number): Observable { + return this.httpClient.post(`${this.apiBaseUrl}/trips/${tripId}/members/accept`, {}); } - declineTripMemberInvite(trip_id: number): Observable { - return this.httpClient.post(`${this.apiBaseUrl}/trips/${trip_id}/members/decline`, {}); + declineTripMemberInvite(tripId: number): Observable { + return this.httpClient.post(`${this.apiBaseUrl}/trips/${tripId}/members/decline`, {}); } checkVersion(): Observable { @@ -264,25 +265,48 @@ export class ApiService { .pipe(tap((settings) => this.settingsSubject.next(settings))); } - settingsUserExport(): Observable { - return this.httpClient.get(`${this.apiBaseUrl}/settings/export`); + settingsUserImport(formdata: FormData): Observable { + return this.httpClient.post(`${this.apiBaseUrl}/settings/import`, formdata).pipe( + tap((resp) => { + if (resp.categories) { + this._categoriesSubjectNext(resp.categories); + } + if (resp.settings) { + this.settingsSubject.next(resp.settings); + } + }), + ); } - settingsUserImport(formdata: FormData): Observable { - const headers = { enctype: 'multipart/form-data' }; - return this.httpClient - .post(`${this.apiBaseUrl}/settings/import`, formdata, { - headers: headers, - }) - .pipe( - tap((resp) => { - if (resp.categories) { - this._categoriesSubjectNext(resp.categories); - } - if (resp.settings) { - this.settingsSubject.next(resp.settings); - } - }), - ); + postTripAttachment(tripId: number, formdata: FormData): Observable { + return this.httpClient.post(`${this.apiBaseUrl}/trips/${tripId}/attachments`, formdata); + } + + deleteTripAttachment(tripId: number, attachmentId: number): Observable { + return this.httpClient.delete(`${this.apiBaseUrl}/trips/${tripId}/attachments/${attachmentId}`); + } + + downloadTripAttachment(tripId: number, attachmentId: number): Observable { + return this.httpClient.get(`${this.apiBaseUrl}/trips/${tripId}/attachments/${attachmentId}/download`, { + responseType: 'blob', + }); + } + + getBackups(): Observable { + return this.httpClient.get(`${this.apiBaseUrl}/settings/backups`); + } + + createBackup(): Observable { + return this.httpClient.post(`${this.apiBaseUrl}/settings/backups`, {}); + } + + deleteBackup(backupId: number): Observable { + return this.httpClient.delete(`${this.apiBaseUrl}/settings/backups/${backupId}`); + } + + downloadBackup(backupId: number): Observable { + return this.httpClient.get(`${this.apiBaseUrl}/settings/backups/${backupId}/download`, { + responseType: 'blob', + }); } }