1380848aea
- DB migration 0012: add photo_key and photo_uploaded_at columns to pets table - S3 client utility (apps/api/src/lib/s3.ts): presigned PUT/GET, delete via Rook-Ceph RGW - API photo routes on petsRouter: - POST /:petId/photo/upload-url — returns presigned PUT URL + object key - POST /:petId/photo/confirm — records key in DB after successful upload - DELETE /:petId/photo — deletes from storage and clears DB - GET /:petId/photo — returns presigned GET URL - RBAC: all staff roles (manager, receptionist, groomer) may upload/delete photos; restructured index.ts guards so groomer-accessible photo paths don't overlap with the manager/receptionist-only general pets write guard - Frontend PetPhotoDisplay: responsive image with shimmer skeleton and paw placeholder - Frontend PetPhotoUpload: client-side resize to max 1200px, XHR with progress, presigned PUT flow — binary data never passes through the API server - Wired both components into Clients.tsx staff portal pet cards - Unit tests: 14 test cases covering all four routes (happy path + error cases) Co-Authored-By: Paperclip <noreply@paperclip.ing>
40 lines
1012 B
JSON
40 lines
1012 B
JSON
{
|
|
"name": "@groombook/api",
|
|
"version": "0.0.1",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "tsx watch src/index.ts",
|
|
"build": "tsc",
|
|
"start": "node dist/index.js",
|
|
"lint": "eslint src --ext .ts",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "vitest run"
|
|
},
|
|
"dependencies": {
|
|
"@groombook/db": "workspace:*",
|
|
"@groombook/types": "workspace:*",
|
|
"@hono/node-server": "^1.13.7",
|
|
"@hono/zod-validator": "^0.4.3",
|
|
"hono": "^4.6.17",
|
|
"jose": "^5.9.6",
|
|
"node-cron": "^3.0.3",
|
|
"nodemailer": "^6.9.16",
|
|
"openid-client": "^6.1.7",
|
|
"zod": "^3.24.1",
|
|
"@aws-sdk/client-s3": "^3.800.0",
|
|
"@aws-sdk/s3-request-presigner": "^3.800.0"
|
|
},
|
|
"devDependencies": {
|
|
"@types/node": "^22.10.7",
|
|
"@types/node-cron": "^3.0.11",
|
|
"@types/nodemailer": "^6.4.17",
|
|
"@vitest/coverage-v8": "^3.0.4",
|
|
"eslint": "^9.18.0",
|
|
"tsx": "^4.19.2",
|
|
"typescript": "^5.7.3",
|
|
"typescript-eslint": "^8.20.0",
|
|
"vitest": "^3.0.4"
|
|
}
|
|
}
|