Overview

Feedback Service is a low-frequency Kotlin REST reference service. It accepts bearer user JWTs and returns the project-standard ApiResponse envelope.

User Feedback

POST /api/feedback

POST /api/feedback HTTP/1.1
Authorization: Bearer user-token
Content-Type: application/json
Content-Length: 134
Host: localhost:8080

{"category":"BUG","title":"Checkout button fails","body":"The button does nothing on Safari.","pageUrl":"https://www.ufotec.com/cart"}
HTTP/1.1 201 Created
X-Request-Id: 8fc525a1-3c68-49a2-ad87-9e0f75042b3f
Content-Type: application/json
Content-Length: 374
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-XSS-Protection: 0

{"success":true,"code":"00000","message":"Success","data":{"feedbackId":"d773031d-c40a-4bc1-924f-dba39a3c0af2","accountId":"user-1","category":"BUG","title":"Checkout button fails","body":"The button does nothing on Safari.","pageUrl":"https://www.ufotec.com/cart","status":"OPEN","createdAt":1783107230933,"updatedAt":1783107230933},"errors":null,"timestamp":1783107230936}

GET /api/feedback

GET /api/feedback?limit=20 HTTP/1.1
Authorization: Bearer user-token
Host: localhost:8080
HTTP/1.1 200 OK
X-Request-Id: 210f9cd3-787a-4d1a-b1e4-62b7c5e11e91
Content-Type: application/json
Content-Length: 368
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-XSS-Protection: 0

{"success":true,"code":"00000","message":"Success","data":{"items":[{"feedbackId":"feedback-1","accountId":"user-1","category":"BUG","title":"Checkout button fails","body":"The button does nothing on Safari.","pageUrl":"https://www.ufotec.com/cart","status":"OPEN","createdAt":2000,"updatedAt":2000}],"nextCursor":"feedback-1"},"errors":null,"timestamp":1783107230349}

GET /api/feedback/{feedbackId}

GET /api/feedback/feedback-1 HTTP/1.1
Authorization: Bearer user-token
Host: localhost:8080
HTTP/1.1 200 OK
X-Request-Id: 5ac04f0a-b32a-4212-b79c-734ca947f625
Content-Type: application/json
Content-Length: 330
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-XSS-Protection: 0

{"success":true,"code":"00000","message":"Success","data":{"feedbackId":"feedback-1","accountId":"user-1","category":"BUG","title":"Checkout button fails","body":"The button does nothing on Safari.","pageUrl":"https://www.ufotec.com/cart","status":"OPEN","createdAt":2000,"updatedAt":2000},"errors":null,"timestamp":1783107230697}

Admin Feedback

GET /api/admin/feedback

Supports optional category, status, and q query parameters for low-frequency review filtering.

GET /api/admin/feedback?category=BUG&status=OPEN&q=Safari HTTP/1.1
Authorization: Bearer admin-token
Host: localhost:8080
HTTP/1.1 200 OK
X-Request-Id: 2e4f12c6-90a5-4c31-abbf-a61834e69453
Content-Type: application/json
Content-Length: 604
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-XSS-Protection: 0

{"success":true,"code":"00000","message":"Success","data":{"items":[{"feedbackId":"feedback-1","accountId":"user-1","category":"BUG","title":"Checkout button fails","body":"The button does nothing on Safari.","pageUrl":"https://www.ufotec.com/cart","status":"OPEN","createdAt":2000,"updatedAt":2000},{"feedbackId":"feedback-2","accountId":"other-user","category":"BUG","title":"Checkout button fails","body":"The button does nothing on Safari.","pageUrl":"https://www.ufotec.com/cart","status":"OPEN","createdAt":1000,"updatedAt":1000}],"nextCursor":"feedback-2"},"errors":null,"timestamp":1783107231315}

GET /api/admin/feedback/{feedbackId}

GET /api/admin/feedback/feedback-2 HTTP/1.1
Authorization: Bearer admin-token
Host: localhost:8080
HTTP/1.1 200 OK
X-Request-Id: 1983023d-642f-4cd5-a827-fd6e5a2e2e74
Content-Type: application/json
Content-Length: 334
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-XSS-Protection: 0

{"success":true,"code":"00000","message":"Success","data":{"feedbackId":"feedback-2","accountId":"other-user","category":"BUG","title":"Checkout button fails","body":"The button does nothing on Safari.","pageUrl":"https://www.ufotec.com/cart","status":"OPEN","createdAt":1000,"updatedAt":1000},"errors":null,"timestamp":1783107231010}

PATCH /api/admin/feedback/{feedbackId}/status

PATCH /api/admin/feedback/feedback-1/status HTTP/1.1
Authorization: Bearer admin-token
Content-Type: application/json
Content-Length: 25
Host: localhost:8080

{"status":"ACKNOWLEDGED"}
HTTP/1.1 200 OK
X-Request-Id: 7073c370-f4f3-498e-ac1c-a01e2c4cc949
Content-Type: application/json
Content-Length: 347
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-XSS-Protection: 0

{"success":true,"code":"00000","message":"Success","data":{"feedbackId":"feedback-1","accountId":"user-1","category":"BUG","title":"Checkout button fails","body":"The button does nothing on Safari.","pageUrl":"https://www.ufotec.com/cart","status":"ACKNOWLEDGED","createdAt":2000,"updatedAt":1783107230835},"errors":null,"timestamp":1783107230835}

POST /api/admin/feedback/{feedbackId}/notes

POST /api/admin/feedback/feedback-1/notes HTTP/1.1
Authorization: Bearer admin-token
Content-Type: application/json
Content-Length: 58
Host: localhost:8080

{"body":"Reproduced on Safari, waiting for frontend fix."}
HTTP/1.1 200 OK
X-Request-Id: ae8ba568-11e8-4d9f-8aa4-d7b6c3df9b23
Content-Type: application/json
Content-Length: 284
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-XSS-Protection: 0

{"success":true,"code":"00000","message":"Success","data":{"noteId":"35e9ea7c-7fcb-496b-a54c-b7063cd21ea6","feedbackId":"feedback-1","adminAccountId":"admin-1","body":"Reproduced on Safari, waiting for frontend fix.","createdAt":1783107231283},"errors":null,"timestamp":1783107231283}

GET /api/admin/feedback/{feedbackId}/notes

GET /api/admin/feedback/feedback-1/notes HTTP/1.1
Authorization: Bearer admin-token
Host: localhost:8080
HTTP/1.1 200 OK
X-Request-Id: 13743d5f-07dd-481e-a7dc-1a8ac6207983
Content-Type: application/json
Content-Length: 231
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-XSS-Protection: 0

{"success":true,"code":"00000","message":"Success","data":{"items":[{"noteId":"note-1","feedbackId":"feedback-1","adminAccountId":"admin-1","body":"Reproduced on Safari.","createdAt":3000}]},"errors":null,"timestamp":1783107231206}