diff --git a/docs/docs.go b/docs/docs.go index d929fd3..4b2e9e3 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -5,7 +5,7 @@ package docs import "github.com/swaggo/swag/v2" const docTemplate = `{ - "schemes": {{ marshal .Schemes }},"swagger":"2.0","info":{"description":"{{escape .Description}}","title":"{{.Title}}","termsOfService":"http://swagger.io/terms/","contact":{"name":"API Support","url":"http://www.swagger.io/support","email":"support@swagger.io"},"license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"version":"{{.Version}}"},"host":"{{.Host}}","basePath":"{{.BasePath}}","paths":{"/images/{path}":{"get":{"description":"get image by path","produces":["image/png","image/jpeg"],"summary":"Get an image by path","parameters":[{"type":"string","description":"Path to image","name":"path","in":"query","required":true}],"responses":{"200":{"description":"OK"}}}},"/post":{"get":{"description":"Return first 5 posts","produces":["application/json"],"tags":["post"],"summary":"Get all posts","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.GetListPostResponseItem"}}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"post":{"description":"Create new post in blog","consumes":["application/json"],"produces":["application/json"],"tags":["post"],"summary":"Create new post","parameters":[{"description":"Post data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.CreatePostRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/responses.PostResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/post/offset/{offset}":{"get":{"description":"return 5 posts after first offset posts","produces":["application/json"],"tags":["post"],"summary":"Get posts after offset","parameters":[{"type":"integer","description":"Offset of posts","name":"offset","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.GetListPostResponseItem"}}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/post/{id}":{"get":{"description":"get post by id","produces":["application/json"],"tags":["post"],"summary":"Get post by id","parameters":[{"type":"string","description":"Id of post","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.PostResponse"}}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"put":{"description":"update post content","produces":["application/json"],"tags":["post"],"summary":"Update post content","parameters":[{"type":"string","description":"Id of post","name":"id","in":"path","required":true},{"description":"Post data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.PutPostRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.PostResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"delete":{"description":"Delete post by id","produces":["application/json"],"tags":["post"],"summary":"Delete post","parameters":[{"type":"string","description":"Id of post","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/user/":{"get":{"description":"Return all registered users","produces":["application/json"],"tags":["user"],"summary":"Get all users","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.UserResponse"}}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"post":{"description":"Creates new user in system","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Create new user","parameters":[{"description":"User data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.CreateUserRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/user/name/{name}":{"get":{"description":"Find user by username","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Find user by username","parameters":[{"type":"string","description":"User name","name":"name","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/user/{id}":{"get":{"description":"Find user by id","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Find user by id","parameters":[{"type":"string","description":"user id","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"put":{"description":"Change the user's name and password","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Change user","parameters":[{"type":"string","description":"User id","name":"id","in":"path","required":true},{"description":"User data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.PutUserRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"delete":{"description":"Delete user","produces":["application/json"],"tags":["user"],"summary":"Delete user","parameters":[{"type":"string","description":"User id","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}}},"definitions":{"requests.CreatePostRequest":{"type":"object","required":["content","description","title","userId"],"properties":{"content":{"type":"string","minLength":36},"description":{"type":"string","maxLength":255,"minLength":8},"title":{"type":"string","maxLength":255,"minLength":8},"userId":{"type":"string"}}},"requests.CreateUserRequest":{"type":"object","required":["password","username"],"properties":{"password":{"type":"string","maxLength":32,"minLength":6},"username":{"type":"string","maxLength":32,"minLength":3}}},"requests.PutPostRequest":{"type":"object","properties":{"content":{"type":"string"},"description":{"type":"string"},"title":{"type":"string"}}},"requests.PutUserRequest":{"type":"object","required":["password","username"],"properties":{"password":{"type":"string","maxLength":32,"minLength":6},"username":{"type":"string","maxLength":32,"minLength":3}}},"responses.ErrorResponse":{"type":"object","properties":{"error_code":{"type":"integer"},"message":{"type":"string"}}},"responses.GetListPostResponseItem":{"type":"object","properties":{"description":{"type":"string"},"id":{"type":"string"},"title":{"type":"string"}}},"responses.PostResponse":{"type":"object","properties":{"content":{"type":"string"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"title":{"type":"string"},"updatedAt":{"type":"string"},"userId":{"type":"string"}}},"responses.UserResponse":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"}}}},"securityDefinitions":{"BasicAuth":{"type":"basic"}}}` + "schemes": {{ marshal .Schemes }},"swagger":"2.0","info":{"description":"{{escape .Description}}","title":"{{.Title}}","termsOfService":"http://swagger.io/terms/","contact":{"name":"API Support","url":"http://www.swagger.io/support","email":"support@swagger.io"},"license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"version":"{{.Version}}"},"host":"{{.Host}}","basePath":"{{.BasePath}}","paths":{"/images/{path}":{"get":{"description":"get image by path","produces":["image/png","image/jpeg"],"summary":"Get an image by path","parameters":[{"type":"string","description":"Path to image","name":"path","in":"query","required":true}],"responses":{"200":{"description":"OK"}}}},"/post":{"get":{"description":"Return first 5 posts","produces":["application/json"],"tags":["post"],"summary":"Get all posts","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.GetListPostResponseItem"}}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"post":{"description":"Create new post in blog","consumes":["application/json"],"produces":["application/json"],"tags":["post"],"summary":"Create new post","parameters":[{"description":"Post data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.CreatePostRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/responses.PostResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/post/offset/{offset}":{"get":{"description":"return 5 posts after first offset posts","produces":["application/json"],"tags":["post"],"summary":"Get posts after offset","parameters":[{"type":"integer","description":"Offset of posts","name":"offset","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.GetListPostResponseItem"}}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/post/{id}":{"get":{"description":"get post by id","produces":["application/json"],"tags":["post"],"summary":"Get post by id","parameters":[{"type":"string","description":"Id of post","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.PostResponse"}}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"put":{"description":"update post content","produces":["application/json"],"tags":["post"],"summary":"Update post content","parameters":[{"type":"string","description":"Id of post","name":"id","in":"path","required":true},{"description":"Post data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.PutPostRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.PostResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"delete":{"description":"Delete post by id","produces":["application/json"],"tags":["post"],"summary":"Delete post","parameters":[{"type":"string","description":"Id of post","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/user/":{"get":{"description":"Return all registered users","produces":["application/json"],"tags":["user"],"summary":"Get all users","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.UserResponse"}}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"post":{"description":"Creates new user in system","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Create new user","parameters":[{"description":"User data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.CreateUserRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/user/name/{name}":{"get":{"description":"Find user by username","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Find user by username","parameters":[{"type":"string","description":"User name","name":"name","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/user/{id}":{"get":{"description":"Find user by id","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Find user by id","parameters":[{"type":"string","description":"user id","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"put":{"description":"Change the user's name and password","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Change user","parameters":[{"type":"string","description":"User id","name":"id","in":"path","required":true},{"description":"User data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.PutUserRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"delete":{"description":"Delete user","produces":["application/json"],"tags":["user"],"summary":"Delete user","parameters":[{"type":"string","description":"User id","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}}},"definitions":{"requests.CreatePostRequest":{"type":"object","required":["content","description","title","userId"],"properties":{"content":{"type":"string","minLength":36},"description":{"type":"string","maxLength":255,"minLength":8},"title":{"type":"string","maxLength":255,"minLength":8},"userId":{"type":"string"}}},"requests.CreateUserRequest":{"type":"object","required":["password","username"],"properties":{"password":{"type":"string","maxLength":32,"minLength":6},"username":{"type":"string","maxLength":32,"minLength":3}}},"requests.PutPostRequest":{"type":"object","properties":{"content":{"type":"string"},"description":{"type":"string"},"title":{"type":"string"}}},"requests.PutUserRequest":{"type":"object","required":["password","username"],"properties":{"password":{"type":"string","maxLength":32,"minLength":6},"username":{"type":"string","maxLength":32,"minLength":3}}},"responses.ErrorResponse":{"type":"object","properties":{"error_code":{"type":"integer"},"message":{"type":"string"}}},"responses.GetListPostResponseItem":{"type":"object","properties":{"description":{"type":"string"},"id":{"type":"string"},"title":{"type":"string"}}},"responses.PostResponse":{"type":"object","properties":{"content":{"type":"string"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"title":{"type":"string"},"updatedAt":{"type":"string"},"userId":{"type":"string"}}},"responses.UserResponse":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"}}}},"securityDefinitions":{"BasicAuth":{"type":"basic"}}}` // SwaggerInfo holds exported Swagger Info so clients can modify it var SwaggerInfo = &swag.Spec{ diff --git a/docs/swagger.json b/docs/swagger.json index eba4d3a..97a1a1b 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -1 +1 @@ -{"swagger":"2.0","info":{"description":"58team blog's backend","title":"58team blog backend","termsOfService":"http://swagger.io/terms/","contact":{"name":"API Support","url":"http://www.swagger.io/support","email":"support@swagger.io"},"license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"version":"1.0"},"host":"localhost:8080","basePath":"/api/v1","paths":{"/images/{path}":{"get":{"description":"get image by path","produces":["image/png","image/jpeg"],"summary":"Get an image by path","parameters":[{"type":"string","description":"Path to image","name":"path","in":"query","required":true}],"responses":{"200":{"description":"OK"}}}},"/post":{"get":{"description":"Return first 5 posts","produces":["application/json"],"tags":["post"],"summary":"Get all posts","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.GetListPostResponseItem"}}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"post":{"description":"Create new post in blog","consumes":["application/json"],"produces":["application/json"],"tags":["post"],"summary":"Create new post","parameters":[{"description":"Post data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.CreatePostRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/responses.PostResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/post/offset/{offset}":{"get":{"description":"return 5 posts after first offset posts","produces":["application/json"],"tags":["post"],"summary":"Get posts after offset","parameters":[{"type":"integer","description":"Offset of posts","name":"offset","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.GetListPostResponseItem"}}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/post/{id}":{"get":{"description":"get post by id","produces":["application/json"],"tags":["post"],"summary":"Get post by id","parameters":[{"type":"string","description":"Id of post","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.PostResponse"}}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"put":{"description":"update post content","produces":["application/json"],"tags":["post"],"summary":"Update post content","parameters":[{"type":"string","description":"Id of post","name":"id","in":"path","required":true},{"description":"Post data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.PutPostRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.PostResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"delete":{"description":"Delete post by id","produces":["application/json"],"tags":["post"],"summary":"Delete post","parameters":[{"type":"string","description":"Id of post","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/user/":{"get":{"description":"Return all registered users","produces":["application/json"],"tags":["user"],"summary":"Get all users","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.UserResponse"}}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"post":{"description":"Creates new user in system","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Create new user","parameters":[{"description":"User data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.CreateUserRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/user/name/{name}":{"get":{"description":"Find user by username","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Find user by username","parameters":[{"type":"string","description":"User name","name":"name","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/user/{id}":{"get":{"description":"Find user by id","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Find user by id","parameters":[{"type":"string","description":"user id","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"put":{"description":"Change the user's name and password","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Change user","parameters":[{"type":"string","description":"User id","name":"id","in":"path","required":true},{"description":"User data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.PutUserRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"delete":{"description":"Delete user","produces":["application/json"],"tags":["user"],"summary":"Delete user","parameters":[{"type":"string","description":"User id","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}}},"definitions":{"requests.CreatePostRequest":{"type":"object","required":["content","description","title","userId"],"properties":{"content":{"type":"string","minLength":36},"description":{"type":"string","maxLength":255,"minLength":8},"title":{"type":"string","maxLength":255,"minLength":8},"userId":{"type":"string"}}},"requests.CreateUserRequest":{"type":"object","required":["password","username"],"properties":{"password":{"type":"string","maxLength":32,"minLength":6},"username":{"type":"string","maxLength":32,"minLength":3}}},"requests.PutPostRequest":{"type":"object","properties":{"content":{"type":"string"},"description":{"type":"string"},"title":{"type":"string"}}},"requests.PutUserRequest":{"type":"object","required":["password","username"],"properties":{"password":{"type":"string","maxLength":32,"minLength":6},"username":{"type":"string","maxLength":32,"minLength":3}}},"responses.ErrorResponse":{"type":"object","properties":{"error_code":{"type":"integer"},"message":{"type":"string"}}},"responses.GetListPostResponseItem":{"type":"object","properties":{"description":{"type":"string"},"id":{"type":"string"},"title":{"type":"string"}}},"responses.PostResponse":{"type":"object","properties":{"content":{"type":"string"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"title":{"type":"string"},"updatedAt":{"type":"string"},"userId":{"type":"string"}}},"responses.UserResponse":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"}}}},"securityDefinitions":{"BasicAuth":{"type":"basic"}}} \ No newline at end of file +{"swagger":"2.0","info":{"description":"58team blog's backend","title":"58team blog backend","termsOfService":"http://swagger.io/terms/","contact":{"name":"API Support","url":"http://www.swagger.io/support","email":"support@swagger.io"},"license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"},"version":"1.0"},"host":"localhost:8080","basePath":"/api/v1","paths":{"/images/{path}":{"get":{"description":"get image by path","produces":["image/png","image/jpeg"],"summary":"Get an image by path","parameters":[{"type":"string","description":"Path to image","name":"path","in":"query","required":true}],"responses":{"200":{"description":"OK"}}}},"/post":{"get":{"description":"Return first 5 posts","produces":["application/json"],"tags":["post"],"summary":"Get all posts","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.GetListPostResponseItem"}}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"post":{"description":"Create new post in blog","consumes":["application/json"],"produces":["application/json"],"tags":["post"],"summary":"Create new post","parameters":[{"description":"Post data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.CreatePostRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/responses.PostResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/post/offset/{offset}":{"get":{"description":"return 5 posts after first offset posts","produces":["application/json"],"tags":["post"],"summary":"Get posts after offset","parameters":[{"type":"integer","description":"Offset of posts","name":"offset","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.GetListPostResponseItem"}}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/post/{id}":{"get":{"description":"get post by id","produces":["application/json"],"tags":["post"],"summary":"Get post by id","parameters":[{"type":"string","description":"Id of post","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.PostResponse"}}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"put":{"description":"update post content","produces":["application/json"],"tags":["post"],"summary":"Update post content","parameters":[{"type":"string","description":"Id of post","name":"id","in":"path","required":true},{"description":"Post data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.PutPostRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.PostResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"delete":{"description":"Delete post by id","produces":["application/json"],"tags":["post"],"summary":"Delete post","parameters":[{"type":"string","description":"Id of post","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/user/":{"get":{"description":"Return all registered users","produces":["application/json"],"tags":["user"],"summary":"Get all users","responses":{"200":{"description":"OK","schema":{"type":"array","items":{"$ref":"#/definitions/responses.UserResponse"}}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"post":{"description":"Creates new user in system","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Create new user","parameters":[{"description":"User data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.CreateUserRequest"}}],"responses":{"201":{"description":"Created","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"409":{"description":"Conflict","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/user/name/{name}":{"get":{"description":"Find user by username","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Find user by username","parameters":[{"type":"string","description":"User name","name":"name","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/user/{id}":{"get":{"description":"Find user by id","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Find user by id","parameters":[{"type":"string","description":"user id","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"put":{"description":"Change the user's name and password","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Change user","parameters":[{"type":"string","description":"User id","name":"id","in":"path","required":true},{"description":"User data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.PutUserRequest"}}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.UserResponse"}},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}},"delete":{"description":"Delete user","produces":["application/json"],"tags":["user"],"summary":"Delete user","parameters":[{"type":"string","description":"User id","name":"id","in":"path","required":true}],"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"404":{"description":"Not Found","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}}},"definitions":{"requests.CreatePostRequest":{"type":"object","required":["content","description","title","userId"],"properties":{"content":{"type":"string","minLength":36},"description":{"type":"string","maxLength":255,"minLength":8},"title":{"type":"string","maxLength":255,"minLength":8},"userId":{"type":"string"}}},"requests.CreateUserRequest":{"type":"object","required":["password","username"],"properties":{"password":{"type":"string","maxLength":32,"minLength":6},"username":{"type":"string","maxLength":32,"minLength":3}}},"requests.PutPostRequest":{"type":"object","properties":{"content":{"type":"string"},"description":{"type":"string"},"title":{"type":"string"}}},"requests.PutUserRequest":{"type":"object","required":["password","username"],"properties":{"password":{"type":"string","maxLength":32,"minLength":6},"username":{"type":"string","maxLength":32,"minLength":3}}},"responses.ErrorResponse":{"type":"object","properties":{"error_code":{"type":"integer"},"message":{"type":"string"}}},"responses.GetListPostResponseItem":{"type":"object","properties":{"description":{"type":"string"},"id":{"type":"string"},"title":{"type":"string"}}},"responses.PostResponse":{"type":"object","properties":{"content":{"type":"string"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"title":{"type":"string"},"updatedAt":{"type":"string"},"userId":{"type":"string"}}},"responses.UserResponse":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"}}}},"securityDefinitions":{"BasicAuth":{"type":"basic"}}} \ No newline at end of file diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 1654a79..2b49736 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -194,6 +194,14 @@ paths: description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' + "404": + description: Not Found + schema: + $ref: '#/definitions/responses.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' summary: Delete post tags: - post @@ -218,6 +226,14 @@ paths: description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' + "404": + description: Not Found + schema: + $ref: '#/definitions/responses.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' summary: Get post by id tags: - post @@ -246,6 +262,14 @@ paths: description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' + "404": + description: Not Found + schema: + $ref: '#/definitions/responses.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' summary: Update post content tags: - post @@ -271,6 +295,10 @@ paths: description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' summary: Get posts after offset tags: - post @@ -290,6 +318,10 @@ paths: description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' summary: Get all users tags: - user @@ -315,6 +347,14 @@ paths: description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' + "409": + description: Conflict + schema: + $ref: '#/definitions/responses.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' summary: Create new user tags: - user @@ -336,6 +376,14 @@ paths: description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' + "404": + description: Not Found + schema: + $ref: '#/definitions/responses.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' summary: Delete user tags: - user @@ -360,6 +408,14 @@ paths: description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' + "404": + description: Not Found + schema: + $ref: '#/definitions/responses.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' summary: Find user by id tags: - user @@ -390,6 +446,14 @@ paths: description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' + "404": + description: Not Found + schema: + $ref: '#/definitions/responses.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' summary: Change user tags: - user @@ -415,6 +479,14 @@ paths: description: Bad Request schema: $ref: '#/definitions/responses.ErrorResponse' + "404": + description: Not Found + schema: + $ref: '#/definitions/responses.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' summary: Find user by username tags: - user diff --git a/internal/application/errors/already_exists_error.go b/internal/application/errors/already_exists_error.go new file mode 100644 index 0000000..141eacb --- /dev/null +++ b/internal/application/errors/already_exists_error.go @@ -0,0 +1,15 @@ +package errors + +type AlreadyExistsError struct { + msg string +} + +func NewAlreadyExistsError(msg string) *AlreadyExistsError { + return &AlreadyExistsError{ + msg: msg, + } +} + +func (e *AlreadyExistsError) Error() string { + return "Already exists: " + e.msg +} diff --git a/internal/application/errors/db_error.go b/internal/application/errors/db_error.go index 79b476b..d7f3711 100644 --- a/internal/application/errors/db_error.go +++ b/internal/application/errors/db_error.go @@ -4,12 +4,12 @@ type DBError struct { msg string } -func NewDBError(msg string) DBError { - return DBError{ +func NewDBError(msg string) *DBError { + return &DBError{ msg: msg, } } func (e *DBError) Error() string { - return e.msg + return "Database error:" + e.msg } diff --git a/internal/application/errors/not_found_error.go b/internal/application/errors/not_found_error.go index ac60c54..5bfd6ad 100644 --- a/internal/application/errors/not_found_error.go +++ b/internal/application/errors/not_found_error.go @@ -11,5 +11,5 @@ func NewNotFoundError(msg string) *NotFoundError { } func (e *NotFoundError) Error() string { - return e.msg + return "Not found error: " + e.msg } diff --git a/internal/application/errors/validation_error.go b/internal/application/errors/validation_error.go new file mode 100644 index 0000000..abf4061 --- /dev/null +++ b/internal/application/errors/validation_error.go @@ -0,0 +1,15 @@ +package errors + +type ValidationError struct { + msg string +} + +func NewValidationError(msg string) *ValidationError { + return &ValidationError{ + msg: msg, + } +} + +func (e *ValidationError) Error() string { + return "Validation error: " + e.msg +} diff --git a/internal/application/services/post_service.go b/internal/application/services/post_service.go index efe11c6..6d96880 100644 --- a/internal/application/services/post_service.go +++ b/internal/application/services/post_service.go @@ -3,13 +3,11 @@ package services import ( "58team_blog/internal/application/commands" "58team_blog/internal/application/common" - ie "58team_blog/internal/application/errors" + "58team_blog/internal/application/errors" "58team_blog/internal/application/mapper" "58team_blog/internal/application/queries" "58team_blog/internal/domain/entities" "58team_blog/internal/domain/repository" - "errors" - "fmt" "time" ) @@ -26,12 +24,12 @@ func CreatePostService(repo repository.PostRepository) PostService { func (s *PostService) Create(cmd commands.CreatePostCommand) (*common.PostResult, error) { entity, err := entities.CreatePost(cmd.UserId, cmd.Title, cmd.Description, cmd.Content) if err != nil { - return nil, err + return nil, errors.NewValidationError("Invalid input data " + err.Error()) } post, err := s.repo.Create(&entity) if err != nil { - return nil, fmt.Errorf("Db error: %s", err) + return nil, errors.NewDBError(err.Error()) } result := mapper.CreatePostResultFromEntity(post) @@ -42,15 +40,15 @@ func (s *PostService) Create(cmd commands.CreatePostCommand) (*common.PostResult func (s *PostService) FindById(query queries.PostFindByIdQuery) (*queries.PostFindByIdResult, error) { post, err := s.repo.FindById(query.Id) if err != nil { - return nil, err + return nil, errors.NewDBError(err.Error()) } if post == nil { - return nil, ie.NewNotFoundError("Post") + return nil, errors.NewNotFoundError("Post") } if err := post.Validate(); err != nil { - return nil, err + return nil, errors.NewValidationError(err.Error()) } result := mapper.CreatePostFindByIdResultFromEntity(*post) @@ -61,12 +59,12 @@ func (s *PostService) FindById(query queries.PostFindByIdQuery) (*queries.PostFi func (s *PostService) FindAllByUserName(query queries.PostFindAllByUserNameQuery) (*queries.PostFindAllByUserNameResult, error) { posts, err := s.repo.FindAllByUserName(query.UserName) if err != nil { - return nil, err + return nil, errors.NewDBError(err.Error()) } for _, p := range posts { if err := p.Validate(); err != nil { - return nil, err + return nil, errors.NewValidationError(err.Error()) } } @@ -78,12 +76,12 @@ func (s *PostService) FindAllByUserName(query queries.PostFindAllByUserNameQuery func (s *PostService) GetAll() (*queries.PostGetAllResult, error) { posts, err := s.repo.GetAll() if err != nil { - return nil, err + return nil, errors.NewDBError(err.Error()) } for _, p := range posts { if err := p.Validate(); err != nil { - return nil, err + return nil, errors.NewValidationError(err.Error()) } } @@ -94,13 +92,12 @@ func (s *PostService) GetAll() (*queries.PostGetAllResult, error) { func (s *PostService) GetAllOffset(offset int) (*queries.PostGetAllResult, error) { if offset < 0 { - return nil, errors.New("offset is less than 0") + return nil, errors.NewValidationError("offset is less than 0") } posts, err := s.repo.GetAllOffset(offset) - if err != nil { - return nil, err + return nil, errors.NewDBError(err.Error()) } result := mapper.CreatePostGetAllResult(posts) @@ -111,11 +108,11 @@ func (s *PostService) GetAllOffset(offset int) (*queries.PostGetAllResult, error func (s *PostService) Update(cmd commands.UpdatePostCommand) (*common.PostResult, error) { post, err := s.repo.FindById(cmd.Id) if err != nil { - return nil, err + return nil, errors.NewDBError(err.Error()) } if err := post.Validate(); err != nil { - return nil, err + return nil, errors.NewValidationError(err.Error()) } post.Title = cmd.Title @@ -124,7 +121,7 @@ func (s *PostService) Update(cmd commands.UpdatePostCommand) (*common.PostResult post.UpdatedAt = time.Now() if err := post.Validate(); err != nil { - return nil, err + return nil, errors.NewValidationError(err.Error()) } result := mapper.CreatePostResultFromEntity(post) @@ -135,16 +132,16 @@ func (s *PostService) Update(cmd commands.UpdatePostCommand) (*common.PostResult func (s *PostService) Delete(cmd commands.DeletePostCommand) error { post, err := s.repo.FindById(cmd.Id) if err != nil { - return err + return errors.NewDBError(err.Error()) } if err := post.Validate(); err != nil { - return err + return errors.NewValidationError(err.Error()) } err = s.repo.Delete(cmd.Id) if err != nil { - return err + return errors.NewDBError(err.Error()) } return nil diff --git a/internal/application/services/user_service.go b/internal/application/services/user_service.go index 7f61762..3b5de27 100644 --- a/internal/application/services/user_service.go +++ b/internal/application/services/user_service.go @@ -3,12 +3,11 @@ package services import ( "58team_blog/internal/application/commands" "58team_blog/internal/application/common" + "58team_blog/internal/application/errors" "58team_blog/internal/application/mapper" "58team_blog/internal/application/queries" "58team_blog/internal/domain/entities" "58team_blog/internal/domain/repository" - "errors" - "fmt" ) type UserService struct { @@ -26,27 +25,23 @@ func (s *UserService) Create(cmd commands.CreateUserCommand) (*common.UserResult { user, err := s.repo.FindByName(cmd.Username) if err != nil { - return nil, fmt.Errorf("User.create findByName error: %s", err) + return nil, errors.NewDBError(err.Error()) } if user != nil { - return nil, fmt.Errorf("User: %s already exists", user.UserName) + return nil, errors.NewAlreadyExistsError("user: " + cmd.Username) } } // Create new user user, err := entities.CreateUser(cmd.Username, cmd.Password) if err != nil { - return nil, err - } - - if err := user.Validate(); err != nil { - return nil, err + return nil, errors.NewValidationError(err.Error()) } entity, err := s.repo.Create(&user) if err != nil { - return nil, err + return nil, errors.NewDBError(err.Error()) } result := mapper.CreateUserResultFromEntity(entity) @@ -57,11 +52,11 @@ func (s *UserService) Create(cmd commands.CreateUserCommand) (*common.UserResult func (s *UserService) FindById(query queries.UserFindByIdQuery) (*queries.UserFindByIdResult, error) { entity, err := s.repo.FindById(query.Id) if err != nil { - return nil, err + return nil, errors.NewDBError(err.Error()) } if err := entity.Validate(); err != nil { - return nil, err + return nil, errors.NewValidationError(err.Error()) } result := mapper.CreateUserFindByIdResultFromEntity(entity) @@ -72,11 +67,11 @@ func (s *UserService) FindById(query queries.UserFindByIdQuery) (*queries.UserFi func (s *UserService) FindByName(query queries.UserFindByNameQuery) (*queries.UserFindByNameResult, error) { entity, err := s.repo.FindByName(query.Name) if err != nil { - return nil, err + return nil, errors.NewDBError(err.Error()) } if err := entity.Validate(); err != nil { - return nil, err + return nil, errors.NewValidationError(err.Error()) } result := mapper.CreateUserFindByNameResultFromEntity(entity) @@ -86,12 +81,12 @@ func (s *UserService) FindByName(query queries.UserFindByNameQuery) (*queries.Us func (s *UserService) GetAll() (*queries.UserGetAllResult, error) { entityList, err := s.repo.GetAll() if err != nil { - return nil, err + return nil, errors.NewDBError(err.Error()) } for _, e := range entityList { if err := e.Validate(); err != nil { - return nil, err + return nil, errors.NewValidationError(err.Error()) } } @@ -102,25 +97,25 @@ func (s *UserService) GetAll() (*queries.UserGetAllResult, error) { func (s *UserService) Update(cmd commands.UpdateUserCommand) (*common.UserResult, error) { entity, err := s.repo.FindById(cmd.Id) if err != nil { - return nil, err + return nil, errors.NewDBError(err.Error()) } if err := entity.Validate(); err != nil { - return nil, err + return nil, errors.NewValidationError(err.Error()) } if cmd.Username != entity.UserName { - return nil, errors.New("You cannot change user name") + return nil, errors.NewValidationError("You cannot change user name") } entity.Password = cmd.Password if err := entity.Validate(); err != nil { - return nil, err + return nil, errors.NewValidationError(err.Error()) } if err := s.repo.Update(entity); err != nil { - return nil, err + return nil, errors.NewDBError(err.Error()) } result := mapper.CreateUserResultFromEntity(entity) @@ -130,15 +125,15 @@ func (s *UserService) Update(cmd commands.UpdateUserCommand) (*common.UserResult func (s *UserService) Delete(cmd commands.DeleteUserCommand) error { entity, err := s.repo.FindById(cmd.Id) if err != nil { - return err + return errors.NewDBError(err.Error()) } if err := entity.Validate(); err != nil { - return err + return errors.NewValidationError(err.Error()) } if err := s.repo.Delete(entity.Id); err != nil { - return err + return errors.NewDBError(err.Error()) } return nil diff --git a/internal/interfaces/api/controllers/post_controller.go b/internal/interfaces/api/controllers/post_controller.go index 7944b0e..742477b 100644 --- a/internal/interfaces/api/controllers/post_controller.go +++ b/internal/interfaces/api/controllers/post_controller.go @@ -7,6 +7,7 @@ import ( "58team_blog/internal/interfaces/api/mapper" "58team_blog/internal/interfaces/api/requests" "58team_blog/internal/interfaces/api/responses" + "58team_blog/internal/utils" "log" "net/http" "strconv" @@ -42,7 +43,7 @@ func (r *PostController) Post(c *gin.Context) { if err := c.BindJSON(&request); err != nil { log.Println(err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "BadRequest") + resp := responses.CreateErrorResponse(http.StatusBadRequest, err.Error()) c.JSON(resp.ErrorCode, resp) return } @@ -64,8 +65,7 @@ func (r *PostController) Post(c *gin.Context) { res, err := r.service.Create(cmd) if err != nil { - log.Println(err) - resp := responses.CreateErrorResponse(http.StatusInternalServerError, "Internal server error") + resp := utils.HandleError(err) c.JSON(resp.ErrorCode, resp) return } @@ -87,8 +87,7 @@ func (r *PostController) Post(c *gin.Context) { func (r *PostController) GetAll(c *gin.Context) { result, err := r.service.GetAll() if err != nil { - log.Println(err) - resp := responses.CreateErrorResponse(http.StatusInternalServerError, "Internal server error") + resp := utils.HandleError(err) c.JSON(resp.ErrorCode, resp) return } @@ -107,21 +106,21 @@ func (r *PostController) GetAll(c *gin.Context) { // @Produce json // @Success 200 {array} responses.GetListPostResponseItem // @Failure 400 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse // @Router /post/offset/{offset} [get] func (r *PostController) GetAllWithOffset(c *gin.Context) { offset_param := c.Param("offset") offset, err := strconv.Atoi(offset_param) if err != nil { log.Println("Post get all with offset error: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := responses.CreateErrorResponse(http.StatusBadRequest, "Invalid offset value") c.JSON(resp.ErrorCode, resp) return } result, err := r.service.GetAllOffset(offset) if err != nil { - log.Println("Post get all with offset error: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := utils.HandleError(err) c.JSON(resp.ErrorCode, resp) return } @@ -140,6 +139,8 @@ func (r *PostController) GetAllWithOffset(c *gin.Context) { // @Produce json // @Success 200 {array} responses.PostResponse // @Failure 400 {object} responses.ErrorResponse +// @Failure 404 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse // @Router /post/{id} [get] func (r *PostController) GetById(c *gin.Context) { id := c.Param("id") @@ -158,8 +159,7 @@ func (r *PostController) GetById(c *gin.Context) { posts, err := r.service.FindById(query) if err != nil { - log.Println("Post service error: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := utils.HandleError(err) c.JSON(resp.ErrorCode, resp) return } @@ -181,6 +181,8 @@ func (r *PostController) GetById(c *gin.Context) { // @Produce json // @Success 200 {object} responses.PostResponse // @Failure 400 {object} responses.ErrorResponse +// @Failure 404 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse // @Router /post/{id} [put] func (r *PostController) Put(c *gin.Context) { var request requests.PutPostRequest @@ -189,14 +191,14 @@ func (r *PostController) Put(c *gin.Context) { id_valid, err := uuid.Parse(id) if err != nil { log.Println("Post: invalid post id: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := responses.CreateErrorResponse(http.StatusBadRequest, err.Error()) c.JSON(resp.ErrorCode, resp) return } if err := c.BindJSON(request); err != nil { log.Println("Post request error: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := responses.CreateErrorResponse(http.StatusBadRequest, err.Error()) c.JSON(resp.ErrorCode, resp) return } @@ -210,8 +212,7 @@ func (r *PostController) Put(c *gin.Context) { post, err := r.service.Update(cmd) if err != nil { - log.Println("Post service error: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := utils.HandleError(err) c.JSON(resp.ErrorCode, resp) return } @@ -229,13 +230,15 @@ func (r *PostController) Put(c *gin.Context) { // @Produce json // @Success 200 // @Failure 400 {object} responses.ErrorResponse +// @Failure 404 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse // @Router /post/{id} [delete] func (r *PostController) Delete(c *gin.Context) { id := c.Param("id") id_valid, err := uuid.Parse(id) if err != nil { log.Println("Post: invalid post id: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := responses.CreateErrorResponse(http.StatusBadRequest, err.Error()) c.JSON(resp.ErrorCode, resp) return } @@ -245,8 +248,7 @@ func (r *PostController) Delete(c *gin.Context) { } err = r.service.Delete(cmd) if err != nil { - log.Println("Post delete error: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := utils.HandleError(err) c.JSON(resp.ErrorCode, resp) return } diff --git a/internal/interfaces/api/controllers/user_controller.go b/internal/interfaces/api/controllers/user_controller.go index 761eb2f..790afbf 100644 --- a/internal/interfaces/api/controllers/user_controller.go +++ b/internal/interfaces/api/controllers/user_controller.go @@ -33,19 +33,21 @@ func CreateUserController(service *services.UserService) UserController { // @Param request body requests.CreateUserRequest true "User data" // @Success 201 {object} responses.UserResponse // @Failure 400 {object} responses.ErrorResponse +// @Failure 409 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse // @Router /user/ [post] func (r *UserController) Post(c *gin.Context) { var request requests.CreateUserRequest if err := c.BindJSON(&request); err != nil { log.Println("User invalid request: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := responses.CreateErrorResponse(http.StatusBadRequest, err.Error()) c.JSON(resp.ErrorCode, resp) return } encrypted_password, err := utils.EncryptPassword(request.Password) if err != nil { - log.Println("User encrupt password error: ", err) + log.Println("User encrypt password error: ", err) resp := responses.CreateErrorResponse(http.StatusInternalServerError, "Internal server error") c.JSON(resp.ErrorCode, resp) return @@ -58,8 +60,7 @@ func (r *UserController) Post(c *gin.Context) { user, err := r.service.Create(cmd) if err != nil { - log.Println("User service error: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := utils.HandleError(err) c.JSON(resp.ErrorCode, resp) return } @@ -77,6 +78,8 @@ func (r *UserController) Post(c *gin.Context) { // @Param id path string true "user id" // @Success 200 {object} responses.UserResponse // @Failure 400 {object} responses.ErrorResponse +// @Failure 404 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse // @Router /user/{id} [get] func (r *UserController) FindById(c *gin.Context) { id_path := c.Param("id") @@ -84,7 +87,7 @@ func (r *UserController) FindById(c *gin.Context) { id, err := uuid.Parse(id_path) if err != nil { log.Println("User id error: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := responses.CreateErrorResponse(http.StatusBadRequest, "Invalid user id") c.JSON(resp.ErrorCode, resp) return } @@ -95,8 +98,7 @@ func (r *UserController) FindById(c *gin.Context) { user, err := r.service.FindById(query) if err != nil { - log.Println("User service error: ", err) - resp := responses.CreateErrorResponse(http.StatusNotFound, "Not found") + resp := utils.HandleError(err) c.JSON(resp.ErrorCode, resp) return } @@ -113,6 +115,8 @@ func (r *UserController) FindById(c *gin.Context) { // @Param name path string true "User name" // @Success 200 {object} responses.UserResponse // @Failure 400 {object} responses.ErrorResponse +// @Failure 404 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse // @Router /user/name/{name} [get] func (r *UserController) FindByName(c *gin.Context) { name := c.Param("name") @@ -123,8 +127,7 @@ func (r *UserController) FindByName(c *gin.Context) { user, err := r.service.FindByName(query) if err != nil { - log.Println("User service error: ", err) - resp := responses.CreateErrorResponse(http.StatusNotFound, "Not found") + resp := utils.HandleError(err) c.JSON(resp.ErrorCode, resp) return } @@ -139,12 +142,12 @@ func (r *UserController) FindByName(c *gin.Context) { // @Produce json // @Success 200 {object} responses.UserResponseList // @Failure 400 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse // @Router /user/ [get] func (r *UserController) GetAll(c *gin.Context) { users, err := r.service.GetAll() if err != nil { - log.Println("User service error: ", err) - resp := responses.CreateErrorResponse(http.StatusInternalServerError, "Internal server error") + resp := utils.HandleError(err) c.JSON(resp.ErrorCode, resp) return } @@ -162,6 +165,8 @@ func (r *UserController) GetAll(c *gin.Context) { // @Param request body requests.PutUserRequest true "User data" // @Success 200 {object} responses.UserResponse // @Failure 400 {object} responses.ErrorResponse +// @Failure 404 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse // @Router /user/{id} [put] func (r *UserController) Put(c *gin.Context) { var request requests.PutUserRequest @@ -170,14 +175,14 @@ func (r *UserController) Put(c *gin.Context) { id, err := uuid.Parse(id_path) if err != nil { log.Println("User id error: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := responses.CreateErrorResponse(http.StatusBadRequest, "Invalid user ID") c.JSON(resp.ErrorCode, resp) return } if err := c.BindJSON(&request); err != nil { log.Println("User request error: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := responses.CreateErrorResponse(http.StatusBadRequest, err.Error()) c.JSON(resp.ErrorCode, resp) return } @@ -198,8 +203,7 @@ func (r *UserController) Put(c *gin.Context) { user, err := r.service.Update(cmd) if err != nil { - log.Println("User service error: ", err) - resp := responses.CreateErrorResponse(http.StatusInternalServerError, "Internal server error") + resp := utils.HandleError(err) c.JSON(resp.ErrorCode, resp) return } @@ -215,6 +219,8 @@ func (r *UserController) Put(c *gin.Context) { // @Param id path string true "User id" // @Success 200 // @Failure 400 {object} responses.ErrorResponse +// @Failure 404 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse // @Router /user/{id} [delete] func (r *UserController) Delete(c *gin.Context) { id_path := c.Param("id") @@ -222,7 +228,7 @@ func (r *UserController) Delete(c *gin.Context) { id, err := uuid.Parse(id_path) if err != nil { log.Println("User id error: ", err) - resp := responses.CreateErrorResponse(http.StatusBadRequest, "Bad request") + resp := responses.CreateErrorResponse(http.StatusBadRequest, "Invalid user id") c.JSON(resp.ErrorCode, resp) return } @@ -232,8 +238,7 @@ func (r *UserController) Delete(c *gin.Context) { } if err := r.service.Delete(cmd); err != nil { - log.Println("User service error: ", err) - resp := responses.CreateErrorResponse(http.StatusNotFound, "User not found") + resp := utils.HandleError(err) c.JSON(resp.ErrorCode, resp) return } diff --git a/internal/utils/error_handler.go b/internal/utils/error_handler.go new file mode 100644 index 0000000..5975535 --- /dev/null +++ b/internal/utils/error_handler.go @@ -0,0 +1,30 @@ +package utils + +import ( + ie "58team_blog/internal/application/errors" + "58team_blog/internal/interfaces/api/responses" + "errors" + "log" + "net/http" +) + +func HandleError(err error) responses.ErrorResponse { + var errorCode int + errorMsg := err.Error() + + log.Println(err) + + if errors.Is(&ie.ValidationError{}, err) { + errorCode = http.StatusBadRequest + } else if errors.Is(&ie.NotFoundError{}, err) { + errorCode = http.StatusNotFound + } else if errors.Is(&ie.AlreadyExistsError{}, err) { + errorCode = http.StatusConflict + } else if errors.Is(&ie.DBError{}, err) { + errorCode = http.StatusInternalServerError + } else { + errorCode = http.StatusInternalServerError + } + + return responses.CreateErrorResponse(errorCode, errorMsg) +}