Repository: PitiNarak/condormhub-backend
Pull request #74: Feat/student evidence
Author: login: inecrft
Created: 2025-03-21T11:29:38Z | Merged: 2025-03-23T02:40:13Z

## Description
Implement student evidence post and get endpoint

## Type of Change
New Feature

## Checklist
- [x] run `golangci-lint`
- [x] No new warnings
- [x] Self-review completed
- [x] Documentation updated (update and generate swagger)

## Notes
Made this for conversation between yoke and keen about this endpoint not existing. Have not created other endpoint related to this task, like approving/rejecting evidence yet, because I believe that is part of Admin System which is not in this sprint.



Diff:
diff --git a/docs/docs.go b/docs/docs.go
index 212b0920..45ca2a8f 100644
--- a/docs/docs.go
+++ b/docs/docs.go
@@ -6,10 +6,10 @@ import "github.com/swaggo/swag/v2"
 
 const docTemplate = `{
     "schemes": {{ marshal .Schemes }},
-    "components": {"schemas":{"dto.Address":{"properties":{"district":{"type":"string"},"province":{"type":"string"},"subdistrict":{"type":"string"},"zipcode":{"type":"string"}},"type":"object"},"dto.CreateTransactionResponseBody":{"properties":{"checkoutUrl":{"type":"string"}},"type":"object"},"dto.DormCreateRequestBody":{"properties":{"address":{"properties":{"district":{"type":"string"},"province":{"type":"string"},"subdistrict":{"type":"string"},"zipcode":{"type":"string"}},"required":["district","province","subdistrict","zipcode"],"type":"object"},"bathrooms":{"minimum":0,"type":"integer"},"bedrooms":{"minimum":0,"type":"integer"},"description":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"size":{"type":"number"}},"required":["address","bathrooms","bedrooms","name","price","size"],"type":"object"},"dto.DormImageUploadResponseBody":{"properties":{"url":{"type":"string"}},"type":"object"},"dto.DormResponseBody":{"properties":{"address":{"$ref":"#/components/schemas/dto.Address"},"bathrooms":{"type":"integer"},"bedrooms":{"type":"integer"},"createAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"imagesUrl":{"items":{"type":"string"},"type":"array","uniqueItems":false},"name":{"type":"string"},"owner":{"$ref":"#/components/schemas/dto.UserResponse"},"price":{"type":"number"},"rating":{"type":"number"},"size":{"type":"number"},"updateAt":{"type":"string"}},"type":"object"},"dto.DormUpdateRequestBody":{"properties":{"address":{"$ref":"#/components/schemas/dto.Address"},"bathrooms":{"minimum":0,"type":"integer"},"bedrooms":{"minimum":0,"type":"integer"},"description":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"size":{"type":"number"}},"type":"object"},"dto.ErrorResponse":{"properties":{"error":{"type":"string"}},"type":"object"},"dto.LeasingHistory":{"properties":{"dorm":{"$ref":"#/components/schemas/dto.DormResponseBody"},"end":{"type":"string"},"id":{"type":"string"},"lessee":{"$ref":"#/components/schemas/dto.UserResponse"},"orders":{"items":{"$ref":"#/components/schemas/dto.OrderResponseBody"},"type":"array","uniqueItems":false},"price":{"type":"number"},"start":{"type":"string"}},"type":"object"},"dto.LeasingRequest":{"properties":{"dorm":{"$ref":"#/components/schemas/dto.DormResponseBody"},"end":{"type":"string"},"id":{"type":"string"},"lessee":{"$ref":"#/components/schemas/dto.UserResponse"},"start":{"type":"string"},"status":{"$ref":"#/components/schemas/dto.Status"}},"type":"object"},"dto.LoginRequestBody":{"properties":{"email":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"type":"object"},"dto.OrderRequestBody":{"properties":{"leasingHistoryId":{"type":"string"}},"required":["leasingHistoryId"],"type":"object"},"dto.OrderResponseBody":{"properties":{"id":{"type":"string"},"paidTransaction":{"$ref":"#/components/schemas/dto.TransactionResponse"},"price":{"type":"integer"},"type":{"type":"string"}},"type":"object"},"dto.OwnershipProofResponseBody":{"properties":{"adminId":{"type":"string"},"dormId":{"type":"string"},"status":{"$ref":"#/components/schemas/dto.OwnershipProofStatus"},"url":{"type":"string"}},"type":"object"},"dto.OwnershipProofStatus":{"type":"string","x-enum-varnames":["Pending","Approved","Rejected"]},"dto.Pagination":{"properties":{"current_page":{"type":"integer"},"last_page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"}},"type":"object"},"dto.PaginationResponse-dto_DormResponseBody":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.DormResponseBody"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.PaginationResponse-dto_LeasingHistory":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.LeasingHistory"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.PaginationResponse-dto_LeasingRequest":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.LeasingRequest"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.PaginationResponse-dto_OrderResponseBody":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.OrderResponseBody"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.RefreshTokenRequestBody":{"properties":{"refreshToken":{"type":"string"}},"required":["refreshToken"],"type":"object"},"dto.RegisterRequestBody":{"properties":{"email":{"type":"string"},"password":{"type":"string"},"username":{"type":"string"}},"required":["email","password","username"],"type":"object"},"dto.ResetPasswordCreateRequestBody":{"properties":{"email":{"type":"string"}},"required":["email"],"type":"object"},"dto.ResetPasswordRequestBody":{"properties":{"password":{"type":"string"},"token":{"type":"string"}},"required":["password","token"],"type":"object"},"dto.Status":{"type":"string","x-enum-varnames":["RequestPending","RequestAccepted","RequestRejected","RequestCanceled"]},"dto.SuccessResponse-dto_CreateTransactionResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.CreateTransactionResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_DormImageUploadResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.DormImageUploadResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_DormResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.DormResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_LeasingHistory":{"properties":{"data":{"$ref":"#/components/schemas/dto.LeasingHistory"}},"type":"object"},"dto.SuccessResponse-dto_LeasingRequest":{"properties":{"data":{"$ref":"#/components/schemas/dto.LeasingRequest"}},"type":"object"},"dto.SuccessResponse-dto_OrderResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.OrderResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_OwnershipProofResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.OwnershipProofResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_TokenResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.TokenResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_TokenWithUserInformationResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.TokenWithUserInformationResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_UserResponse":{"properties":{"data":{"$ref":"#/components/schemas/dto.UserResponse"}},"type":"object"},"dto.TokenResponseBody":{"properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"}},"type":"object"},"dto.TokenWithUserInformationResponseBody":{"properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"userInformation":{"$ref":"#/components/schemas/dto.UserResponse"}},"type":"object"},"dto.TransactionRequestBody":{"properties":{"orderID":{"type":"string"}},"type":"object"},"dto.TransactionResponse":{"properties":{"createAt":{"type":"string"},"id":{"type":"string"},"price":{"type":"integer"},"status":{"type":"string"},"updateAt":{"type":"string"}},"type":"object"},"dto.UserInformationRequestBody":{"properties":{"birthDate":{"type":"string"},"firstname":{"minLength":2,"type":"string"},"gender":{"type":"string"},"lastname":{"minLength":2,"type":"string"},"lifestyles":{"items":{"type":"string"},"type":"array","uniqueItems":false},"nationalID":{"type":"string"},"password":{"minLength":8,"type":"string"},"phoneNumber":{"type":"string"},"studentEvidence":{"type":"string"},"username":{"minLength":2,"type":"string"}},"type":"object"},"dto.UserResponse":{"properties":{"birthDate":{"type":"string"},"email":{"type":"string"},"filledPersonalInfo":{"type":"boolean"},"firstname":{"type":"string"},"gender":{"type":"string"},"id":{"type":"string"},"isStudentVerified":{"type":"boolean"},"isVerified":{"type":"boolean"},"lastname":{"type":"string"},"lifestyles":{"items":{"type":"string"},"type":"array","uniqueItems":false},"phoneNumber":{"type":"string"},"role":{"type":"string"},"studentEvidence":{"type":"string"},"username":{"type":"string"}},"type":"object"},"dto.VerifyRequestBody":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"}},"securitySchemes":{"Bearer":{"description":"Bearer token authentication","in":"header","name":"Authorization","type":"apiKey"}}},
+    "components": {"schemas":{"dto.Address":{"properties":{"district":{"type":"string"},"province":{"type":"string"},"subdistrict":{"type":"string"},"zipcode":{"type":"string"}},"type":"object"},"dto.CreateTransactionResponseBody":{"properties":{"checkoutUrl":{"type":"string"}},"type":"object"},"dto.DormCreateRequestBody":{"properties":{"address":{"properties":{"district":{"type":"string"},"province":{"type":"string"},"subdistrict":{"type":"string"},"zipcode":{"type":"string"}},"required":["district","province","subdistrict","zipcode"],"type":"object"},"bathrooms":{"minimum":0,"type":"integer"},"bedrooms":{"minimum":0,"type":"integer"},"description":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"size":{"type":"number"}},"required":["address","bathrooms","bedrooms","name","price","size"],"type":"object"},"dto.DormImageUploadResponseBody":{"properties":{"url":{"type":"string"}},"type":"object"},"dto.DormResponseBody":{"properties":{"address":{"$ref":"#/components/schemas/dto.Address"},"bathrooms":{"type":"integer"},"bedrooms":{"type":"integer"},"createAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"imagesUrl":{"items":{"type":"string"},"type":"array","uniqueItems":false},"name":{"type":"string"},"owner":{"$ref":"#/components/schemas/dto.UserResponse"},"price":{"type":"number"},"rating":{"type":"number"},"size":{"type":"number"},"updateAt":{"type":"string"}},"type":"object"},"dto.DormUpdateRequestBody":{"properties":{"address":{"$ref":"#/components/schemas/dto.Address"},"bathrooms":{"minimum":0,"type":"integer"},"bedrooms":{"minimum":0,"type":"integer"},"description":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"size":{"type":"number"}},"type":"object"},"dto.ErrorResponse":{"properties":{"error":{"type":"string"}},"type":"object"},"dto.LeasingHistory":{"properties":{"dorm":{"$ref":"#/components/schemas/dto.DormResponseBody"},"end":{"type":"string"},"id":{"type":"string"},"lessee":{"$ref":"#/components/schemas/dto.UserResponse"},"orders":{"items":{"$ref":"#/components/schemas/dto.OrderResponseBody"},"type":"array","uniqueItems":false},"price":{"type":"number"},"start":{"type":"string"}},"type":"object"},"dto.LeasingRequest":{"properties":{"dorm":{"$ref":"#/components/schemas/dto.DormResponseBody"},"end":{"type":"string"},"id":{"type":"string"},"lessee":{"$ref":"#/components/schemas/dto.UserResponse"},"start":{"type":"string"},"status":{"$ref":"#/components/schemas/dto.Status"}},"type":"object"},"dto.LoginRequestBody":{"properties":{"email":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"type":"object"},"dto.OrderRequestBody":{"properties":{"leasingHistoryId":{"type":"string"}},"required":["leasingHistoryId"],"type":"object"},"dto.OrderResponseBody":{"properties":{"id":{"type":"string"},"paidTransaction":{"$ref":"#/components/schemas/dto.TransactionResponse"},"price":{"type":"integer"},"type":{"type":"string"}},"type":"object"},"dto.OwnershipProofResponseBody":{"properties":{"adminId":{"type":"string"},"dormId":{"type":"string"},"status":{"$ref":"#/components/schemas/dto.OwnershipProofStatus"},"url":{"type":"string"}},"type":"object"},"dto.OwnershipProofStatus":{"type":"string","x-enum-varnames":["Pending","Approved","Rejected"]},"dto.Pagination":{"properties":{"current_page":{"type":"integer"},"last_page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"}},"type":"object"},"dto.PaginationResponse-dto_DormResponseBody":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.DormResponseBody"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.PaginationResponse-dto_LeasingHistory":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.LeasingHistory"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.PaginationResponse-dto_LeasingRequest":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.LeasingRequest"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.PaginationResponse-dto_OrderResponseBody":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.OrderResponseBody"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.RefreshTokenRequestBody":{"properties":{"refreshToken":{"type":"string"}},"required":["refreshToken"],"type":"object"},"dto.RegisterRequestBody":{"properties":{"email":{"type":"string"},"password":{"type":"string"},"username":{"type":"string"}},"required":["email","password","username"],"type":"object"},"dto.ResetPasswordCreateRequestBody":{"properties":{"email":{"type":"string"}},"required":["email"],"type":"object"},"dto.ResetPasswordRequestBody":{"properties":{"password":{"type":"string"},"token":{"type":"string"}},"required":["password","token"],"type":"object"},"dto.Status":{"type":"string","x-enum-varnames":["RequestPending","RequestAccepted","RequestRejected","RequestCanceled"]},"dto.StudentEvidenceUploadResponseBody":{"properties":{"expired":{"type":"string"},"url":{"type":"string"}},"type":"object"},"dto.SuccessResponse-dto_CreateTransactionResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.CreateTransactionResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_DormImageUploadResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.DormImageUploadResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_DormResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.DormResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_LeasingHistory":{"properties":{"data":{"$ref":"#/components/schemas/dto.LeasingHistory"}},"type":"object"},"dto.SuccessResponse-dto_LeasingRequest":{"properties":{"data":{"$ref":"#/components/schemas/dto.LeasingRequest"}},"type":"object"},"dto.SuccessResponse-dto_OrderResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.OrderResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_OwnershipProofResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.OwnershipProofResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_StudentEvidenceUploadResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.StudentEvidenceUploadResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_TokenResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.TokenResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_TokenWithUserInformationResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.TokenWithUserInformationResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_UserResponse":{"properties":{"data":{"$ref":"#/components/schemas/dto.UserResponse"}},"type":"object"},"dto.TokenResponseBody":{"properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"}},"type":"object"},"dto.TokenWithUserInformationResponseBody":{"properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"userInformation":{"$ref":"#/components/schemas/dto.UserResponse"}},"type":"object"},"dto.TransactionRequestBody":{"properties":{"orderID":{"type":"string"}},"type":"object"},"dto.TransactionResponse":{"properties":{"createAt":{"type":"string"},"id":{"type":"string"},"price":{"type":"integer"},"status":{"type":"string"},"updateAt":{"type":"string"}},"type":"object"},"dto.UserInformationRequestBody":{"properties":{"birthDate":{"type":"string"},"firstname":{"minLength":2,"type":"string"},"gender":{"type":"string"},"lastname":{"minLength":2,"type":"string"},"lifestyles":{"items":{"type":"string"},"type":"array","uniqueItems":false},"nationalID":{"type":"string"},"password":{"minLength":8,"type":"string"},"phoneNumber":{"type":"string"},"studentEvidence":{"type":"string"},"username":{"minLength":2,"type":"string"}},"type":"object"},"dto.UserResponse":{"properties":{"birthDate":{"type":"string"},"email":{"type":"string"},"filledPersonalInfo":{"type":"boolean"},"firstname":{"type":"string"},"gender":{"type":"string"},"id":{"type":"string"},"isStudentVerified":{"type":"boolean"},"isVerified":{"type":"boolean"},"lastname":{"type":"string"},"lifestyles":{"items":{"type":"string"},"type":"array","uniqueItems":false},"phoneNumber":{"type":"string"},"role":{"type":"string"},"username":{"type":"string"}},"type":"object"},"dto.VerifyRequestBody":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"}},"securitySchemes":{"Bearer":{"description":"Bearer token authentication","in":"header","name":"Authorization","type":"apiKey"}}},
     "info": {"description":"{{escape .Description}}","title":"{{.Title}}","version":"{{.Version}}"},
     "externalDocs": {"description":"","url":""},
-    "paths": {"/auth/login":{"post":{"description":"Login user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.LoginRequestBody"}}},"description":"user information","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"user successfully logged in"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"user not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot login user"}},"summary":"Login user","tags":["auth"]}},"/auth/refresh":{"post":{"description":"Refresh user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.RefreshTokenRequestBody"}}},"description":"user information","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenResponseBody"}}},"description":"user successfully Refresh in"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"user not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot refresh user"}},"summary":"Refresh user","tags":["auth"]}},"/auth/register":{"post":{"description":"Register new user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.RegisterRequestBody"}}},"description":"user information","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"user successfully registered"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot register user"}},"summary":"Register new user","tags":["auth"]}},"/dorms":{"get":{"description":"Retrieve a list of all dorms filtered by a search query. If no query is provided, all dorms are returned.","parameters":[{"description":"Search query","in":"query","name":"search","schema":{"type":"string"}},{"description":"Filter min price","in":"query","name":"minPrice","schema":{"type":"integer"}},{"description":"Filter max price","in":"query","name":"maxPrice","schema":{"type":"integer"}},{"description":"Filter district price","in":"query","name":"district","schema":{"type":"string"}},{"description":"Filter subdistrict price","in":"query","name":"subdistrict","schema":{"type":"string"}},{"description":"Filter province price","in":"query","name":"province","schema":{"type":"string"}},{"description":"Filter zipcode price","in":"query","name":"zipcode","schema":{"type":"string"}},{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_DormResponseBody"}}},"description":"All dorms retrieved successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to retrieve dorms"}},"summary":"Get all dorms by a search string","tags":["dorms"]},"post":{"description":"Add a new room to the database with the given details","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.DormCreateRequestBody"}}},"description":"Dorm information","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormResponseBody"}}},"description":"Dorm successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"You do not have permission to create a dorm"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to save dorm"}},"security":[{"Bearer":[]}],"summary":"Create a new dorm","tags":["dorms"]}},"/dorms/owner/{id}":{"get":{"description":"Retrieve all dorms of a specific owner ID","parameters":[{"description":"OwnerID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_DormResponseBody"}}},"description":"All dorms retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to retrieve dorms"}},"summary":"Get dorms by owner ID","tags":["dorms"]}},"/dorms/{id}":{"delete":{"description":"Removes a dorm from the database based on the give ID","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Dorm successfully deleted"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"You do not have permission to delete this dorm"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to delete dorm"}},"security":[{"Bearer":[]}],"summary":"Delete a dorm","tags":["dorms"]},"get":{"description":"Retrieve a specific dorm based on its ID","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormResponseBody"}}},"description":"Dorm data successfully retrieved"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to retrieve dorm"}},"summary":"Get a dorm by ID","tags":["dorms"]},"patch":{"description":"Modifies an existing room's details based on the given ID","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.DormUpdateRequestBody"}}},"description":"Updated Room Data","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormResponseBody"}}},"description":"Dorm data updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Invalid Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"unauthorized to update this dorm"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to update dorm"}},"security":[{"Bearer":[]}],"summary":"Update an existing dorm","tags":["dorms"]}},"/dorms/{id}/images":{"post":{"description":"Upload an image for a specific dorm by its ID, by attaching the image as a value for the key field name \"image\", as a multipart form-data","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"file"}}},"description":"DormImage","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormImageUploadResponseBody"}}},"description":"Successful image upload"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Invalid Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"unauthorized to upload image to dorm"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to upload dorm image"}},"security":[{"Bearer":[]}],"summary":"Upload an image for a dorm","tags":["dorms"]}},"/history/bydorm/{id}":{"get":{"description":"Retrieve a list of all leasing history by userid","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_LeasingHistory"}}},"description":"Retrive history successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format or limit parameter is incorrect or page parameter is incorrect or page exceeded"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID"}},"security":[{"Bearer":[]}],"summary":"Get all leasing history by userid","tags":["history"]}},"/history/me":{"get":{"description":"Retrieve a list of all leasing history by userid","parameters":[{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_LeasingHistory"}}},"description":"Retrive history successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format or limit parameter is incorrect or page parameter is incorrect or page exceeded"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"}},"security":[{"Bearer":[]}],"summary":"Get all leasing history by userid","tags":["history"]}},"/history/{id}":{"delete":{"description":"Delete a leasing history in the database","parameters":[{"description":"LeasingHistoryId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to delete leasing history"}},"security":[{"Bearer":[]}],"summary":"Delete a leasing history","tags":["history"]},"patch":{"description":"Delete a leasing history in the database","parameters":[{"description":"LeasingHistoryId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Set end timestamp successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing history"}},"security":[{"Bearer":[]}],"summary":"Delete a leasing history","tags":["history"]},"post":{"description":"Add a new leasing history to the database","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_LeasingHistory"}}},"description":"Dorm successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found or leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or failed to save leasing history to database"}},"security":[{"Bearer":[]}],"summary":"Create a new leasing history","tags":["history"]}},"/order":{"post":{"description":"Create an order","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.OrderRequestBody"}}},"description":"Order request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OrderResponseBody"}}},"description":"Order created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Create an order","tags":["order"]}},"/order/unpaid/me":{"get":{"description":"Get my unpaid orders by ID","parameters":[{"description":"Number of history to be retrieved","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page to retrieved","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_OrderResponseBody"}}},"description":"Unpaid orders retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Get my unpaid orders by ID","tags":["order"]}},"/order/unpaid/{userID}":{"get":{"description":"Get unpaid orders by User ID","parameters":[{"description":"User ID","in":"path","name":"userID","required":true,"schema":{"type":"string"}},{"description":"Number of history to be retrieved","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page to retrieved","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_OrderResponseBody"}}},"description":"Order retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Get unpaid orders by User ID","tags":["order"]}},"/order/{id}":{"get":{"description":"Get an order by ID","parameters":[{"description":"Order ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OrderResponseBody"}}},"description":"Order retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Get an order by ID","tags":["order"]}},"/ownership/{id}":{"delete":{"description":"Delete an ownership proof file","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Ownership proof successfully deleted"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to delete Ownership file"}},"security":[{"Bearer":[]}],"summary":"Delete ownership proof","tags":["ownership"]},"get":{"description":"Retrieve ownership proof for a specific dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Internal server error"}},"security":[{"Bearer":[]}],"summary":"Get ownership proof by Dorm ID","tags":["ownership"]}},"/ownership/{id}/approve":{"post":{"description":"Approve a submitted ownership proof for a dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof approved"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Internal server error"}},"security":[{"Bearer":[]}],"summary":"Approve ownership proof","tags":["ownership"]}},"/ownership/{id}/reject":{"post":{"description":"Reject a submitted ownership proof for a dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof rejected"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Internal server error"}},"security":[{"Bearer":[]}],"summary":"Reject ownership proof","tags":["ownership"]}},"/ownership/{id}/upload":{"post":{"description":"Upload a new file as ownership proof for a dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"file"}}},"description":"file","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownershop proof not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to upload file"}},"security":[{"Bearer":[]}],"summary":"Upload new ownership proof","tags":["ownership"]}},"/request/me":{"get":{"description":"Retrieve a list of all leasing request by userid","parameters":[{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_LeasingRequest"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format or limit parameter is incorrect or page parameter is incorrect"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"}},"security":[{"Bearer":[]}],"summary":"Get all leasing request by userid","tags":["request"]}},"/request/{id}":{"delete":{"description":"Delete a leasing request in the database","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized or only admin can delete a request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to delete leasing request"}},"security":[{"Bearer":[]}],"summary":"Delete a leasing request","tags":["request"]},"post":{"description":"Add a new leasing request to the database","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_LeasingRequest"}}},"description":"Dorm successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found or leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or failed to save leasing request to database"}},"security":[{"Bearer":[]}],"summary":"Create a new leasing request","tags":["request"]}},"/request/{id}/approve":{"patch":{"description":"Approve a leasing request","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized or only lessor can approve a request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found or request is not in the pending status"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing request"}},"security":[{"Bearer":[]}],"summary":"Approve a leasing request","tags":["request"]}},"/request/{id}/cancel":{"patch":{"description":"Cancel a leasing request","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found or request is not in the pending status"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing request"}},"security":[{"Bearer":[]}],"summary":"Cancel a leasing request","tags":["request"]}},"/request/{id}/reject":{"patch":{"description":"Reject a leasing request","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found or request is not in the pending status"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized or only lessor can reject a request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing request"}},"security":[{"Bearer":[]}],"summary":"Reject a leasing request","tags":["request"]}},"/transaction":{"post":{"description":"Create a transaction","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.TransactionRequestBody"}}},"description":"Transaction request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_CreateTransactionResponseBody"}}},"description":"Transaction created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Create a transaction","tags":["transaction"]}},"/user":{"patch":{"description":"Update user information","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.UserInformationRequestBody"}}},"description":"user information","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_UserResponse"}}},"description":"user successfully updated account information"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot update your account information"}},"security":[{"Bearer":[]}],"summary":"Update user information","tags":["user"]}},"/user/":{"delete":{"description":"Delete a user account","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"204":{"description":"account successfully deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Delete a user account","tags":["user"]}},"/user/me":{"get":{"description":"Get user information","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_UserResponse"}}},"description":"get user information successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot get user information"}},"security":[{"Bearer":[]}],"summary":"Get user information","tags":["user"]}},"/user/newpassword":{"post":{"description":"Reset password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ResetPasswordRequestBody"}}},"description":"token","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"password reset successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot reset password"}},"summary":"Reset password","tags":["user"]}},"/user/resend":{"post":{"description":"Re send the confirmation email","responses":{"204":{"description":"resend verification email successfully"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot verification email"}},"security":[{"Bearer":[]}],"summary":"SendConfirmationEmailAgain","tags":["user"]}},"/user/resetpassword":{"post":{"description":"Resend verification email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ResetPasswordCreateRequestBody"}}},"description":"token","required":true},"responses":{"204":{"description":"email is sent to user successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot resend verification email"}},"summary":"Resend verification email","tags":["user"]}},"/user/verify":{"post":{"description":"Verify email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.VerifyRequestBody"}}},"description":"token","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"email is verified successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot verify your email"}},"summary":"Verify email","tags":["user"]}},"/user/{id}":{"get":{"description":"Get User By ID","parameters":[{"description":"user id","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_UserResponse"}}},"description":"get user information successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot get user information"}},"security":[{"Bearer":[]}],"summary":"GetUserByID","tags":["user"]}}},
+    "paths": {"/auth/login":{"post":{"description":"Login user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.LoginRequestBody"}}},"description":"user information","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"user successfully logged in"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"user not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot login user"}},"summary":"Login user","tags":["auth"]}},"/auth/refresh":{"post":{"description":"Refresh user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.RefreshTokenRequestBody"}}},"description":"user information","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenResponseBody"}}},"description":"user successfully Refresh in"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"user not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot refresh user"}},"summary":"Refresh user","tags":["auth"]}},"/auth/register":{"post":{"description":"Register new user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.RegisterRequestBody"}}},"description":"user information","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"user successfully registered"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot register user"}},"summary":"Register new user","tags":["auth"]}},"/dorms":{"get":{"description":"Retrieve a list of all dorms filtered by a search query. If no query is provided, all dorms are returned.","parameters":[{"description":"Search query","in":"query","name":"search","schema":{"type":"string"}},{"description":"Filter min price","in":"query","name":"minPrice","schema":{"type":"integer"}},{"description":"Filter max price","in":"query","name":"maxPrice","schema":{"type":"integer"}},{"description":"Filter district price","in":"query","name":"district","schema":{"type":"string"}},{"description":"Filter subdistrict price","in":"query","name":"subdistrict","schema":{"type":"string"}},{"description":"Filter province price","in":"query","name":"province","schema":{"type":"string"}},{"description":"Filter zipcode price","in":"query","name":"zipcode","schema":{"type":"string"}},{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_DormResponseBody"}}},"description":"All dorms retrieved successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to retrieve dorms"}},"summary":"Get all dorms by a search string","tags":["dorms"]},"post":{"description":"Add a new room to the database with the given details","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.DormCreateRequestBody"}}},"description":"Dorm information","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormResponseBody"}}},"description":"Dorm successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"You do not have permission to create a dorm"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to save dorm"}},"security":[{"Bearer":[]}],"summary":"Create a new dorm","tags":["dorms"]}},"/dorms/owner/{id}":{"get":{"description":"Retrieve all dorms of a specific owner ID","parameters":[{"description":"OwnerID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_DormResponseBody"}}},"description":"All dorms retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to retrieve dorms"}},"summary":"Get dorms by owner ID","tags":["dorms"]}},"/dorms/{id}":{"delete":{"description":"Removes a dorm from the database based on the give ID","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Dorm successfully deleted"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"You do not have permission to delete this dorm"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to delete dorm"}},"security":[{"Bearer":[]}],"summary":"Delete a dorm","tags":["dorms"]},"get":{"description":"Retrieve a specific dorm based on its ID","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormResponseBody"}}},"description":"Dorm data successfully retrieved"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to retrieve dorm"}},"summary":"Get a dorm by ID","tags":["dorms"]},"patch":{"description":"Modifies an existing room's details based on the given ID","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.DormUpdateRequestBody"}}},"description":"Updated Room Data","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormResponseBody"}}},"description":"Dorm data updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Invalid Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"unauthorized to update this dorm"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to update dorm"}},"security":[{"Bearer":[]}],"summary":"Update an existing dorm","tags":["dorms"]}},"/dorms/{id}/images":{"post":{"description":"Upload an image for a specific dorm by its ID, by attaching the image as a value for the key field name \"image\", as a multipart form-data","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"file"}}},"description":"DormImage","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormImageUploadResponseBody"}}},"description":"Successful image upload"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Invalid Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"unauthorized to upload image to dorm"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to upload dorm image"}},"security":[{"Bearer":[]}],"summary":"Upload an image for a dorm","tags":["dorms"]}},"/history/bydorm/{id}":{"get":{"description":"Retrieve a list of all leasing history by userid","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_LeasingHistory"}}},"description":"Retrive history successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format or limit parameter is incorrect or page parameter is incorrect or page exceeded"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID"}},"security":[{"Bearer":[]}],"summary":"Get all leasing history by userid","tags":["history"]}},"/history/me":{"get":{"description":"Retrieve a list of all leasing history by userid","parameters":[{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_LeasingHistory"}}},"description":"Retrive history successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format or limit parameter is incorrect or page parameter is incorrect or page exceeded"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"}},"security":[{"Bearer":[]}],"summary":"Get all leasing history by userid","tags":["history"]}},"/history/{id}":{"delete":{"description":"Delete a leasing history in the database","parameters":[{"description":"LeasingHistoryId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to delete leasing history"}},"security":[{"Bearer":[]}],"summary":"Delete a leasing history","tags":["history"]},"patch":{"description":"Delete a leasing history in the database","parameters":[{"description":"LeasingHistoryId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Set end timestamp successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing history"}},"security":[{"Bearer":[]}],"summary":"Delete a leasing history","tags":["history"]},"post":{"description":"Add a new leasing history to the database","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_LeasingHistory"}}},"description":"Dorm successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found or leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or failed to save leasing history to database"}},"security":[{"Bearer":[]}],"summary":"Create a new leasing history","tags":["history"]}},"/order":{"post":{"description":"Create an order","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.OrderRequestBody"}}},"description":"Order request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OrderResponseBody"}}},"description":"Order created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Create an order","tags":["order"]}},"/order/unpaid/me":{"get":{"description":"Get my unpaid orders by ID","parameters":[{"description":"Number of history to be retrieved","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page to retrieved","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_OrderResponseBody"}}},"description":"Unpaid orders retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Get my unpaid orders by ID","tags":["order"]}},"/order/unpaid/{userID}":{"get":{"description":"Get unpaid orders by User ID","parameters":[{"description":"User ID","in":"path","name":"userID","required":true,"schema":{"type":"string"}},{"description":"Number of history to be retrieved","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page to retrieved","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_OrderResponseBody"}}},"description":"Order retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Get unpaid orders by User ID","tags":["order"]}},"/order/{id}":{"get":{"description":"Get an order by ID","parameters":[{"description":"Order ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OrderResponseBody"}}},"description":"Order retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Get an order by ID","tags":["order"]}},"/ownership/{id}":{"delete":{"description":"Delete an ownership proof file","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Ownership proof successfully deleted"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to delete Ownership file"}},"security":[{"Bearer":[]}],"summary":"Delete ownership proof","tags":["ownership"]},"get":{"description":"Retrieve ownership proof for a specific dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Internal server error"}},"security":[{"Bearer":[]}],"summary":"Get ownership proof by Dorm ID","tags":["ownership"]}},"/ownership/{id}/approve":{"post":{"description":"Approve a submitted ownership proof for a dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof approved"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Internal server error"}},"security":[{"Bearer":[]}],"summary":"Approve ownership proof","tags":["ownership"]}},"/ownership/{id}/reject":{"post":{"description":"Reject a submitted ownership proof for a dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof rejected"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Internal server error"}},"security":[{"Bearer":[]}],"summary":"Reject ownership proof","tags":["ownership"]}},"/ownership/{id}/upload":{"post":{"description":"Upload a new file as ownership proof for a dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"file"}}},"description":"file","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownershop proof not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to upload file"}},"security":[{"Bearer":[]}],"summary":"Upload new ownership proof","tags":["ownership"]}},"/request/me":{"get":{"description":"Retrieve a list of all leasing request by userid","parameters":[{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_LeasingRequest"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format or limit parameter is incorrect or page parameter is incorrect"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"}},"security":[{"Bearer":[]}],"summary":"Get all leasing request by userid","tags":["request"]}},"/request/{id}":{"delete":{"description":"Delete a leasing request in the database","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized or only admin can delete a request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to delete leasing request"}},"security":[{"Bearer":[]}],"summary":"Delete a leasing request","tags":["request"]},"post":{"description":"Add a new leasing request to the database","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_LeasingRequest"}}},"description":"Dorm successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found or leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or failed to save leasing request to database"}},"security":[{"Bearer":[]}],"summary":"Create a new leasing request","tags":["request"]}},"/request/{id}/approve":{"patch":{"description":"Approve a leasing request","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized or only lessor can approve a request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found or request is not in the pending status"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing request"}},"security":[{"Bearer":[]}],"summary":"Approve a leasing request","tags":["request"]}},"/request/{id}/cancel":{"patch":{"description":"Cancel a leasing request","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found or request is not in the pending status"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing request"}},"security":[{"Bearer":[]}],"summary":"Cancel a leasing request","tags":["request"]}},"/request/{id}/reject":{"patch":{"description":"Reject a leasing request","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found or request is not in the pending status"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized or only lessor can reject a request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing request"}},"security":[{"Bearer":[]}],"summary":"Reject a leasing request","tags":["request"]}},"/transaction":{"post":{"description":"Create a transaction","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.TransactionRequestBody"}}},"description":"Transaction request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_CreateTransactionResponseBody"}}},"description":"Transaction created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Create a transaction","tags":["transaction"]}},"/user":{"patch":{"description":"Update user information","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.UserInformationRequestBody"}}},"description":"user information","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_UserResponse"}}},"description":"user successfully updated account information"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot update your account information"}},"security":[{"Bearer":[]}],"summary":"Update user information","tags":["user"]}},"/user/":{"delete":{"description":"Delete a user account","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"204":{"description":"account successfully deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Delete a user account","tags":["user"]}},"/user/me":{"get":{"description":"Get user information","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_UserResponse"}}},"description":"get user information successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot get user information"}},"security":[{"Bearer":[]}],"summary":"Get user information","tags":["user"]}},"/user/newpassword":{"post":{"description":"Reset password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ResetPasswordRequestBody"}}},"description":"token","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"password reset successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot reset password"}},"summary":"Reset password","tags":["user"]}},"/user/resend":{"post":{"description":"Re send the confirmation email","responses":{"204":{"description":"resend verification email successfully"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot verification email"}},"security":[{"Bearer":[]}],"summary":"SendConfirmationEmailAgain","tags":["user"]}},"/user/resetpassword":{"post":{"description":"Resend verification email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ResetPasswordCreateRequestBody"}}},"description":"token","required":true},"responses":{"204":{"description":"email is sent to user successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot resend verification email"}},"summary":"Resend verification email","tags":["user"]}},"/user/studentEvidence":{"post":{"description":"Upload an image of a student ID card, by attaching the image as a value for the key field name \"image\", as a multipart form-data","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"file"}}},"description":"Student ID image","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_StudentEvidenceUploadResponseBody"}}},"description":"Evidence uploaded successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"File is required"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"User not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to upload file"}},"security":[{"Bearer":[]}],"summary":"Upload an evidence for student verification","tags":["user"]}},"/user/verify":{"post":{"description":"Verify email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.VerifyRequestBody"}}},"description":"token","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"email is verified successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot verify your email"}},"summary":"Verify email","tags":["user"]}},"/user/{id}":{"get":{"description":"Get User By ID","parameters":[{"description":"user id","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_UserResponse"}}},"description":"get user information successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot get user information"}},"security":[{"Bearer":[]}],"summary":"GetUserByID","tags":["user"]}},"/user/{id}/studentEvidence":{"get":{"description":"Get student evidence by user id","parameters":[{"description":"userID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_StudentEvidenceUploadResponseBody"}}},"description":"Get student evidence successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"invalid user id"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"unauthorized to view this evidence"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"User or evidence not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot get user's student evidence"}},"security":[{"Bearer":[]}],"summary":"Get student evidence by user id","tags":["user"]}}},
     "openapi": "3.1.0"
 }`
 
diff --git a/docs/swagger.json b/docs/swagger.json
index b6d3aecb..eb030379 100644
--- a/docs/swagger.json
+++ b/docs/swagger.json
@@ -1,7 +1,7 @@
 {
-    "components": {"schemas":{"dto.Address":{"properties":{"district":{"type":"string"},"province":{"type":"string"},"subdistrict":{"type":"string"},"zipcode":{"type":"string"}},"type":"object"},"dto.CreateTransactionResponseBody":{"properties":{"checkoutUrl":{"type":"string"}},"type":"object"},"dto.DormCreateRequestBody":{"properties":{"address":{"properties":{"district":{"type":"string"},"province":{"type":"string"},"subdistrict":{"type":"string"},"zipcode":{"type":"string"}},"required":["district","province","subdistrict","zipcode"],"type":"object"},"bathrooms":{"minimum":0,"type":"integer"},"bedrooms":{"minimum":0,"type":"integer"},"description":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"size":{"type":"number"}},"required":["address","bathrooms","bedrooms","name","price","size"],"type":"object"},"dto.DormImageUploadResponseBody":{"properties":{"url":{"type":"string"}},"type":"object"},"dto.DormResponseBody":{"properties":{"address":{"$ref":"#/components/schemas/dto.Address"},"bathrooms":{"type":"integer"},"bedrooms":{"type":"integer"},"createAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"imagesUrl":{"items":{"type":"string"},"type":"array","uniqueItems":false},"name":{"type":"string"},"owner":{"$ref":"#/components/schemas/dto.UserResponse"},"price":{"type":"number"},"rating":{"type":"number"},"size":{"type":"number"},"updateAt":{"type":"string"}},"type":"object"},"dto.DormUpdateRequestBody":{"properties":{"address":{"$ref":"#/components/schemas/dto.Address"},"bathrooms":{"minimum":0,"type":"integer"},"bedrooms":{"minimum":0,"type":"integer"},"description":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"size":{"type":"number"}},"type":"object"},"dto.ErrorResponse":{"properties":{"error":{"type":"string"}},"type":"object"},"dto.LeasingHistory":{"properties":{"dorm":{"$ref":"#/components/schemas/dto.DormResponseBody"},"end":{"type":"string"},"id":{"type":"string"},"lessee":{"$ref":"#/components/schemas/dto.UserResponse"},"orders":{"items":{"$ref":"#/components/schemas/dto.OrderResponseBody"},"type":"array","uniqueItems":false},"price":{"type":"number"},"start":{"type":"string"}},"type":"object"},"dto.LeasingRequest":{"properties":{"dorm":{"$ref":"#/components/schemas/dto.DormResponseBody"},"end":{"type":"string"},"id":{"type":"string"},"lessee":{"$ref":"#/components/schemas/dto.UserResponse"},"start":{"type":"string"},"status":{"$ref":"#/components/schemas/dto.Status"}},"type":"object"},"dto.LoginRequestBody":{"properties":{"email":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"type":"object"},"dto.OrderRequestBody":{"properties":{"leasingHistoryId":{"type":"string"}},"required":["leasingHistoryId"],"type":"object"},"dto.OrderResponseBody":{"properties":{"id":{"type":"string"},"paidTransaction":{"$ref":"#/components/schemas/dto.TransactionResponse"},"price":{"type":"integer"},"type":{"type":"string"}},"type":"object"},"dto.OwnershipProofResponseBody":{"properties":{"adminId":{"type":"string"},"dormId":{"type":"string"},"status":{"$ref":"#/components/schemas/dto.OwnershipProofStatus"},"url":{"type":"string"}},"type":"object"},"dto.OwnershipProofStatus":{"type":"string","x-enum-varnames":["Pending","Approved","Rejected"]},"dto.Pagination":{"properties":{"current_page":{"type":"integer"},"last_page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"}},"type":"object"},"dto.PaginationResponse-dto_DormResponseBody":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.DormResponseBody"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.PaginationResponse-dto_LeasingHistory":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.LeasingHistory"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.PaginationResponse-dto_LeasingRequest":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.LeasingRequest"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.PaginationResponse-dto_OrderResponseBody":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.OrderResponseBody"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.RefreshTokenRequestBody":{"properties":{"refreshToken":{"type":"string"}},"required":["refreshToken"],"type":"object"},"dto.RegisterRequestBody":{"properties":{"email":{"type":"string"},"password":{"type":"string"},"username":{"type":"string"}},"required":["email","password","username"],"type":"object"},"dto.ResetPasswordCreateRequestBody":{"properties":{"email":{"type":"string"}},"required":["email"],"type":"object"},"dto.ResetPasswordRequestBody":{"properties":{"password":{"type":"string"},"token":{"type":"string"}},"required":["password","token"],"type":"object"},"dto.Status":{"type":"string","x-enum-varnames":["RequestPending","RequestAccepted","RequestRejected","RequestCanceled"]},"dto.SuccessResponse-dto_CreateTransactionResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.CreateTransactionResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_DormImageUploadResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.DormImageUploadResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_DormResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.DormResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_LeasingHistory":{"properties":{"data":{"$ref":"#/components/schemas/dto.LeasingHistory"}},"type":"object"},"dto.SuccessResponse-dto_LeasingRequest":{"properties":{"data":{"$ref":"#/components/schemas/dto.LeasingRequest"}},"type":"object"},"dto.SuccessResponse-dto_OrderResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.OrderResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_OwnershipProofResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.OwnershipProofResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_TokenResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.TokenResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_TokenWithUserInformationResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.TokenWithUserInformationResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_UserResponse":{"properties":{"data":{"$ref":"#/components/schemas/dto.UserResponse"}},"type":"object"},"dto.TokenResponseBody":{"properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"}},"type":"object"},"dto.TokenWithUserInformationResponseBody":{"properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"userInformation":{"$ref":"#/components/schemas/dto.UserResponse"}},"type":"object"},"dto.TransactionRequestBody":{"properties":{"orderID":{"type":"string"}},"type":"object"},"dto.TransactionResponse":{"properties":{"createAt":{"type":"string"},"id":{"type":"string"},"price":{"type":"integer"},"status":{"type":"string"},"updateAt":{"type":"string"}},"type":"object"},"dto.UserInformationRequestBody":{"properties":{"birthDate":{"type":"string"},"firstname":{"minLength":2,"type":"string"},"gender":{"type":"string"},"lastname":{"minLength":2,"type":"string"},"lifestyles":{"items":{"type":"string"},"type":"array","uniqueItems":false},"nationalID":{"type":"string"},"password":{"minLength":8,"type":"string"},"phoneNumber":{"type":"string"},"studentEvidence":{"type":"string"},"username":{"minLength":2,"type":"string"}},"type":"object"},"dto.UserResponse":{"properties":{"birthDate":{"type":"string"},"email":{"type":"string"},"filledPersonalInfo":{"type":"boolean"},"firstname":{"type":"string"},"gender":{"type":"string"},"id":{"type":"string"},"isStudentVerified":{"type":"boolean"},"isVerified":{"type":"boolean"},"lastname":{"type":"string"},"lifestyles":{"items":{"type":"string"},"type":"array","uniqueItems":false},"phoneNumber":{"type":"string"},"role":{"type":"string"},"studentEvidence":{"type":"string"},"username":{"type":"string"}},"type":"object"},"dto.VerifyRequestBody":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"}},"securitySchemes":{"Bearer":{"description":"Bearer token authentication","in":"header","name":"Authorization","type":"apiKey"}}},
+    "components": {"schemas":{"dto.Address":{"properties":{"district":{"type":"string"},"province":{"type":"string"},"subdistrict":{"type":"string"},"zipcode":{"type":"string"}},"type":"object"},"dto.CreateTransactionResponseBody":{"properties":{"checkoutUrl":{"type":"string"}},"type":"object"},"dto.DormCreateRequestBody":{"properties":{"address":{"properties":{"district":{"type":"string"},"province":{"type":"string"},"subdistrict":{"type":"string"},"zipcode":{"type":"string"}},"required":["district","province","subdistrict","zipcode"],"type":"object"},"bathrooms":{"minimum":0,"type":"integer"},"bedrooms":{"minimum":0,"type":"integer"},"description":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"size":{"type":"number"}},"required":["address","bathrooms","bedrooms","name","price","size"],"type":"object"},"dto.DormImageUploadResponseBody":{"properties":{"url":{"type":"string"}},"type":"object"},"dto.DormResponseBody":{"properties":{"address":{"$ref":"#/components/schemas/dto.Address"},"bathrooms":{"type":"integer"},"bedrooms":{"type":"integer"},"createAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"imagesUrl":{"items":{"type":"string"},"type":"array","uniqueItems":false},"name":{"type":"string"},"owner":{"$ref":"#/components/schemas/dto.UserResponse"},"price":{"type":"number"},"rating":{"type":"number"},"size":{"type":"number"},"updateAt":{"type":"string"}},"type":"object"},"dto.DormUpdateRequestBody":{"properties":{"address":{"$ref":"#/components/schemas/dto.Address"},"bathrooms":{"minimum":0,"type":"integer"},"bedrooms":{"minimum":0,"type":"integer"},"description":{"type":"string"},"name":{"type":"string"},"price":{"type":"number"},"size":{"type":"number"}},"type":"object"},"dto.ErrorResponse":{"properties":{"error":{"type":"string"}},"type":"object"},"dto.LeasingHistory":{"properties":{"dorm":{"$ref":"#/components/schemas/dto.DormResponseBody"},"end":{"type":"string"},"id":{"type":"string"},"lessee":{"$ref":"#/components/schemas/dto.UserResponse"},"orders":{"items":{"$ref":"#/components/schemas/dto.OrderResponseBody"},"type":"array","uniqueItems":false},"price":{"type":"number"},"start":{"type":"string"}},"type":"object"},"dto.LeasingRequest":{"properties":{"dorm":{"$ref":"#/components/schemas/dto.DormResponseBody"},"end":{"type":"string"},"id":{"type":"string"},"lessee":{"$ref":"#/components/schemas/dto.UserResponse"},"start":{"type":"string"},"status":{"$ref":"#/components/schemas/dto.Status"}},"type":"object"},"dto.LoginRequestBody":{"properties":{"email":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"type":"object"},"dto.OrderRequestBody":{"properties":{"leasingHistoryId":{"type":"string"}},"required":["leasingHistoryId"],"type":"object"},"dto.OrderResponseBody":{"properties":{"id":{"type":"string"},"paidTransaction":{"$ref":"#/components/schemas/dto.TransactionResponse"},"price":{"type":"integer"},"type":{"type":"string"}},"type":"object"},"dto.OwnershipProofResponseBody":{"properties":{"adminId":{"type":"string"},"dormId":{"type":"string"},"status":{"$ref":"#/components/schemas/dto.OwnershipProofStatus"},"url":{"type":"string"}},"type":"object"},"dto.OwnershipProofStatus":{"type":"string","x-enum-varnames":["Pending","Approved","Rejected"]},"dto.Pagination":{"properties":{"current_page":{"type":"integer"},"last_page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"}},"type":"object"},"dto.PaginationResponse-dto_DormResponseBody":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.DormResponseBody"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.PaginationResponse-dto_LeasingHistory":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.LeasingHistory"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.PaginationResponse-dto_LeasingRequest":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.LeasingRequest"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.PaginationResponse-dto_OrderResponseBody":{"properties":{"data":{"items":{"$ref":"#/components/schemas/dto.OrderResponseBody"},"type":"array","uniqueItems":false},"pagination":{"$ref":"#/components/schemas/dto.Pagination"}},"type":"object"},"dto.RefreshTokenRequestBody":{"properties":{"refreshToken":{"type":"string"}},"required":["refreshToken"],"type":"object"},"dto.RegisterRequestBody":{"properties":{"email":{"type":"string"},"password":{"type":"string"},"username":{"type":"string"}},"required":["email","password","username"],"type":"object"},"dto.ResetPasswordCreateRequestBody":{"properties":{"email":{"type":"string"}},"required":["email"],"type":"object"},"dto.ResetPasswordRequestBody":{"properties":{"password":{"type":"string"},"token":{"type":"string"}},"required":["password","token"],"type":"object"},"dto.Status":{"type":"string","x-enum-varnames":["RequestPending","RequestAccepted","RequestRejected","RequestCanceled"]},"dto.StudentEvidenceUploadResponseBody":{"properties":{"expired":{"type":"string"},"url":{"type":"string"}},"type":"object"},"dto.SuccessResponse-dto_CreateTransactionResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.CreateTransactionResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_DormImageUploadResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.DormImageUploadResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_DormResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.DormResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_LeasingHistory":{"properties":{"data":{"$ref":"#/components/schemas/dto.LeasingHistory"}},"type":"object"},"dto.SuccessResponse-dto_LeasingRequest":{"properties":{"data":{"$ref":"#/components/schemas/dto.LeasingRequest"}},"type":"object"},"dto.SuccessResponse-dto_OrderResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.OrderResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_OwnershipProofResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.OwnershipProofResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_StudentEvidenceUploadResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.StudentEvidenceUploadResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_TokenResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.TokenResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_TokenWithUserInformationResponseBody":{"properties":{"data":{"$ref":"#/components/schemas/dto.TokenWithUserInformationResponseBody"}},"type":"object"},"dto.SuccessResponse-dto_UserResponse":{"properties":{"data":{"$ref":"#/components/schemas/dto.UserResponse"}},"type":"object"},"dto.TokenResponseBody":{"properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"}},"type":"object"},"dto.TokenWithUserInformationResponseBody":{"properties":{"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"userInformation":{"$ref":"#/components/schemas/dto.UserResponse"}},"type":"object"},"dto.TransactionRequestBody":{"properties":{"orderID":{"type":"string"}},"type":"object"},"dto.TransactionResponse":{"properties":{"createAt":{"type":"string"},"id":{"type":"string"},"price":{"type":"integer"},"status":{"type":"string"},"updateAt":{"type":"string"}},"type":"object"},"dto.UserInformationRequestBody":{"properties":{"birthDate":{"type":"string"},"firstname":{"minLength":2,"type":"string"},"gender":{"type":"string"},"lastname":{"minLength":2,"type":"string"},"lifestyles":{"items":{"type":"string"},"type":"array","uniqueItems":false},"nationalID":{"type":"string"},"password":{"minLength":8,"type":"string"},"phoneNumber":{"type":"string"},"studentEvidence":{"type":"string"},"username":{"minLength":2,"type":"string"}},"type":"object"},"dto.UserResponse":{"properties":{"birthDate":{"type":"string"},"email":{"type":"string"},"filledPersonalInfo":{"type":"boolean"},"firstname":{"type":"string"},"gender":{"type":"string"},"id":{"type":"string"},"isStudentVerified":{"type":"boolean"},"isVerified":{"type":"boolean"},"lastname":{"type":"string"},"lifestyles":{"items":{"type":"string"},"type":"array","uniqueItems":false},"phoneNumber":{"type":"string"},"role":{"type":"string"},"username":{"type":"string"}},"type":"object"},"dto.VerifyRequestBody":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"}},"securitySchemes":{"Bearer":{"description":"Bearer token authentication","in":"header","name":"Authorization","type":"apiKey"}}},
     "info": {"description":"This is the API for the Condormhub project.","title":"Condormhub API","version":"1.0"},
     "externalDocs": {"description":"","url":""},
-    "paths": {"/auth/login":{"post":{"description":"Login user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.LoginRequestBody"}}},"description":"user information","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"user successfully logged in"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"user not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot login user"}},"summary":"Login user","tags":["auth"]}},"/auth/refresh":{"post":{"description":"Refresh user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.RefreshTokenRequestBody"}}},"description":"user information","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenResponseBody"}}},"description":"user successfully Refresh in"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"user not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot refresh user"}},"summary":"Refresh user","tags":["auth"]}},"/auth/register":{"post":{"description":"Register new user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.RegisterRequestBody"}}},"description":"user information","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"user successfully registered"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot register user"}},"summary":"Register new user","tags":["auth"]}},"/dorms":{"get":{"description":"Retrieve a list of all dorms filtered by a search query. If no query is provided, all dorms are returned.","parameters":[{"description":"Search query","in":"query","name":"search","schema":{"type":"string"}},{"description":"Filter min price","in":"query","name":"minPrice","schema":{"type":"integer"}},{"description":"Filter max price","in":"query","name":"maxPrice","schema":{"type":"integer"}},{"description":"Filter district price","in":"query","name":"district","schema":{"type":"string"}},{"description":"Filter subdistrict price","in":"query","name":"subdistrict","schema":{"type":"string"}},{"description":"Filter province price","in":"query","name":"province","schema":{"type":"string"}},{"description":"Filter zipcode price","in":"query","name":"zipcode","schema":{"type":"string"}},{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_DormResponseBody"}}},"description":"All dorms retrieved successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to retrieve dorms"}},"summary":"Get all dorms by a search string","tags":["dorms"]},"post":{"description":"Add a new room to the database with the given details","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.DormCreateRequestBody"}}},"description":"Dorm information","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormResponseBody"}}},"description":"Dorm successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"You do not have permission to create a dorm"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to save dorm"}},"security":[{"Bearer":[]}],"summary":"Create a new dorm","tags":["dorms"]}},"/dorms/owner/{id}":{"get":{"description":"Retrieve all dorms of a specific owner ID","parameters":[{"description":"OwnerID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_DormResponseBody"}}},"description":"All dorms retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to retrieve dorms"}},"summary":"Get dorms by owner ID","tags":["dorms"]}},"/dorms/{id}":{"delete":{"description":"Removes a dorm from the database based on the give ID","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Dorm successfully deleted"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"You do not have permission to delete this dorm"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to delete dorm"}},"security":[{"Bearer":[]}],"summary":"Delete a dorm","tags":["dorms"]},"get":{"description":"Retrieve a specific dorm based on its ID","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormResponseBody"}}},"description":"Dorm data successfully retrieved"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to retrieve dorm"}},"summary":"Get a dorm by ID","tags":["dorms"]},"patch":{"description":"Modifies an existing room's details based on the given ID","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.DormUpdateRequestBody"}}},"description":"Updated Room Data","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormResponseBody"}}},"description":"Dorm data updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Invalid Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"unauthorized to update this dorm"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to update dorm"}},"security":[{"Bearer":[]}],"summary":"Update an existing dorm","tags":["dorms"]}},"/dorms/{id}/images":{"post":{"description":"Upload an image for a specific dorm by its ID, by attaching the image as a value for the key field name \"image\", as a multipart form-data","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"file"}}},"description":"DormImage","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormImageUploadResponseBody"}}},"description":"Successful image upload"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Invalid Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"unauthorized to upload image to dorm"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to upload dorm image"}},"security":[{"Bearer":[]}],"summary":"Upload an image for a dorm","tags":["dorms"]}},"/history/bydorm/{id}":{"get":{"description":"Retrieve a list of all leasing history by userid","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_LeasingHistory"}}},"description":"Retrive history successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format or limit parameter is incorrect or page parameter is incorrect or page exceeded"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID"}},"security":[{"Bearer":[]}],"summary":"Get all leasing history by userid","tags":["history"]}},"/history/me":{"get":{"description":"Retrieve a list of all leasing history by userid","parameters":[{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_LeasingHistory"}}},"description":"Retrive history successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format or limit parameter is incorrect or page parameter is incorrect or page exceeded"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"}},"security":[{"Bearer":[]}],"summary":"Get all leasing history by userid","tags":["history"]}},"/history/{id}":{"delete":{"description":"Delete a leasing history in the database","parameters":[{"description":"LeasingHistoryId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to delete leasing history"}},"security":[{"Bearer":[]}],"summary":"Delete a leasing history","tags":["history"]},"patch":{"description":"Delete a leasing history in the database","parameters":[{"description":"LeasingHistoryId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Set end timestamp successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing history"}},"security":[{"Bearer":[]}],"summary":"Delete a leasing history","tags":["history"]},"post":{"description":"Add a new leasing history to the database","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_LeasingHistory"}}},"description":"Dorm successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found or leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or failed to save leasing history to database"}},"security":[{"Bearer":[]}],"summary":"Create a new leasing history","tags":["history"]}},"/order":{"post":{"description":"Create an order","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.OrderRequestBody"}}},"description":"Order request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OrderResponseBody"}}},"description":"Order created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Create an order","tags":["order"]}},"/order/unpaid/me":{"get":{"description":"Get my unpaid orders by ID","parameters":[{"description":"Number of history to be retrieved","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page to retrieved","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_OrderResponseBody"}}},"description":"Unpaid orders retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Get my unpaid orders by ID","tags":["order"]}},"/order/unpaid/{userID}":{"get":{"description":"Get unpaid orders by User ID","parameters":[{"description":"User ID","in":"path","name":"userID","required":true,"schema":{"type":"string"}},{"description":"Number of history to be retrieved","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page to retrieved","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_OrderResponseBody"}}},"description":"Order retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Get unpaid orders by User ID","tags":["order"]}},"/order/{id}":{"get":{"description":"Get an order by ID","parameters":[{"description":"Order ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OrderResponseBody"}}},"description":"Order retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Get an order by ID","tags":["order"]}},"/ownership/{id}":{"delete":{"description":"Delete an ownership proof file","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Ownership proof successfully deleted"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to delete Ownership file"}},"security":[{"Bearer":[]}],"summary":"Delete ownership proof","tags":["ownership"]},"get":{"description":"Retrieve ownership proof for a specific dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Internal server error"}},"security":[{"Bearer":[]}],"summary":"Get ownership proof by Dorm ID","tags":["ownership"]}},"/ownership/{id}/approve":{"post":{"description":"Approve a submitted ownership proof for a dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof approved"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Internal server error"}},"security":[{"Bearer":[]}],"summary":"Approve ownership proof","tags":["ownership"]}},"/ownership/{id}/reject":{"post":{"description":"Reject a submitted ownership proof for a dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof rejected"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Internal server error"}},"security":[{"Bearer":[]}],"summary":"Reject ownership proof","tags":["ownership"]}},"/ownership/{id}/upload":{"post":{"description":"Upload a new file as ownership proof for a dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"file"}}},"description":"file","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownershop proof not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to upload file"}},"security":[{"Bearer":[]}],"summary":"Upload new ownership proof","tags":["ownership"]}},"/request/me":{"get":{"description":"Retrieve a list of all leasing request by userid","parameters":[{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_LeasingRequest"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format or limit parameter is incorrect or page parameter is incorrect"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"}},"security":[{"Bearer":[]}],"summary":"Get all leasing request by userid","tags":["request"]}},"/request/{id}":{"delete":{"description":"Delete a leasing request in the database","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized or only admin can delete a request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to delete leasing request"}},"security":[{"Bearer":[]}],"summary":"Delete a leasing request","tags":["request"]},"post":{"description":"Add a new leasing request to the database","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_LeasingRequest"}}},"description":"Dorm successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found or leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or failed to save leasing request to database"}},"security":[{"Bearer":[]}],"summary":"Create a new leasing request","tags":["request"]}},"/request/{id}/approve":{"patch":{"description":"Approve a leasing request","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized or only lessor can approve a request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found or request is not in the pending status"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing request"}},"security":[{"Bearer":[]}],"summary":"Approve a leasing request","tags":["request"]}},"/request/{id}/cancel":{"patch":{"description":"Cancel a leasing request","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found or request is not in the pending status"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing request"}},"security":[{"Bearer":[]}],"summary":"Cancel a leasing request","tags":["request"]}},"/request/{id}/reject":{"patch":{"description":"Reject a leasing request","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found or request is not in the pending status"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized or only lessor can reject a request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing request"}},"security":[{"Bearer":[]}],"summary":"Reject a leasing request","tags":["request"]}},"/transaction":{"post":{"description":"Create a transaction","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.TransactionRequestBody"}}},"description":"Transaction request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_CreateTransactionResponseBody"}}},"description":"Transaction created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Create a transaction","tags":["transaction"]}},"/user":{"patch":{"description":"Update user information","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.UserInformationRequestBody"}}},"description":"user information","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_UserResponse"}}},"description":"user successfully updated account information"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot update your account information"}},"security":[{"Bearer":[]}],"summary":"Update user information","tags":["user"]}},"/user/":{"delete":{"description":"Delete a user account","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"204":{"description":"account successfully deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Delete a user account","tags":["user"]}},"/user/me":{"get":{"description":"Get user information","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_UserResponse"}}},"description":"get user information successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot get user information"}},"security":[{"Bearer":[]}],"summary":"Get user information","tags":["user"]}},"/user/newpassword":{"post":{"description":"Reset password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ResetPasswordRequestBody"}}},"description":"token","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"password reset successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot reset password"}},"summary":"Reset password","tags":["user"]}},"/user/resend":{"post":{"description":"Re send the confirmation email","responses":{"204":{"description":"resend verification email successfully"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot verification email"}},"security":[{"Bearer":[]}],"summary":"SendConfirmationEmailAgain","tags":["user"]}},"/user/resetpassword":{"post":{"description":"Resend verification email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ResetPasswordCreateRequestBody"}}},"description":"token","required":true},"responses":{"204":{"description":"email is sent to user successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot resend verification email"}},"summary":"Resend verification email","tags":["user"]}},"/user/verify":{"post":{"description":"Verify email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.VerifyRequestBody"}}},"description":"token","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"email is verified successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot verify your email"}},"summary":"Verify email","tags":["user"]}},"/user/{id}":{"get":{"description":"Get User By ID","parameters":[{"description":"user id","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_UserResponse"}}},"description":"get user information successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot get user information"}},"security":[{"Bearer":[]}],"summary":"GetUserByID","tags":["user"]}}},
+    "paths": {"/auth/login":{"post":{"description":"Login user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.LoginRequestBody"}}},"description":"user information","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"user successfully logged in"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"user not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot login user"}},"summary":"Login user","tags":["auth"]}},"/auth/refresh":{"post":{"description":"Refresh user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.RefreshTokenRequestBody"}}},"description":"user information","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenResponseBody"}}},"description":"user successfully Refresh in"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"user not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot refresh user"}},"summary":"Refresh user","tags":["auth"]}},"/auth/register":{"post":{"description":"Register new user","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.RegisterRequestBody"}}},"description":"user information","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"user successfully registered"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot register user"}},"summary":"Register new user","tags":["auth"]}},"/dorms":{"get":{"description":"Retrieve a list of all dorms filtered by a search query. If no query is provided, all dorms are returned.","parameters":[{"description":"Search query","in":"query","name":"search","schema":{"type":"string"}},{"description":"Filter min price","in":"query","name":"minPrice","schema":{"type":"integer"}},{"description":"Filter max price","in":"query","name":"maxPrice","schema":{"type":"integer"}},{"description":"Filter district price","in":"query","name":"district","schema":{"type":"string"}},{"description":"Filter subdistrict price","in":"query","name":"subdistrict","schema":{"type":"string"}},{"description":"Filter province price","in":"query","name":"province","schema":{"type":"string"}},{"description":"Filter zipcode price","in":"query","name":"zipcode","schema":{"type":"string"}},{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_DormResponseBody"}}},"description":"All dorms retrieved successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to retrieve dorms"}},"summary":"Get all dorms by a search string","tags":["dorms"]},"post":{"description":"Add a new room to the database with the given details","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.DormCreateRequestBody"}}},"description":"Dorm information","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormResponseBody"}}},"description":"Dorm successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"You do not have permission to create a dorm"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to save dorm"}},"security":[{"Bearer":[]}],"summary":"Create a new dorm","tags":["dorms"]}},"/dorms/owner/{id}":{"get":{"description":"Retrieve all dorms of a specific owner ID","parameters":[{"description":"OwnerID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_DormResponseBody"}}},"description":"All dorms retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to retrieve dorms"}},"summary":"Get dorms by owner ID","tags":["dorms"]}},"/dorms/{id}":{"delete":{"description":"Removes a dorm from the database based on the give ID","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Dorm successfully deleted"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"You do not have permission to delete this dorm"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to delete dorm"}},"security":[{"Bearer":[]}],"summary":"Delete a dorm","tags":["dorms"]},"get":{"description":"Retrieve a specific dorm based on its ID","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormResponseBody"}}},"description":"Dorm data successfully retrieved"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to retrieve dorm"}},"summary":"Get a dorm by ID","tags":["dorms"]},"patch":{"description":"Modifies an existing room's details based on the given ID","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.DormUpdateRequestBody"}}},"description":"Updated Room Data","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormResponseBody"}}},"description":"Dorm data updated successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Invalid Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"unauthorized to update this dorm"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to update dorm"}},"security":[{"Bearer":[]}],"summary":"Update an existing dorm","tags":["dorms"]}},"/dorms/{id}/images":{"post":{"description":"Upload an image for a specific dorm by its ID, by attaching the image as a value for the key field name \"image\", as a multipart form-data","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"file"}}},"description":"DormImage","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_DormImageUploadResponseBody"}}},"description":"Successful image upload"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Invalid Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"unauthorized to upload image to dorm"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to upload dorm image"}},"security":[{"Bearer":[]}],"summary":"Upload an image for a dorm","tags":["dorms"]}},"/history/bydorm/{id}":{"get":{"description":"Retrieve a list of all leasing history by userid","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_LeasingHistory"}}},"description":"Retrive history successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format or limit parameter is incorrect or page parameter is incorrect or page exceeded"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID"}},"security":[{"Bearer":[]}],"summary":"Get all leasing history by userid","tags":["history"]}},"/history/me":{"get":{"description":"Retrieve a list of all leasing history by userid","parameters":[{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_LeasingHistory"}}},"description":"Retrive history successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format or limit parameter is incorrect or page parameter is incorrect or page exceeded"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"}},"security":[{"Bearer":[]}],"summary":"Get all leasing history by userid","tags":["history"]}},"/history/{id}":{"delete":{"description":"Delete a leasing history in the database","parameters":[{"description":"LeasingHistoryId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to delete leasing history"}},"security":[{"Bearer":[]}],"summary":"Delete a leasing history","tags":["history"]},"patch":{"description":"Delete a leasing history in the database","parameters":[{"description":"LeasingHistoryId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Set end timestamp successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing history"}},"security":[{"Bearer":[]}],"summary":"Delete a leasing history","tags":["history"]},"post":{"description":"Add a new leasing history to the database","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_LeasingHistory"}}},"description":"Dorm successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found or leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or failed to save leasing history to database"}},"security":[{"Bearer":[]}],"summary":"Create a new leasing history","tags":["history"]}},"/order":{"post":{"description":"Create an order","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.OrderRequestBody"}}},"description":"Order request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OrderResponseBody"}}},"description":"Order created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Create an order","tags":["order"]}},"/order/unpaid/me":{"get":{"description":"Get my unpaid orders by ID","parameters":[{"description":"Number of history to be retrieved","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page to retrieved","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_OrderResponseBody"}}},"description":"Unpaid orders retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Get my unpaid orders by ID","tags":["order"]}},"/order/unpaid/{userID}":{"get":{"description":"Get unpaid orders by User ID","parameters":[{"description":"User ID","in":"path","name":"userID","required":true,"schema":{"type":"string"}},{"description":"Number of history to be retrieved","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page to retrieved","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_OrderResponseBody"}}},"description":"Order retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Get unpaid orders by User ID","tags":["order"]}},"/order/{id}":{"get":{"description":"Get an order by ID","parameters":[{"description":"Order ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OrderResponseBody"}}},"description":"Order retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Get an order by ID","tags":["order"]}},"/ownership/{id}":{"delete":{"description":"Delete an ownership proof file","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Ownership proof successfully deleted"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Failed to delete Ownership file"}},"security":[{"Bearer":[]}],"summary":"Delete ownership proof","tags":["ownership"]},"get":{"description":"Retrieve ownership proof for a specific dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof retrieved successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Internal server error"}},"security":[{"Bearer":[]}],"summary":"Get ownership proof by Dorm ID","tags":["ownership"]}},"/ownership/{id}/approve":{"post":{"description":"Approve a submitted ownership proof for a dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof approved"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Internal server error"}},"security":[{"Bearer":[]}],"summary":"Approve ownership proof","tags":["ownership"]}},"/ownership/{id}/reject":{"post":{"description":"Reject a submitted ownership proof for a dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof rejected"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownership file not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Internal server error"}},"security":[{"Bearer":[]}],"summary":"Reject ownership proof","tags":["ownership"]}},"/ownership/{id}/upload":{"post":{"description":"Upload a new file as ownership proof for a dorm","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"file"}}},"description":"file","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_OwnershipProofResponseBody"}}},"description":"Ownership proof created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Ownershop proof not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to upload file"}},"security":[{"Bearer":[]}],"summary":"Upload new ownership proof","tags":["ownership"]}},"/request/me":{"get":{"description":"Retrieve a list of all leasing request by userid","parameters":[{"description":"Number of dorms to retrieve (default 10, max 50)","in":"query","name":"limit","schema":{"type":"integer"}},{"description":"Page number to retrieve (default 1)","in":"query","name":"page","schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.PaginationResponse-dto_LeasingRequest"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format or limit parameter is incorrect or page parameter is incorrect"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"}},"security":[{"Bearer":[]}],"summary":"Get all leasing request by userid","tags":["request"]}},"/request/{id}":{"delete":{"description":"Delete a leasing request in the database","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized or only admin can delete a request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to delete leasing request"}},"security":[{"Bearer":[]}],"summary":"Delete a leasing request","tags":["request"]},"post":{"description":"Add a new leasing request to the database","parameters":[{"description":"DormID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_LeasingRequest"}}},"description":"Dorm successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Dorm not found or leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or failed to save leasing request to database"}},"security":[{"Bearer":[]}],"summary":"Create a new leasing request","tags":["request"]}},"/request/{id}/approve":{"patch":{"description":"Approve a leasing request","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Incorrect UUID format"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized or only lessor can approve a request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found or request is not in the pending status"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing request"}},"security":[{"Bearer":[]}],"summary":"Approve a leasing request","tags":["request"]}},"/request/{id}/cancel":{"patch":{"description":"Cancel a leasing request","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found or request is not in the pending status"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing request"}},"security":[{"Bearer":[]}],"summary":"Cancel a leasing request","tags":["request"]}},"/request/{id}/reject":{"patch":{"description":"Reject a leasing request","parameters":[{"description":"LeasingRequestId","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found or request is not in the pending status"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized or only lessor can reject a request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing request not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Can not parse UUID or Failed to update leasing request"}},"security":[{"Bearer":[]}],"summary":"Reject a leasing request","tags":["request"]}},"/transaction":{"post":{"description":"Create a transaction","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.TransactionRequestBody"}}},"description":"Transaction request body","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_CreateTransactionResponseBody"}}},"description":"Transaction created successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"leasing history not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Create a transaction","tags":["transaction"]}},"/user":{"patch":{"description":"Update user information","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.UserInformationRequestBody"}}},"description":"user information","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_UserResponse"}}},"description":"user successfully updated account information"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot update your account information"}},"security":[{"Bearer":[]}],"summary":"Update user information","tags":["user"]}},"/user/":{"delete":{"description":"Delete a user account","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"204":{"description":"account successfully deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"cannot parse uuid or cannot delete user"}},"security":[{"Bearer":[]}],"summary":"Delete a user account","tags":["user"]}},"/user/me":{"get":{"description":"Get user information","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_UserResponse"}}},"description":"get user information successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot get user information"}},"security":[{"Bearer":[]}],"summary":"Get user information","tags":["user"]}},"/user/newpassword":{"post":{"description":"Reset password","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ResetPasswordRequestBody"}}},"description":"token","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"password reset successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot reset password"}},"summary":"Reset password","tags":["user"]}},"/user/resend":{"post":{"description":"Re send the confirmation email","responses":{"204":{"description":"resend verification email successfully"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot verification email"}},"security":[{"Bearer":[]}],"summary":"SendConfirmationEmailAgain","tags":["user"]}},"/user/resetpassword":{"post":{"description":"Resend verification email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ResetPasswordCreateRequestBody"}}},"description":"token","required":true},"responses":{"204":{"description":"email is sent to user successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot resend verification email"}},"summary":"Resend verification email","tags":["user"]}},"/user/studentEvidence":{"post":{"description":"Upload an image of a student ID card, by attaching the image as a value for the key field name \"image\", as a multipart form-data","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"file"}}},"description":"Student ID image","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_StudentEvidenceUploadResponseBody"}}},"description":"Evidence uploaded successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"File is required"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"User not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"Server failed to upload file"}},"security":[{"Bearer":[]}],"summary":"Upload an evidence for student verification","tags":["user"]}},"/user/verify":{"post":{"description":"Verify email","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.VerifyRequestBody"}}},"description":"token","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_TokenWithUserInformationResponseBody"}}},"description":"email is verified successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is invalid"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot verify your email"}},"summary":"Verify email","tags":["user"]}},"/user/{id}":{"get":{"description":"Get User By ID","parameters":[{"description":"user id","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_UserResponse"}}},"description":"get user information successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot get user information"}},"security":[{"Bearer":[]}],"summary":"GetUserByID","tags":["user"]}},"/user/{id}/studentEvidence":{"get":{"description":"Get student evidence by user id","parameters":[{"description":"userID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.SuccessResponse-dto_StudentEvidenceUploadResponseBody"}}},"description":"Get student evidence successfully"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"invalid user id"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"your request is unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"unauthorized to view this evidence"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"User or evidence not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/dto.ErrorResponse"}}},"description":"system cannot get user's student evidence"}},"security":[{"Bearer":[]}],"summary":"Get student evidence by user id","tags":["user"]}}},
     "openapi": "3.1.0"
 }
\ No newline at end of file
diff --git a/docs/swagger.yaml b/docs/swagger.yaml
index 5964cb1c..301c91ab 100644
--- a/docs/swagger.yaml
+++ b/docs/swagger.yaml
@@ -292,6 +292,13 @@ components:
       - RequestAccepted
       - RequestRejected
       - RequestCanceled
+    dto.StudentEvidenceUploadResponseBody:
+      properties:
+        expired:
+          type: string
+        url:
+          type: string
+      type: object
     dto.SuccessResponse-dto_CreateTransactionResponseBody:
       properties:
         data:
@@ -327,6 +334,11 @@ components:
         data:
           $ref: '#/components/schemas/dto.OwnershipProofResponseBody'
       type: object
+    dto.SuccessResponse-dto_StudentEvidenceUploadResponseBody:
+      properties:
+        data:
+          $ref: '#/components/schemas/dto.StudentEvidenceUploadResponseBody'
+      type: object
     dto.SuccessResponse-dto_TokenResponseBody:
       properties:
         data:
@@ -435,8 +447,6 @@ components:
           type: string
         role:
           type: string
-        studentEvidence:
-          type: string
         username:
           type: string
       type: object
@@ -1995,6 +2005,58 @@ paths:
       summary: GetUserByID
       tags:
       - user
+  /user/{id}/studentEvidence:
+    get:
+      description: Get student evidence by user id
+      parameters:
+      - description: userID
+        in: path
+        name: id
+        required: true
+        schema:
+          type: string
+      responses:
+        "200":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/dto.SuccessResponse-dto_StudentEvidenceUploadResponseBody'
+          description: Get student evidence successfully
+        "400":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/dto.ErrorResponse'
+          description: invalid user id
+        "401":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/dto.ErrorResponse'
+          description: your request is unauthorized
+        "403":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/dto.ErrorResponse'
+          description: unauthorized to view this evidence
+        "404":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/dto.ErrorResponse'
+          description: User or evidence not found
+        "500":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/dto.ErrorResponse'
+          description: system cannot get user's student evidence
+      security:
+      - Bearer: []
+      summary: Get student evidence by user id
+      tags:
+      - user
   /user/me:
     get:
       description: Get user information
@@ -2099,6 +2161,53 @@ paths:
       summary: Resend verification email
       tags:
       - user
+  /user/studentEvidence:
+    post:
+      description: Upload an image of a student ID card, by attaching the image as
+        a value for the key field name "image", as a multipart form-data
+      requestBody:
+        content:
+          multipart/form-data:
+            schema:
+              type: file
+        description: Student ID image
+        required: true
+      responses:
+        "200":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/dto.SuccessResponse-dto_StudentEvidenceUploadResponseBody'
+          description: Evidence uploaded successfully
+        "400":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/dto.ErrorResponse'
+          description: File is required
+        "401":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/dto.ErrorResponse'
+          description: your request is unauthorized
+        "404":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/dto.ErrorResponse'
+          description: User not found
+        "500":
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/dto.ErrorResponse'
+          description: Server failed to upload file
+      security:
+      - Bearer: []
+      summary: Upload an evidence for student verification
+      tags:
+      - user
   /user/verify:
     post:
       description: Verify email
diff --git a/internal/core/domain/user.go b/internal/core/domain/user.go
index 6594e79b..21b9bbc0 100644
--- a/internal/core/domain/user.go
+++ b/internal/core/domain/user.go
@@ -194,7 +194,6 @@ func (u *User) ToDTO() dto.UserResponse {
 		FilledPersonalInfo: u.FilledPersonalInfo,
 		Lifestyles:         lifestyles,
 		PhoneNumber:        u.PhoneNumber,
-		StudentEvidence:    u.StudentEvidence,
 		IsStudentVerified:  u.IsStudentVerified,
 	}
 }
diff --git a/internal/core/ports/user_port.go b/internal/core/ports/user_port.go
index 93ff984f..05ed83b0 100644
--- a/internal/core/ports/user_port.go
+++ b/internal/core/ports/user_port.go
@@ -2,6 +2,7 @@ package ports
 
 import (
 	"context"
+	"io"
 
 	"github.com/PitiNarak/condormhub-backend/internal/core/domain"
 	"github.com/PitiNarak/condormhub-backend/internal/dto"
@@ -29,6 +30,8 @@ type UserService interface {
 	ResetPasswordCreate(context.Context, string) error
 	ResetPassword(context.Context, string, string) (*domain.User, string, string, error)
 	DeleteAccount(userID uuid.UUID) error
+	UploadStudentEvidence(ctx context.Context, filename string, contentType string, fileData io.Reader, userID uuid.UUID) (string, error)
+	GetStudentEvidenceByID(ctx context.Context, id uuid.UUID, isSelf bool, isAdmin bool) (*dto.StudentEvidenceUploadResponseBody, error)
 	ResendVerificationEmailService(ctx context.Context, email string) error
 }
 
@@ -43,5 +46,7 @@ type UserHandler interface {
 	ResetPassword(c *fiber.Ctx) error
 	DeleteAccount(c *fiber.Ctx) error
 	GetUserByID(c *fiber.Ctx) error
+	UploadStudentEvidence(c *fiber.Ctx) error
+	GetStudentEvidenceByID(c *fiber.Ctx) error
 	ResendVerificationEmailHandler(c *fiber.Ctx) error
 }
diff --git a/internal/core/services/user_service.go b/internal/core/services/user_service.go
index 2e443726..4412b022 100644
--- a/internal/core/services/user_service.go
+++ b/internal/core/services/user_service.go
@@ -3,6 +3,10 @@ package services
 import (
 	"context"
 	"errors"
+	"fmt"
+	"io"
+	"strings"
+	"time"
 
 	"github.com/PitiNarak/condormhub-backend/internal/core/domain"
 	"github.com/PitiNarak/condormhub-backend/internal/core/ports"
@@ -10,6 +14,7 @@ import (
 	"github.com/PitiNarak/condormhub-backend/pkg/apperror"
 	"github.com/PitiNarak/condormhub-backend/pkg/email"
 	"github.com/PitiNarak/condormhub-backend/pkg/jwt"
+	"github.com/PitiNarak/condormhub-backend/pkg/storage"
 	"github.com/google/uuid"
 	"golang.org/x/crypto/bcrypt"
 )
@@ -18,10 +23,11 @@ type UserService struct {
 	userRepo     ports.UserRepository
 	emailService email.Email
 	jwtUtils     *jwt.JWTUtils
+	storage      *storage.Storage
 }
 
-func NewUserService(UserRepo ports.UserRepository, EmailService email.Email, jwtUtils *jwt.JWTUtils) *UserService {
-	return &UserService{userRepo: UserRepo, emailService: EmailService, jwtUtils: jwtUtils}
+func NewUserService(UserRepo ports.UserRepository, EmailService email.Email, jwtUtils *jwt.JWTUtils, storage *storage.Storage) ports.UserService {
+	return &UserService{userRepo: UserRepo, emailService: EmailService, jwtUtils: jwtUtils, storage: storage}
 }
 
 func (s *UserService) Create(ctx context.Context, user *domain.User) (string, string, error) {
@@ -221,6 +227,65 @@ func (s *UserService) DeleteAccount(userID uuid.UUID) error {
 	return nil
 }
 
+func (s *UserService) UploadStudentEvidence(ctx context.Context, filename string, contentType string, fileData io.Reader, userID uuid.UUID) (string, error) {
+	filename = strings.ReplaceAll(filename, " ", "-")
+	uuid := uuid.New().String()
+	fileKey := fmt.Sprintf("user/%s/student-evidence/%s-%s", userID, uuid, filename)
+
+	if err := s.storage.UploadFile(ctx, fileKey, contentType, fileData, storage.PrivateBucket); err != nil {
+		return "", apperror.InternalServerError(err, "error uploading file")
+	}
+	url, err := s.storage.GetSignedUrl(ctx, fileKey, time.Minute*60)
+	if err != nil {
+		return "", apperror.InternalServerError(err, "error getting signed url")
+	}
+
+	user, err := s.userRepo.GetUserByID(userID)
+	if err != nil {
+		return "", err
+	}
+
+	if user.StudentEvidence != "" {
+		if err = s.storage.DeleteFile(ctx, user.StudentEvidence, storage.PrivateBucket); err != nil {
+			return "", apperror.InternalServerError(err, "error deleting file")
+		}
+	}
+
+	user.StudentEvidence = fileKey
+	err = s.userRepo.UpdateUser(user)
+	if err != nil {
+		return "", err
+	}
+
+	return url, nil
+}
+
+func (s *UserService) GetStudentEvidenceByID(ctx context.Context, id uuid.UUID, isSelf bool, isAdmin bool) (*dto.StudentEvidenceUploadResponseBody, error) {
+	if !isSelf && !isAdmin {
+		return nil, apperror.ForbiddenError(errors.New("unauthorized action"), "You do not have permission to view this evidence")
+	}
+
+	user, err := s.GetUserByID(id)
+	if err != nil {
+		return nil, err
+	}
+
+	if user.StudentEvidence == "" {
+		return nil, apperror.NotFoundError(errors.New("student evidence for this user does not exist"), "Student evidence for this user does not exist")
+	}
+
+	url, err := s.storage.GetSignedUrl(ctx, user.StudentEvidence, time.Minute*60)
+	if err != nil {
+		return nil, apperror.InternalServerError(err, "error getting signed url")
+	}
+
+	res := new(dto.StudentEvidenceUploadResponseBody)
+	res.ImageUrl = url
+	res.Expired = time.Now().Add(time.Hour)
+
+	return res, nil
+}
+
 func (s *UserService) ResendVerificationEmailService(ctx context.Context, email string) error {
 	user, err := s.userRepo.GetUserByEmail(email)
 	if err != nil {
diff --git a/internal/dto/user_body.go b/internal/dto/user_body.go
index 8043fd6d..209781c2 100644
--- a/internal/dto/user_body.go
+++ b/internal/dto/user_body.go
@@ -45,6 +45,10 @@ type UserResponse struct {
 	FilledPersonalInfo bool      `json:"filledPersonalInfo"`
 	Lifestyles         []string  `json:"lifestyles"`
 	PhoneNumber        string    `json:"phoneNumber"`
-	StudentEvidence    string    `json:"studentEvidence"`
 	IsStudentVerified  bool      `json:"isStudentVerified"`
 }
+
+type StudentEvidenceUploadResponseBody struct {
+	ImageUrl string    `json:"url"`
+	Expired  time.Time `json:"expired"`
+}
diff --git a/internal/handler/user_handler.go b/internal/handler/user_handler.go
index cd75f090..d8330572 100644
--- a/internal/handler/user_handler.go
+++ b/internal/handler/user_handler.go
@@ -2,6 +2,7 @@ package handler
 
 import (
 	"errors"
+	"time"
 
 	"github.com/PitiNarak/condormhub-backend/internal/core/domain"
 	"github.com/PitiNarak/condormhub-backend/internal/core/ports"
@@ -377,6 +378,83 @@ func (h *UserHandler) GetUserByID(c *fiber.Ctx) error {
 	return c.Status(fiber.StatusOK).JSON(dto.Success(user.ToDTO()))
 }
 
+// UploadStudentEvidence godoc
+// @Summary Upload an evidence for student verification
+// @Description Upload an image of a student ID card, by attaching the image as a value for the key field name "image", as a multipart form-data
+// @Tags user
+// @Security Bearer
+// @Accept multipart/form-data
+// @Produce json
+// @Param image formData file true "Student ID image"
+// @Success 200 {object} dto.SuccessResponse[dto.StudentEvidenceUploadResponseBody] "Evidence uploaded successfully"
+// @Failure 400 {object} dto.ErrorResponse "File is required"
+// @Failure 401 {object} dto.ErrorResponse "your request is unauthorized"
+// @Failure 404 {object} dto.ErrorResponse "User not found"
+// @Failure 500 {object} dto.ErrorResponse "Server failed to upload file"
+// @Router /user/studentEvidence [post]
+func (h *UserHandler) UploadStudentEvidence(c *fiber.Ctx) error {
+	userID := c.Locals("userID").(uuid.UUID)
+
+	file, err := c.FormFile("image")
+	if err != nil {
+		return apperror.BadRequestError(err, "file is required")
+	}
+
+	fileData, err := file.Open()
+	if err != nil {
+		return apperror.InternalServerError(err, "error opening file")
+	}
+	defer fileData.Close()
+
+	contentType := file.Header.Get("Content-Type")
+	url, err := h.userService.UploadStudentEvidence(c.Context(), file.Filename, contentType, fileData, userID)
+	if err != nil {
+		if apperror.IsAppError(err) {
+			return err
+		}
+	}
+
+	return c.Status(fiber.StatusOK).JSON(dto.Success(dto.StudentEvidenceUploadResponseBody{ImageUrl: url, Expired: time.Now().Add(time.Hour)}))
+}
+
+// GetStudentEvidenceByID godoc
+// @Summary Get student evidence by user id
+// @Description Get student evidence by user id
+// @Tags user
+// @Security Bearer
+// @Produce json
+// @Param id path string true "userID"
+// @Success 200 {object} dto.SuccessResponse[dto.StudentEvidenceUploadResponseBody] "Get student evidence successfully"
+// @Failure 400 {object} dto.ErrorResponse "invalid user id"
+// @Failure 401 {object} dto.ErrorResponse "your request is unauthorized"
+// @Failure 403 {object} dto.ErrorResponse "unauthorized to view this evidence"
+// @Failure 404 {object} dto.ErrorResponse "User or evidence not found"
+// @Failure 500 {object} dto.ErrorResponse "system cannot get user's student evidence"
+// @Router /user/{id}/studentEvidence [get]
+func (h *UserHandler) GetStudentEvidenceByID(c *fiber.Ctx) error {
+	userID, err := uuid.Parse(c.Params("id"))
+	if err != nil {
+		return apperror.BadRequestError(err, "invalid user id")
+	}
+
+	localUser := c.Locals("user").(*domain.User)
+	if localUser.Role == "" {
+		return apperror.UnauthorizedError(errors.New("unauthorized"), "user role is missing")
+	}
+	isSelf := localUser.ID == userID
+	isAdmin := localUser.Role == domain.AdminRole
+
+	evidence, err := h.userService.GetStudentEvidenceByID(c.Context(), userID, isSelf, isAdmin)
+	if err != nil {
+		if apperror.IsAppError(err) {
+			return err
+		}
+		return apperror.InternalServerError(err, "get student evidence by id failed")
+	}
+
+	return c.Status(fiber.StatusOK).JSON(dto.Success(evidence))
+}
+
 // SendConfirmationEmailAgain godoc
 // @Summary SendConfirmationEmailAgain
 // @Description Re send the confirmation email
diff --git a/internal/repository/user_repository.go b/internal/repository/user_repository.go
index a1608e65..0503d00c 100644
--- a/internal/repository/user_repository.go
+++ b/internal/repository/user_repository.go
@@ -49,7 +49,7 @@ func (r *UserRepo) GetUserByID(userID uuid.UUID) (*domain.User, error) {
 	var user domain.User
 	result := r.db.Where("id = ?", userID).First(&user)
 	if result.Error != nil {
-		return nil, apperror.InternalServerError(result.Error, "user not found")
+		return nil, apperror.NotFoundError(result.Error, "user not found")
 	}
 	return &user, result.Error
 }
diff --git a/internal/server/route.go b/internal/server/route.go
index 5db00b61..952b8e53 100644
--- a/internal/server/route.go
+++ b/internal/server/route.go
@@ -44,6 +44,9 @@ func (s *Server) initUserRoutes() {
 
 	userRoutes.Patch("/", s.authMiddleware.Auth, s.handler.user.UpdateUserInformation)
 	userRoutes.Delete("/", s.authMiddleware.Auth, s.handler.user.DeleteAccount)
+
+	userRoutes.Post("/studentEvidence", s.authMiddleware.Auth, s.handler.user.UploadStudentEvidence)
+	userRoutes.Get("/:id/studentEvidence", s.authMiddleware.Auth, s.handler.user.GetStudentEvidenceByID)
 }
 
 func (s *Server) initAuthRoutes() {
diff --git a/internal/server/service.go b/internal/server/service.go
index 8bc8bf35..0d5e5102 100644
--- a/internal/server/service.go
+++ b/internal/server/service.go
@@ -18,7 +18,7 @@ type service struct {
 
 func (s *Server) initService() {
 	email := email.NewEmailService(s.smtpConfig, s.jwtUtils)
-	user := services.NewUserService(s.repository.user, email, s.jwtUtils)
+	user := services.NewUserService(s.repository.user, email, s.jwtUtils, s.storage)
 	dorm := services.NewDormService(s.repository.dorm, s.storage)
 	leasingHistory := services.NewLeasingHistoryService(s.repository.leasingHistory, s.repository.dorm)
 	order := services.NewOrderService(s.repository.order, s.repository.leasingHistory)


Reviews:
user: login: yokeTH
body: minor
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-22T09:34:12Z
user: login: inecrft
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-22T13:44:56Z
user: login: inecrft
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-22T13:54:19Z
user: login: inecrft
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-22T13:54:26Z
user: login: yokeTH
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-23T02:30:16Z

Review comments:
diff_hunk: @@ -211,3 +217,62 @@ func (s *UserService) DeleteAccount(userID uuid.UUID) error {
 	}
 	return nil
 }
+
+func (s *UserService) UploadStudentEvidence(ctx context.Context, filename string, contentType string, fileData io.Reader, userID uuid.UUID) (string, error) {
+	filename = strings.ReplaceAll(filename, " ", "-")
+	uuid := uuid.New().String()
+	fileKey := fmt.Sprintf("student-evidence/%s-%s", uuid, filename)
path: internal/core/services/user_service.go
user: login: yokeTH
body: ถ้าเอาไปเก็บเป็น `/user/<userid>/student-evidence/` คิดว่าจะเป็นระเบียบกว่าครับ
created_at: 2025-03-22T09:27:57Z
author_association: CONTRIBUTOR
diff_hunk: @@ -45,6 +45,10 @@ type UserResponse struct {
 	FilledPersonalInfo bool      `json:"filledPersonalInfo"`
 	Lifestyles         []string  `json:"lifestyles"`
 	PhoneNumber        string    `json:"phoneNumber"`
-	StudentEvidence    string    `json:"studentEvidence"`
 	IsStudentVerified  bool      `json:"isStudentVerified"`
 }
+
+type StudentEvidenceUploadResponseBody struct {
+	ImageUrl string    `json:"url"`
+	Expires  time.Time `json:"expires"`
path: internal/dto/user_body.go
user: login: yokeTH
body: ใช้เป็นถ้าหมดเวลาตอนไหนใช้ `expired` ถ้าเป็น หมดเวลาในอีกเท่าไหร่ใช้ `expireIn` น่าจะ clear มากกว่า
created_at: 2025-03-22T09:31:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -375,3 +376,80 @@ func (h *UserHandler) GetUserByID(c *fiber.Ctx) error {
 
 	return c.Status(fiber.StatusOK).JSON(dto.Success(user.ToDTO()))
 }
+
+// UploadStudentEvidence godoc
+// @Summary Upload an evidence for student verification
+// @Description Upload an image of a student ID card, by attaching the image as a value for the key field name "image", as a multipart form-data
+// @Tags user
+// @Security Bearer
+// @Accept multipart/form-data
+// @Produce json
+// @Param image formData file true "Student ID image"
+// @Success 200 {object} dto.SuccessResponse[dto.StudentEvidenceUploadResponseBody] "Evidence uploaded successfully"
+// @Failure 400 {object} dto.ErrorResponse "File is required"
+// @Failure 401 {object} dto.ErrorResponse "your request is unauthorized"
+// @Failure 404 {object} dto.ErrorResponse "User not found"
+// @Failure 500 {object} dto.ErrorResponse "Server failed to upload file"
+// @Router /user/student-evidence [post]
path: internal/handler/user_handler.go
user: login: yokeTH
body: `/user/studentEvidence` ถ้าเอาตาม convention
created_at: 2025-03-22T09:33:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -45,6 +45,10 @@ type UserResponse struct {
 	FilledPersonalInfo bool      `json:"filledPersonalInfo"`
 	Lifestyles         []string  `json:"lifestyles"`
 	PhoneNumber        string    `json:"phoneNumber"`
-	StudentEvidence    string    `json:"studentEvidence"`
 	IsStudentVerified  bool      `json:"isStudentVerified"`
 }
+
+type StudentEvidenceUploadResponseBody struct {
+	ImageUrl string    `json:"url"`
+	Expires  time.Time `json:"expires"`
path: internal/dto/user_body.go
user: login: inecrft
body: ภาษาไทยกุไม่แข็ง ถ้าเป็นแบบนี้ ใช้ expired ใช่ปะ
<img width="346" alt="image" src="https://github.com/user-attachments/assets/c2f33909-de10-43be-a55a-8b024a26de06" />

created_at: 2025-03-22T13:44:56Z
author_association: CONTRIBUTOR
diff_hunk: @@ -211,3 +217,62 @@ func (s *UserService) DeleteAccount(userID uuid.UUID) error {
 	}
 	return nil
 }
+
+func (s *UserService) UploadStudentEvidence(ctx context.Context, filename string, contentType string, fileData io.Reader, userID uuid.UUID) (string, error) {
+	filename = strings.ReplaceAll(filename, " ", "-")
+	uuid := uuid.New().String()
+	fileKey := fmt.Sprintf("student-evidence/%s-%s", uuid, filename)
path: internal/core/services/user_service.go
user: login: inecrft
body: fixed
created_at: 2025-03-22T13:54:19Z
author_association: CONTRIBUTOR
diff_hunk: @@ -375,3 +376,80 @@ func (h *UserHandler) GetUserByID(c *fiber.Ctx) error {
 
 	return c.Status(fiber.StatusOK).JSON(dto.Success(user.ToDTO()))
 }
+
+// UploadStudentEvidence godoc
+// @Summary Upload an evidence for student verification
+// @Description Upload an image of a student ID card, by attaching the image as a value for the key field name "image", as a multipart form-data
+// @Tags user
+// @Security Bearer
+// @Accept multipart/form-data
+// @Produce json
+// @Param image formData file true "Student ID image"
+// @Success 200 {object} dto.SuccessResponse[dto.StudentEvidenceUploadResponseBody] "Evidence uploaded successfully"
+// @Failure 400 {object} dto.ErrorResponse "File is required"
+// @Failure 401 {object} dto.ErrorResponse "your request is unauthorized"
+// @Failure 404 {object} dto.ErrorResponse "User not found"
+// @Failure 500 {object} dto.ErrorResponse "Server failed to upload file"
+// @Router /user/student-evidence [post]
path: internal/handler/user_handler.go
user: login: inecrft
body: fixed
created_at: 2025-03-22T13:54:26Z
author_association: CONTRIBUTOR

PR comments:
user: login: yokeTH
created_at: 2025-03-21T11:33:43Z
body: Admin approve/reject evidence are missing?
author_association: CONTRIBUTOR
user: login: inecrft
created_at: 2025-03-21T11:34:33Z
body: > Admin approve/reject evidence are missing?

I think that should be part of the next EPIC the Admin system, no?
author_association: CONTRIBUTOR
user: login: yokeTH
created_at: 2025-03-21T11:36:25Z
body: > > Admin approve/reject evidence are missing?
> 
> I think that should be part of the next EPIC the Admin system, no?

Make sense.
author_association: CONTRIBUTOR