# Place Suggestion for Staff ## Place Suggestion ### Collection path `"/placeSuggestions/"` ### Schema ```typescript export interface PlaceSuggestionSchema { id: string; createdAt: Timestamp; updatedAt: Timestamp; /** This is from Google Maps API. Each of the google's place will have a unique id. */ placeId: string; status: PlaceSuggestionStatus; driverAuthInfo: DriverAuthInfo; driver: DriverSnapshotSchema | null; position: PositionSchema; name: string; address: string | null; categoryList: PlaceCategoryType[]; imageUrlList: string[]; phoneNumber: string | null; note: string | null; originalPlace: OriginalPlaceSchema; /** Reviewer */ staffAuthInfo: StaffAuthInfo | null; staff: StaffSnapshotSchema | null; // == Update by reviewer staffComment: string | null; priority: PlaceSuggestionPriority | null; hasSynced: boolean; } export interface OriginalPlaceSchema { name: string | null; address: string | null; } export const placeSuggestionStatusList = [ 'waitingForApproval', 'approved', 'rejected', ] as const; export type PlaceSuggestionStatus = (typeof placeSuggestionStatusList)[number]; export const placeCategoryTypeList = [ 'house', 'hotel', 'restaurant', 'company', 'entertainment', 'office', 'other', ] as const; export type PlaceCategoryType = (typeof placeCategoryTypeList)[number]; export const placeSuggestionPriorityList = ['high', 'medium', 'low'] as const; export type PlaceSuggestionPriority = (typeof placeSuggestionPriorityList)[number]; ``` ### Review place suggestion #### Curl ```json curl --location --request PATCH 'http://localhost:5001/hybrid-dbs-stag/asia-southeast1/api/v1/place-suggestions/ea850a87-3c34-4eaf-908d-88de3574ad37/review' \ --header 'x-auth-role: staff' \ --header 'Authorization: Bearer eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJyb2xlTGlzdCI6WyJzdGFmZiJdLCJlbWFpbCI6InRlc3RAc3RhZmYuY29tIiwiZW1haWxfdmVyaWZpZWQiOmZhbHNlLCJhdXRoX3RpbWUiOjE2ODA3NjkwOTIsInVzZXJfaWQiOiJ0ZXN0QHN0YWZmLmNvbSIsImZpcmViYXNlIjp7ImlkZW50aXRpZXMiOnsiZW1haWwiOlsidGVzdEBzdGFmZi5jb20iXX0sInNpZ25faW5fcHJvdmlkZXIiOiJwYXNzd29yZCJ9LCJpYXQiOjE2ODA3NjkwOTIsImV4cCI6MTY4MDc3MjY5MiwiYXVkIjoiaHlicmlkLWRicy1zdGFnIiwiaXNzIjoiaHR0cHM6Ly9zZWN1cmV0b2tlbi5nb29nbGUuY29tL2h5YnJpZC1kYnMtc3RhZyIsInN1YiI6InRlc3RAc3RhZmYuY29tIn0.' \ --header 'Content-Type: application/json' \ --data '{ "status": "rejected", "position": { "latitude": 10.217050383048822, "longitude": 103.96465761394057 }, "name": "Quang HD", "address": "1234 Ngô Quyền", "categoryList": [ "hotel", "restaurant" ], "phoneNumber": null, "note": null, "staffComment": "Chưa tốt lắm", "priority": "medium" }' ``` #### Validator ```typescript export class ReviewPlaceSuggestionDto { status: PlaceSuggestionStatus; position: PositionDto; name: string; address: string | null; categoryList: PlaceCategoryType[]; phoneNumber: string | null; note: string | null; staffComment: string | null; priority: PlaceSuggestionPriority | null; } ``` #### Note This endpoint will throw if: - Try to approve if there has been at least 1 suggestion that has the same `placeId` that has been approved. - Try to un-approve an approved suggestion (`oldStatus === 'approved' && newStatus !== 'approved'`) ## Settings Add a new field `placeSuggestionRewardAmount: number;` for both the SettingsSchema & the update-settings endpoint.