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: 0b23f36c-7459-4caf-873a-68c7a833667b
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":"93e894d5-6cd3-4f78-b182-3f3372c46545","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":1780082504383,"updatedAt":1780082504383},"errors":null,"timestamp":1780082504383}

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: 6303265e-bac2-498d-836b-58fb06b2c230
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":1780082503614}

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: aca2e872-6f85-43b3-b526-2c0bbadedc38
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":1780082504052}

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: eed1c4f8-27ac-4269-9612-b17b5272afc5
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":1780082504739}

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: 3fbb5c08-afe8-4c97-b7ca-dce7354c54e2
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":1780082504471}

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: 1a5f3cd7-73a7-439f-9d30-4ddc8fdc9eee
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":1780082504268},"errors":null,"timestamp":1780082504268}

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: c1f966d2-320c-4e31-a818-37fda61a8127
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":"bf2937e7-b541-46dd-a5e5-98709785b326","feedbackId":"feedback-1","adminAccountId":"admin-1","body":"Reproduced on Safari, waiting for frontend fix.","createdAt":1780082504695},"errors":null,"timestamp":1780082504695}

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: 68b19f64-7717-481a-a645-a64366faca82
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":1780082504605}