From b96dd3979558e86003ff6f5044c43f3ef1fbb33b Mon Sep 17 00:00:00 2001 From: KamilM1205 Date: Thu, 25 Sep 2025 09:01:00 +0400 Subject: [PATCH] Added authorization --- cmd/main.go | 14 +- config.yaml | 2 +- docs/docs.go | 2 +- docs/swagger.json | 2 +- docs/swagger.yaml | 174 +++++++++++++++++- go.mod | 4 + go.sum | 14 ++ images/1f3b3e94-7574-4e97-8cfb-35ab11744bca | Bin 0 -> 76944 bytes images/79fed5e1-f1fa-40c1-9c5d-88aa257908a6 | Bin 0 -> 76944 bytes .../commands/create_post_command.go | 2 + .../commands/create_posts_command.go | 8 - .../commands/delete_posts_command.go | 7 - internal/application/common/post_result.go | 2 + internal/application/common/posts_result.go | 13 -- .../application/errors/read_file_error.go | 15 ++ .../application/interfaces/posts_service.go | 16 -- internal/application/mapper/post_result.go | 2 + internal/application/mapper/posts_result.go | 48 ----- .../queries/posts_find_all_by_user_id.go | 15 -- .../queries/posts_find_by_post_id.go | 15 -- .../queries/posts_find_by_user_id.go | 15 -- internal/application/queries/posts_get_all.go | 7 - .../application/services/images_service.go | 2 +- internal/application/services/post_service.go | 2 +- .../application/services/posts_service.go | 141 -------------- internal/domain/entities/post.go | 21 ++- internal/domain/entities/posts.go | 43 ----- internal/domain/repository/posts_repo.go | 17 -- internal/infrastructure/auth.go | 19 ++ internal/infrastructure/db/repo/post_repo.go | 20 +- internal/infrastructure/db/repo/user_repo.go | 6 +- .../api/controllers/images_controller.go | 150 +++++++++++++-- .../api/controllers/post_controller.go | 49 ++++- .../api/controllers/user_controller.go | 103 ++++++++++- .../api/mapper/response_from_image_result.go | 13 ++ .../response_from_post_find_by_id_result.go | 2 + .../response_from_post_getall_result.go | 4 + .../api/mapper/response_from_post_result.go | 2 + .../api/requests/create_post_request.go | 10 +- .../api/requests/login_user_request.go | 6 + .../api/responses/get_list_post_response.go | 11 +- .../api/responses/image_response.go | 6 + .../interfaces/api/responses/post_response.go | 3 + internal/interfaces/route.go | 37 +++- internal/utils/error_handler.go | 2 + internal/utils/mime_image.go | 29 +++ internal/utils/password_crypt.go | 14 +- migrations/00002_update_post.down.sql | 2 + migrations/00002_update_post.up.sql | 2 + migrations/00003_update_old_posts.up.sql | 2 + 50 files changed, 685 insertions(+), 410 deletions(-) create mode 100644 images/1f3b3e94-7574-4e97-8cfb-35ab11744bca create mode 100644 images/79fed5e1-f1fa-40c1-9c5d-88aa257908a6 delete mode 100644 internal/application/commands/create_posts_command.go delete mode 100644 internal/application/commands/delete_posts_command.go delete mode 100644 internal/application/common/posts_result.go create mode 100644 internal/application/errors/read_file_error.go delete mode 100644 internal/application/interfaces/posts_service.go delete mode 100644 internal/application/mapper/posts_result.go delete mode 100644 internal/application/queries/posts_find_all_by_user_id.go delete mode 100644 internal/application/queries/posts_find_by_post_id.go delete mode 100644 internal/application/queries/posts_find_by_user_id.go delete mode 100644 internal/application/queries/posts_get_all.go delete mode 100644 internal/application/services/posts_service.go delete mode 100644 internal/domain/entities/posts.go delete mode 100644 internal/domain/repository/posts_repo.go create mode 100644 internal/infrastructure/auth.go create mode 100644 internal/interfaces/api/mapper/response_from_image_result.go create mode 100644 internal/interfaces/api/requests/login_user_request.go create mode 100644 internal/interfaces/api/responses/image_response.go create mode 100644 internal/utils/mime_image.go create mode 100644 migrations/00002_update_post.down.sql create mode 100644 migrations/00002_update_post.up.sql create mode 100644 migrations/00003_update_old_posts.up.sql diff --git a/cmd/main.go b/cmd/main.go index 7f7c950..50d49a6 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -23,6 +23,8 @@ import ( "58team_blog/internal/utils" "log" + "github.com/gin-contrib/sessions" + "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/go-playground/validator/v10" @@ -30,9 +32,14 @@ import ( ginSwagger "github.com/swaggo/gin-swagger" ) +const secret = "58secret" + func main() { router := gin.Default() + // Setup cookie container + router.Use(sessions.Sessions("session", cookie.NewStore([]byte(secret)))) + // Register custom validators if v, ok := binding.Validator.Engine().(*validator.Validate); ok { v.RegisterValidation("password", utils.PasswordValidator) @@ -64,12 +71,15 @@ func main() { postRepository := repo.CreatePostRepository(d) userRepository := repo.CreateUserRepository(d) + imagesRepository := repo.CreateImagesRepository(d) postService := services.CreatePostService(&postRepository) userService := services.CreateUserService(&userRepository) + imagesService := services.CreateImagesService(&imagesRepository) - interfaces.BindPostAdmin(&postService, g) - interfaces.BindUser(&userService, g) + interfaces.BindPostAdmin(&postService, &userService, g) + interfaces.BindUser(config.AdminName, config.AdminPassword, &userService, g) + interfaces.BindImages(config.ImagesPath, &imagesService, g) router.Run(":8080") } diff --git a/config.yaml b/config.yaml index 3666efd..9a1cea9 100644 --- a/config.yaml +++ b/config.yaml @@ -4,7 +4,7 @@ db-password: 1205 db-host: localhost db-port: 5432 admin_name: muts -admin_pass: 1205 +admin_pass: Abc1205 images_path: ./images/ posts_path: ./posts/ diff --git a/docs/docs.go b/docs/docs.go index 4b2e9e3..f56b2b3 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"}},"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"}}}` + "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/":{"post":{"description":"Upload new image and returns uploaded image json object","produces":["application/json"],"tags":["images"],"summary":"Upload new image","parameters":[{"type":"file","description":"image file","name":"file","in":"formData","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.ImageResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/images/{path}":{"get":{"description":"get image by path","produces":["application/octet-stream","application/json"],"tags":["images"],"summary":"Get an image by path","parameters":[{"type":"string","description":"Path to image","name":"path","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"file"}},"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 image from server by given path","produces":["image/png","image/jpeg"],"tags":["images"],"summary":"Delete image by path","parameters":[{"type":"string","description":"Path to image","name":"filename","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"}}}}},"/login":{"post":{"description":"Login user into system","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Login","parameters":[{"description":"User login data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.LoginUserRequest"}}],"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/logout":{"get":{"description":"Creates new user in system","produces":["application/json"],"tags":["user"],"summary":"Create new user","responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/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":{"category":{"type":"string"},"content":{"type":"string","minLength":36},"description":{"type":"string","maxLength":255,"minLength":8},"tags":{"type":"array","items":{"type":"string"}},"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.LoginUserRequest":{"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":{"category":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"title":{"type":"string"},"updatedAt":{"type":"string"},"userId":{"type":"string"},"username":{"type":"string"}}},"responses.ImageResponse":{"type":"object","properties":{"id":{"type":"string"},"path":{"type":"string"}}},"responses.PostResponse":{"type":"object","properties":{"category":{"type":"string"},"content":{"type":"string"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"title":{"type":"string"},"updatedAt":{"type":"string"},"userId":{"type":"string"},"username":{"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 97a1a1b..30a04f4 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"}},"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 +{"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/":{"post":{"description":"Upload new image and returns uploaded image json object","produces":["application/json"],"tags":["images"],"summary":"Upload new image","parameters":[{"type":"file","description":"image file","name":"file","in":"formData","required":true}],"responses":{"200":{"description":"OK","schema":{"$ref":"#/definitions/responses.ImageResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/images/{path}":{"get":{"description":"get image by path","produces":["application/octet-stream","application/json"],"tags":["images"],"summary":"Get an image by path","parameters":[{"type":"string","description":"Path to image","name":"path","in":"path","required":true}],"responses":{"200":{"description":"OK","schema":{"type":"file"}},"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 image from server by given path","produces":["image/png","image/jpeg"],"tags":["images"],"summary":"Delete image by path","parameters":[{"type":"string","description":"Path to image","name":"filename","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"}}}}},"/login":{"post":{"description":"Login user into system","consumes":["application/json"],"produces":["application/json"],"tags":["user"],"summary":"Login","parameters":[{"description":"User login data","name":"request","in":"body","required":true,"schema":{"$ref":"#/definitions/requests.LoginUserRequest"}}],"responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"401":{"description":"Unauthorized","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/logout":{"get":{"description":"Creates new user in system","produces":["application/json"],"tags":["user"],"summary":"Create new user","responses":{"200":{"description":"OK"},"400":{"description":"Bad Request","schema":{"$ref":"#/definitions/responses.ErrorResponse"}},"500":{"description":"Internal Server Error","schema":{"$ref":"#/definitions/responses.ErrorResponse"}}}}},"/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":{"category":{"type":"string"},"content":{"type":"string","minLength":36},"description":{"type":"string","maxLength":255,"minLength":8},"tags":{"type":"array","items":{"type":"string"}},"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.LoginUserRequest":{"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":{"category":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"title":{"type":"string"},"updatedAt":{"type":"string"},"userId":{"type":"string"},"username":{"type":"string"}}},"responses.ImageResponse":{"type":"object","properties":{"id":{"type":"string"},"path":{"type":"string"}}},"responses.PostResponse":{"type":"object","properties":{"category":{"type":"string"},"content":{"type":"string"},"createdAt":{"type":"string"},"description":{"type":"string"},"id":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"title":{"type":"string"},"updatedAt":{"type":"string"},"userId":{"type":"string"},"username":{"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 2b49736..405e89e 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -2,6 +2,8 @@ basePath: /api/v1 definitions: requests.CreatePostRequest: properties: + category: + type: string content: minLength: 36 type: string @@ -9,6 +11,10 @@ definitions: maxLength: 255 minLength: 8 type: string + tags: + items: + type: string + type: array title: maxLength: 255 minLength: 8 @@ -35,6 +41,20 @@ definitions: - password - username type: object + requests.LoginUserRequest: + properties: + password: + maxLength: 32 + minLength: 6 + type: string + username: + maxLength: 32 + minLength: 3 + type: string + required: + - password + - username + type: object requests.PutPostRequest: properties: content: @@ -67,15 +87,36 @@ definitions: type: object responses.GetListPostResponseItem: properties: + category: + type: string description: type: string id: type: string + tags: + items: + type: string + type: array title: type: string + updatedAt: + type: string + userId: + type: string + username: + type: string + type: object + responses.ImageResponse: + properties: + id: + type: string + path: + type: string type: object responses.PostResponse: properties: + category: + type: string content: type: string createdAt: @@ -84,12 +125,18 @@ definitions: type: string id: type: string + tags: + items: + type: string + type: array title: type: string updatedAt: type: string userId: type: string + username: + type: string type: object responses.UserResponse: properties: @@ -112,13 +159,36 @@ info: title: 58team blog backend version: "1.0" paths: + /images/: + post: + description: Upload new image and returns uploaded image json object + parameters: + - description: image file + in: formData + name: file + required: true + type: file + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/responses.ImageResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' + summary: Upload new image + tags: + - images /images/{path}: - get: - description: get image by path + delete: + description: Delete image from server by given path parameters: - description: Path to image - in: query - name: path + in: path + name: filename required: true type: string produces: @@ -127,7 +197,103 @@ paths: 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' + summary: Delete image by path + tags: + - images + get: + description: get image by path + parameters: + - description: Path to image + in: path + name: path + required: true + type: string + produces: + - application/octet-stream + - application/json + responses: + "200": + description: OK + schema: + type: file + "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' summary: Get an image by path + tags: + - images + /login: + post: + consumes: + - application/json + description: Login user into system + parameters: + - description: User login data + in: body + name: request + required: true + schema: + $ref: '#/definitions/requests.LoginUserRequest' + produces: + - application/json + responses: + "200": + description: OK + "400": + description: Bad Request + schema: + $ref: '#/definitions/responses.ErrorResponse' + "401": + description: Unauthorized + schema: + $ref: '#/definitions/responses.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' + summary: Login + tags: + - user + /logout: + get: + description: Creates new user in system + produces: + - application/json + responses: + "200": + description: OK + "400": + description: Bad Request + schema: + $ref: '#/definitions/responses.ErrorResponse' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/responses.ErrorResponse' + summary: Create new user + tags: + - user /post: get: description: Return first 5 posts diff --git a/go.mod b/go.mod index 787c645..26f2ed0 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( github.com/creasty/defaults v1.8.0 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/gabriel-vasile/mimetype v1.4.10 // indirect + github.com/gin-contrib/sessions v1.0.4 // indirect github.com/gin-contrib/sse v1.1.0 // indirect github.com/gin-gonic/gin v1.10.1 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect @@ -28,6 +29,9 @@ require ( github.com/goccy/go-json v0.10.5 // indirect github.com/golang-migrate/migrate v3.5.4+incompatible // indirect github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/context v1.1.2 // indirect + github.com/gorilla/securecookie v1.1.2 // indirect + github.com/gorilla/sessions v1.4.0 // indirect github.com/jmoiron/sqlx v1.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect diff --git a/go.sum b/go.sum index 62676bc..8a8360b 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,8 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/appleboy/gin-jwt/v2 v2.10.3 h1:KNcPC+XPRNpuoBh+j+rgs5bQxN+SwG/0tHbIqpRoBGc= +github.com/appleboy/gin-jwt/v2 v2.10.3/go.mod h1:LDUaQ8mF2W6LyXIbd5wqlV2SFebuyYs4RDwqMNgpsp8= github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= github.com/bytedance/sonic v1.14.1 h1:FBMC0zVz5XUmE4z9wF4Jey0An5FueFvOsTKKKtwIl7w= @@ -24,6 +26,8 @@ github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIpU+bX4+ZK0= github.com/gabriel-vasile/mimetype v1.4.10/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= +github.com/gin-contrib/sessions v1.0.4 h1:ha6CNdpYiTOK/hTp05miJLbpTSNfOnFg5Jm2kbcqy8U= +github.com/gin-contrib/sessions v1.0.4/go.mod h1:ccmkrb2z6iU2osiAHZG3x3J4suJK+OU27oqzlWOqQgs= github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ= @@ -60,11 +64,19 @@ github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9L github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= +github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-migrate/migrate v3.5.4+incompatible h1:R7OzwvCJTCgwapPCiX6DyBiu2czIUMDCB118gFTKTUA= github.com/golang-migrate/migrate v3.5.4+incompatible/go.mod h1:IsVUlFN5puWOmXrqjgGUfIRIbU7mr8oNBE2tyERd9Wk= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/context v1.1.2 h1:WRkNAv2uoa03QNIc1A6u4O7DAGMUVoopZhkiXWA2V1o= +github.com/gorilla/context v1.1.2/go.mod h1:KDPwT9i/MeWHiLl90fuTgrt4/wPcv75vFAZLaOOcbxM= +github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= +github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= +github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ= +github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -143,6 +155,8 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA= github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= diff --git a/images/1f3b3e94-7574-4e97-8cfb-35ab11744bca b/images/1f3b3e94-7574-4e97-8cfb-35ab11744bca new file mode 100644 index 0000000000000000000000000000000000000000..f3f9fdca540896fc5b0c7177c26b146c5da84dc0 GIT binary patch literal 76944 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

p1kMvp77LTVp^&| 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�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 literal 0 HcmV?d00001 diff --git a/images/79fed5e1-f1fa-40c1-9c5d-88aa257908a6 b/images/79fed5e1-f1fa-40c1-9c5d-88aa257908a6 new file mode 100644 index 0000000000000000000000000000000000000000..f3f9fdca540896fc5b0c7177c26b146c5da84dc0 GIT binary patch literal 76944 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

p1kMvp77LTVp^&| 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�IvaHP)D;usv$op7BG>Pf2QoUk2r^D}{Z^aa@bj;sl>y_q4J$sr-81j_ z^TKz}?^&n!%{zam_`GF#)w!t7(8JS2o}>wGsFyY8&kdTkb6H`jC1`DO^6~#^=h};R z6#V-W{CfK-6(O6r+5W5T)-PO~?cf!nA#PUh7L>A~NW9c?`L>WL=dV6}t-hsXNl#>D zPf{df^|R@9_E)#Oi%+rpUv)F+*SDA5+d|rx#@C+Rx3@Zb<+7`*i_(vsJJ%<;`1q#W z(`s^e_V;i0HdgbS<&~4evr<#DGxzXWuar>v8Ipb6H_2uc;!fGGicBP(Q^ymNN znAq5tm$&oF-Y!?LkN?`OYHrMI+2uA7d<99{vFEZs--&yae*Ia~qrT}7lMQ>%!(P?> zA5MPwma_M{IzKcA#5TPUfEt-^6pGf9<?*)!a8nes7t-g{lAMZOhF&^sjuV zY}z!(=bP`=z?;v^ie-aplefxBIy_Cvy6{RMFXy+t9IH%d-ef6>%caR%FTX)l)Vr z1&04ybaaBHM3nWU*&=K2yu0u+G^yshrZqzlbMmY0@(p`-aJZijykom1YVrBdYkPiv z?(FGVvqkywjcwB3*6v=BbNSM>#1HA#oK`y~?w!A{t8*)}^7LO5`qjceBQs6=w!g8RCT8olG5w!I(d9=kZ9W$NI)C%PJ^wa_6}`+c zU-zDhuYZ^L^!t6o%tI|&*LPd_=Xr!YJK)3a)zy8`c;k}0N1pCD8?pLQ;a&U1cB)5@ zKJB|a?bXH9bMIAHWS?J}^>K#zyN2g)a-S@c`YrfKkCHU zyYub8+D>-X51KHwr?%bEX3vlIqTSBR!#%4jf^SY_EchbTyT_w#^7R!(b0vMhyu92l zcenb&>hSekkJ-MidGX~|&8N*F`&ZxMuN6LCX8R-g-RUQ(YLD%z_?Yc)9ojZCuj})< zIM*s47WaKK+oo;fV}6#q==2nQi@kY#40o5;w}xDASZi#xVCmw+5B$p?***LJ;qF$S z+?Yj6&mQpKR`mNxenq|6oGRW~Ml~nxE+rl6ykplKh6$4<9on<=^N+-{Syd&k z{mR0^roP^1lp8m*$9sC>o0;|vbGESDIesSff&2bVZ+*)hHqQx`);jfk)|1!jcaEQN zj1Hgw==fZP1;T2A||Hmbzr6*6D6}C>9dBW_ue(xS1 znK^rE;JU*fO}6#fMNR*|liN49O`1P><)-^TDz!h{+%c!gsC+Mj)4F*N z4;)K9!Nsj{;d> zXFtC^^WqGdO^=m5IP7{mor`<G%C2PJuGJW;W zD(vi@55K?ejk25{yF2{CHB*Hr>(^_XI;-^ZoU2^iueoY_)k6QKTwSr-E%x|CvC_#W zE=Oxu-wns%jmBF=Ym#z9jIj+IPpR1y6I4fx;&;7gF8?vu42Jdc@Iyyh%`(vv+cdQ=0 zdl&a~*Lq#nNKKdD?+$ON>oz4UGOyiU=B^*V0TCVM_wyZOkEcS}9rYi^A*6aM{d zi|lTR{qxh5e!K5m$H(0L>&Di%&L`r%Px$*QsDD)4&cEi!$!wlmyMBe*#TO>peLtV? z?tY%5)|-9n@7r76^fm63HLs8NNGy}ud2(aS?GJ3<&*ubJui4|`x8;4Dj1_PAO;9Pf z=yXX$PmWa5%S)XX4%;W(U1eRh>{{r*n9uhAW?Z#jqo!}Z{ZPev^YDVw>qRL)SKXhQ z*{@{z{qylB%hZ+hH5K19nX83;d*LB^-EkUk^v4g!GAEqY)SM(JTftUySV3hM(?Atvv)5To2VZ6?e5jp?a{mM^xVt)FE2WNBC2!sX-@w+ zw$*JXK6otiogMbHs(#j*BNFHS+01`4#o~#o>Yd#WdOLfSgKCvsf0~@JG!4wO3!l7x z{)W6;)7suv3+{+7EpzsL{qO#y^U2A{21aJ z1oQHm1KN}C9bOqJts=z9|L%@MSj37u#~1(CNMZfSGDo-m`};HVe3z&nSDxrmP>|<( ze&XdFzrM#y9eup`@Wz}45;JG+`=Ng9d^}@A>sn^cRJXJux%eqhQ&J}cx1RsDXXXvd z;QfCYCcU$%?PAh+=QPVC!!gRGp(r{oOQ!N=;S95!=+#e+@*X(dE{uQl{qyV-n@r`m zR!bQlpO$i@ZPgt|uX>4|mCmcP=C0Q&WlzYuKdEO$!qnVM{=A?GGhb>*q%Fh`|fBA(=U-J9Bi4Hiwveb3?sw)c?I`61`&L=1+D0*zS z@9#+qn)gqbD6n+XUIlCB|FzkgntDtQ_m{}=t=;`W;|Ui-<;#;Szj7EHqP3O=9^ZFk z`%9-EPn#KDNY2zcXaCn*?Z420meT2k^2Y3))65v2@##Hv%ej>FF7e%sHDQm$`1F>z zPCu4fdGpDVBgqdJME>bKbB3qyf9;%y%I+Z%_2-+{b+YpA?pObKjKoQYr z!gWjklt2BOeY}G|_)oOt%-fGX-l{pYUM9%TwW{E+#o1lF?$N7uNM5}0H&yP(T!sTz zjtR=f)?P~TeyyZyCL_F>&EsqDm1DXxF&@<->x|x-=zfzE>+72BZrZ#0G-vAHuh-?; z`d8dF`+MNOilMo_R=jn&oKujC!KOcRE`7?LP@J`BQ_VWPc;3;e z75mZ@C^HFIyA(?{9x7_k`&gcJ42KKpRD^rn0;22?;rE z^BM)+mOaaO?Xhu7v4Ub$A)|y~&D_$@BA0#s`2QBDc(>u${I``GGHy*=`1D&nQ>j~yM!MKnSNHoYozuixcdnYd`Ouq^lHOODfBwmB zHq)Fue_Kd@)0>c~JGQN}o447l@cRd;N$*$6Z@n-jpFIj^Bbk8Y?D6<2rBGaAtdli+fTGrgyZBZt-^3u&f(31aPWw4U3uYsX3s50#eKJN`$e zI?su)l`du%XRF`F9a*Q>XeT}4m2{xW>E)fr8QALfwAw%ax_pI!f2H{5ut%*wOJ;9t znI0#1zOB%Ag6Ok_s}uL=#K*@kJ3nJ#;oR%f4rae^nr7yqVq>$vTOj|c=0#`o6@FLu zY)e$@|I@!9JEKkK_xxNd-jxey9($jAaffYlSi462YpLidw~v<|GAasA=CuB{_}KGM z_vrf_LXnE9u1n1~rBrtHwT8rhE_?g)UYUlToBRD4JEYxr>?oRY%2Ipv?oGM3P92r) zFW=5IL0JCe&D2-RnNyFoOcE^@uimbB$9}hLyWjdr5=DJYXH=fr`Nb{n*!M~N(;_9g zSo?;>*F6sPXV>XIdiUEjbO-^70S^8Qp}_rC)dx3U*5yl(Ny z_a(>Cr?T;eH7D)Ta&|YnM7RIg{f|ZV4u{4qAJ0NTRac{9Ypq<%ykwSNuUpZRDWtD; z#{K+>9`mw$PcL252VJCc++nNlHI08$<^)Vzzh3`--FMlqudXWF?){b?wWCDZZ}-Cd zhkq+G+gEB?F1Io{`F!fL>;uVnYTm`#fjV|(=T@29Wr1^ zfA0FStn##3R@TO4cPjd1t$iBi$M3Az{?7L0ovqr@X89_5ew$s-{V%Pm+SSt5Dkvp& zs^j5d?K{hNtk|L+|K)t^q#{e9km|!iozuMZ?LYhpWI8YJ>K#41Z*RL%=E1BwO`+`JUgM=NDm`apJ>v`^RUO?%(upv1is}&OpJ48dTWqZT+#9dEc5AH^{5L1s zYDU}LxW!K|?7U;Y+c$Nu_l<{FMc2)o_%yXCrf=K2##3dowa#6iPS*#9sU`gWKe6Vz zI79XJgFC*|d#k>)s+0Wr^5Y%bO>U2ivlbcHb8oJXS>VZg_QYwQHBUM|UAY?T_2aA8 z^)pYFt1rl2vV-~egEwJ|*1cKycE`~d5;L;C++&T@JaXTzd-3rCrSmyQZyoJ!IJ-3X z!yK!AMSI)ECAYg;S6vL>n|Y_&X#2lEL62v%nq4zv`N2Nr_PX>Gx9OVPA0utvtvo(E z!rI`;=lc~Ux2G3N+iQx~i#$5*pDdktcL(p@`+wzD?h|aZlRn|?|LjNk(*OKHa`zrS zTj*=@@(ULz!##bzAUne=?T~Yx+)bxEH=`=IuP6Khb#APgx?>_|e_p(+Uig-9+hk*| z&znrUrca$Qp<(LOske5mTNS2kx9n<1|J3!HlbkI-MwUN)?Ywz*a?0HqaozqO9~{z~ z>iU$yF5h&Gfw*Ycg@xBInl9SGm20J|HA6ew>vQ`0^L;Ch$nJGZyuFKmx!AWgA8+m2 z)K#?k!lYMP&)(R_eOUi{NAL60jC<>9ulp!jzTv8!9;0CQ#OCJ5Rmzj6UX87*VyfzQ z4-JxMDJn|Te{+}Z@|N|_=H6W4UH|aG$5)TfoiTVPr@8lH`qM{!6Md5xtej3!N4j1wx_e7zbK&rip$Pmwx=V zCi2goOyTF}<|H2b^787+cUmjM(w9|sPwSDeY`eSv?Ss0Ml$}3L|7E|hC)L|*O|-Y0 z+gqQ~pZXda8cRY?PpjFVB^s~utEvCl+4Yw`-jvk5VPzV4Gc7CA*UgLRmz!FNtkJyU z-`fh2|D;}&p#tGv4Sw^diWLdCtqEp?YZ4_c2S7rZ?jkflg(*YijIbebZ$%fb-kr@y5+aGK93InG2EPe zWVQDU0aX3g4v(!H$ zR#;0NJzW)cS?G!_1A~IL-JIX)+b-li@;aw0yChKhlz;Ex18!dzscGji3M@8$_%yn`Md;9FfmlpyPPOrSa!&b9gG+64a^mg}YvmN82 zuIAZIJCVZjKCa{U?AMh~$~{s`mKaH1+-|U?$m#rj~C~ zojZ~<-nzs%WV&D2_&MW=>d`O%)_h@9{4_~OX0Kb(?cI+`b7vVDY+h2=?H6ID^LL%e zwl)6yzh8T>J)hT+-TczCshUSxG7p`Q`om}%zk%lVruZj z=_0`~L1*S(-YvQLk%W+Lu95I!O|270FRf(#_gh5PWV)X7N${;Li_PXq)lRSCofQxi zv?gb>?;f^^pEhjqy=L-n%bb8~o3k#*3EMB77;XRUOm*v(x^t%g z+3R|-?MYeJJ3OUD7XRp)Xp*d!|0Vgh&vvQnpse;&v$&w(eFETy7&dKjse<__lzxex&nR|X+V_H(xCCD_rY@UV1cBMbhOgCK$n(^7I zSgfZc_@AeLSMuvg-!1+gcjNk0RPf$Ql5IL^aaZ!xfVrjoe=5iqGFTg zedyR0`>XK!d#3WgdKdN`S9toU-gj->=C%b75_o#E(ogJ&dQwn)ooUYRy{(;l)4FfS zv&t+>e16emi^$2nj_gN6x{gdJHq`?akXAl%2fy}iHrX{{#i|zR>VF8TW6{6#~P zgR5M{W%jxW7e1Q4YW^Cj((e!c@bT!p%`|+%yyTag#7&FDnES4O8&i+4%N)LNX`^T$+H3g$@f8y>@uI=AYdCEIy z_RC}2X6C*5>td*z`rLYMC;w;n=vAi|u-@jh+p{vpoozuxSi|)e|H5xUJy9=bM?JXn zG<1@ZXz+t2Y{z)wHq3R)>pI>PZDF?fY{SYsyEn);Y~a3UlJV5>a9{0&jLgfc-oKWZ z5hYalHDc|N_j7(uHe+6v6t>^cYS*udzW+03Jm5a%Ub?D#dTMgAcTv&L(tyWt)x9rn zMBLh*zy9NX_tHBbe~Kl~b~Aam@Mg2F9IKr3{VQyFIwc z_sQ=J@1-{^c3)a^yC84=pS59+UKKe-Zrj%N%iBxq|K5_Xze=~gzq9h={^P=Dt9uqz zZWpYmH`^2A&SrAj^6FX5SD$w7s;MnJt+dUjI8?4a^R?0>c^2*YMd6os{onqi`1vwl z!z<2}{&)cnTCkZmV% z_(Zw*#yi#wozuitavHvgv7G;5LD%zN|1a|dl_+2`-AS6`P*2@IKVda3-ehgONK&GkE+9m|XqtEW#Yc-`}>Svw%`Zse|#q#tQl z^_R6or|;PFs+4Q<<(+^2THNaUKkJ$Evq|&6b?i9s_|*Lc7hMVy?Kb{nFZ>|k*%SY= zDNcQTpvpZv_pqE9r~ZBacdy}gk38p{brn&)p_|V=JyrhWZ`g!&I}(fk{wi(bm0nh< zYE$|D+ujWYId1KO?=L1E$$9$iM)Y*cT}f6mIRj-P%|y?Cl)wCX?t2YAttXB5J=eYY zBh~Q5T~OwCnOdB%*oRN;uQkt{eDZAK**jMIWE;-3X!Ow%lye= zYTY?=s}R5Sc5!2AbvM1wj;qo=-mE=6Cn9uLo=@x^9e#iQb@BVd@~XGLyK7nd%fvkI z&WfVHVXlFBW{TDOmz|yAYNJ&=z5a&V)r*%OEn=#J^9qV;B-|O4Q`KCAbUiS5E@>9G^o>Ex zla*&}qV@{}Ymn-KJCDn!S%rF3@*aJm>S8qOM&vYyBX@j$5~EoggY2`a^Pl=v{B0Gr9Bso|0MU zwX5v)sZUSuU)bs`{?+<_`<9H0P51x*5!UxV?*^)G zUKgc@ZUF+5)%{d7G+t^iKXw4Up>Xk_3&urrDdu@oX7p= zJ-O~X`{v%?FYSZ0LUPW>SMRL&$h5lthhysRE18#HT->Z4tQPwC<3H1o$#ax4maWZ> zE_-vQHG8(1*6sPJcdx(5OgprBqQLxy-dF;c#~5g+zg`)_e+fKU7qY9yO8wW9N3QSIbuKO8U}MQvItgT)MXG?vi}%UUBhf zLR(&6&YCMNvcLY}r%%ySk6m8eWcttb%d3iMrQxESoF8*;Z=3p4zW&JU{4*i-4GSL4 zEx&*8{Q3B$%FG{vUQg%X;rSCDU!rn%pTmlCURHbeawgwaTjG9qQR8ieH@Cj5{W4=l z_C1xhkpI&!zAic!@Z9zJ6!j-XmZzudJ$=2@`(}MY{oKFzDg&#&y>S(OuI4k>YH7@x z=WX)ugHhiLAD?NRuJ`=>)tcB90p>dKA9-tke_Oi5<=h?1 z;vEJ1ewpX2@+wJVX?$M)Q29^(kLRuZAKok8+7ckU$d}vcu5#2`1&$^#DxLJ=43yav zpx$||2Q1p8z=0;g&VZz9qNJk$3mCmpxj0i0!em+KCo~s_#HE$z9CL4NSz5mTA823n z)Tt+5PFCmGC&|(UY0GVlGfJNZas3R8Q<^!k@eAuPyS2dl^2B(5m8JRmS&sJ ziH-S@`8I2sUZjglg~elapH*L*?6sMHeLuc;vGnuvbCZ94k<{O10SSgCg^)#2m(TFY zeRy{8?{9{d``pU<_Tt&u(hQR(Pqy4~fA*R;I!}r$&6}AFjaRpaERSk-(D%uCquk@u zqt!EW)+|9;>C?0G&sLpVDg+IUhn-sA4IVvy+}YnBzAx{_3d5>jzm6O`!cg$M?By06 zVd3CkU#e$Lh(36tt1D~aj`RI7dhSh24n=hCX<70_7+xgAz5EBh*G zUdPnVC!=6(?X7B7`ip0lmHFd`huPoU+qu`RwMOt=Tbt46wKGj}Z%ygw;Fuaw7A7Ve zb9?WCNt{qWGAvk|p0HlPAtRadSA(tv3mlI#NTj&-#28)0H$Xv)NsL+p%H(e6KTy zFL(d?D$Ouq^4!BWjh9dGT54foac$3*^AlIE)(&3gm-?U~{732KW#X|iuvq-J@YGyM zZSCx1J=MK)t+y4~8*PfYv#ySrjZdy?;X*~B&K9%WTZ>jN_YX>PS}XFSvhe+rgI}|+ zbL^9h(Ob5D`SIQb3i~3y9Oc%S33FILuc`4|8{3Iqr86xmSDpG+obFfr@=;}W1W@gLE_y2qH^x4&{MpjsI dVE8BRe%$iUhLknG85kHCJYD@<);T3K0RRAsMwtKr literal 0 HcmV?d00001 diff --git a/internal/application/commands/create_post_command.go b/internal/application/commands/create_post_command.go index a9fb57b..6a9f5f2 100644 --- a/internal/application/commands/create_post_command.go +++ b/internal/application/commands/create_post_command.go @@ -7,4 +7,6 @@ type CreatePostCommand struct { Title string Description string Content string + Category string + Tags []string } diff --git a/internal/application/commands/create_posts_command.go b/internal/application/commands/create_posts_command.go deleted file mode 100644 index 12c26e4..0000000 --- a/internal/application/commands/create_posts_command.go +++ /dev/null @@ -1,8 +0,0 @@ -package commands - -import "github.com/google/uuid" - -type CreatePostsCommand struct { - PostId uuid.UUID - UserId uuid.UUID -} diff --git a/internal/application/commands/delete_posts_command.go b/internal/application/commands/delete_posts_command.go deleted file mode 100644 index 2247df0..0000000 --- a/internal/application/commands/delete_posts_command.go +++ /dev/null @@ -1,7 +0,0 @@ -package commands - -import "github.com/google/uuid" - -type DeletePostsCommand struct { - Id uuid.UUID -} diff --git a/internal/application/common/post_result.go b/internal/application/common/post_result.go index a31d9a2..6b6aea2 100644 --- a/internal/application/common/post_result.go +++ b/internal/application/common/post_result.go @@ -14,6 +14,8 @@ type PostResult struct { Content string CreatedAt time.Time UpdatedAt time.Time + Category string + Tags []string } type PostResultList struct { diff --git a/internal/application/common/posts_result.go b/internal/application/common/posts_result.go deleted file mode 100644 index 1a83dbb..0000000 --- a/internal/application/common/posts_result.go +++ /dev/null @@ -1,13 +0,0 @@ -package common - -import "github.com/google/uuid" - -type PostsResult struct { - Id uuid.UUID - UserId uuid.UUID - PostId uuid.UUID -} - -type PostsResultList struct { - Result []*PostsResult -} diff --git a/internal/application/errors/read_file_error.go b/internal/application/errors/read_file_error.go new file mode 100644 index 0000000..eb2685c --- /dev/null +++ b/internal/application/errors/read_file_error.go @@ -0,0 +1,15 @@ +package errors + +type ReadFileError struct { + msg string +} + +func NewReadFileError(msg string) *ReadFileError { + return &ReadFileError{ + msg: msg, + } +} + +func (e *ReadFileError) Error() string { + return "Read file error: " + e.msg +} diff --git a/internal/application/interfaces/posts_service.go b/internal/application/interfaces/posts_service.go deleted file mode 100644 index e720141..0000000 --- a/internal/application/interfaces/posts_service.go +++ /dev/null @@ -1,16 +0,0 @@ -package interfaces - -import ( - "58team_blog/internal/application/commands" - "58team_blog/internal/application/common" - "58team_blog/internal/application/queries" -) - -type PostsService interface { - Create(commands.CreatePostsCommand) (*common.PostsResult, error) - FindByUserId(queries.PostsFindByUserIdQuery) (*queries.PostsFindByUserIdResult, error) - FindByPostId(queries.PostsFindByPostIdQuery) (*queries.PostsFindByPostIdResult, error) - FindAllByUserId(queries.PostsFindByUserIdQuery) (*queries.PostsFindAllByUserIdResult, error) - GetAll() (queries.PostsGetAllResult, error) - Delete(commands.DeletePostsCommand) error -} diff --git a/internal/application/mapper/post_result.go b/internal/application/mapper/post_result.go index 2e2587f..e3d8dd6 100644 --- a/internal/application/mapper/post_result.go +++ b/internal/application/mapper/post_result.go @@ -15,6 +15,8 @@ func CreatePostResultFromEntity(entity *entities.Post) *common.PostResult { Content: entity.Content, CreatedAt: entity.CreatedAt, UpdatedAt: entity.UpdatedAt, + Category: entity.Category, + Tags: entity.Tags, } } diff --git a/internal/application/mapper/posts_result.go b/internal/application/mapper/posts_result.go deleted file mode 100644 index 35be7d9..0000000 --- a/internal/application/mapper/posts_result.go +++ /dev/null @@ -1,48 +0,0 @@ -package mapper - -import ( - "58team_blog/internal/application/common" - "58team_blog/internal/application/queries" - "58team_blog/internal/domain/entities" -) - -func CreatePostsResultFromEntity(entity *entities.Posts) *common.PostsResult { - return &common.PostsResult{ - Id: entity.Id, - UserId: entity.UserId, - PostId: entity.PostId, - } -} - -func CreatePostsResultListFromEntityList(entity_list []*entities.Posts) *common.PostsResultList { - var result common.PostsResultList - for _, e := range entity_list { - result.Result = append(result.Result, CreatePostsResultFromEntity(e)) - } - - return &result -} - -func CreatePostsFindByUserIdResultFromEntity(entity *entities.Posts) *queries.PostsFindByUserIdResult { - return &queries.PostsFindByUserIdResult{ - Result: CreatePostsResultFromEntity(entity), - } -} - -func CreatePostsFindByPostIdResultFromEntity(entity *entities.Posts) *queries.PostsFindByPostIdResult { - return &queries.PostsFindByPostIdResult{ - Result: CreatePostsResultFromEntity(entity), - } -} - -func CreatePostsFindAllByUserIdResultFromEntity(entity_list []*entities.Posts) *queries.PostsFindAllByUserIdResult { - return &queries.PostsFindAllByUserIdResult{ - Result: CreatePostsResultListFromEntityList(entity_list), - } -} - -func CreatePostsGetAllResultFromEntity(entity_list []*entities.Posts) *queries.PostsGetAllResult { - return &queries.PostsGetAllResult{ - Result: CreatePostsResultListFromEntityList(entity_list), - } -} diff --git a/internal/application/queries/posts_find_all_by_user_id.go b/internal/application/queries/posts_find_all_by_user_id.go deleted file mode 100644 index 5988fd1..0000000 --- a/internal/application/queries/posts_find_all_by_user_id.go +++ /dev/null @@ -1,15 +0,0 @@ -package queries - -import ( - "58team_blog/internal/application/common" - - "github.com/google/uuid" -) - -type PostsFindAllByUserIdQuery struct { - UserId uuid.UUID -} - -type PostsFindAllByUserIdResult struct { - Result *common.PostsResultList -} diff --git a/internal/application/queries/posts_find_by_post_id.go b/internal/application/queries/posts_find_by_post_id.go deleted file mode 100644 index 64cf98f..0000000 --- a/internal/application/queries/posts_find_by_post_id.go +++ /dev/null @@ -1,15 +0,0 @@ -package queries - -import ( - "58team_blog/internal/application/common" - - "github.com/google/uuid" -) - -type PostsFindByPostIdQuery struct { - PostId uuid.UUID -} - -type PostsFindByPostIdResult struct { - Result *common.PostsResult -} diff --git a/internal/application/queries/posts_find_by_user_id.go b/internal/application/queries/posts_find_by_user_id.go deleted file mode 100644 index 5ec14a1..0000000 --- a/internal/application/queries/posts_find_by_user_id.go +++ /dev/null @@ -1,15 +0,0 @@ -package queries - -import ( - "58team_blog/internal/application/common" - - "github.com/google/uuid" -) - -type PostsFindByUserIdQuery struct { - UserId uuid.UUID -} - -type PostsFindByUserIdResult struct { - Result *common.PostsResult -} diff --git a/internal/application/queries/posts_get_all.go b/internal/application/queries/posts_get_all.go deleted file mode 100644 index 6b7df62..0000000 --- a/internal/application/queries/posts_get_all.go +++ /dev/null @@ -1,7 +0,0 @@ -package queries - -import "58team_blog/internal/application/common" - -type PostsGetAllResult struct { - Result *common.PostsResultList -} diff --git a/internal/application/services/images_service.go b/internal/application/services/images_service.go index 62ba400..0aa9853 100644 --- a/internal/application/services/images_service.go +++ b/internal/application/services/images_service.go @@ -14,7 +14,7 @@ type ImagesService struct { repo repository.ImagesRepository } -func NewImagesService(repo repository.ImagesRepository) ImagesService { +func CreateImagesService(repo repository.ImagesRepository) ImagesService { return ImagesService{ repo: repo, } diff --git a/internal/application/services/post_service.go b/internal/application/services/post_service.go index 6d96880..94fc1f4 100644 --- a/internal/application/services/post_service.go +++ b/internal/application/services/post_service.go @@ -22,7 +22,7 @@ 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) + entity, err := entities.CreatePost(cmd.UserId, cmd.Title, cmd.Description, cmd.Content, cmd.Category, cmd.Tags) if err != nil { return nil, errors.NewValidationError("Invalid input data " + err.Error()) } diff --git a/internal/application/services/posts_service.go b/internal/application/services/posts_service.go deleted file mode 100644 index 2cd33ee..0000000 --- a/internal/application/services/posts_service.go +++ /dev/null @@ -1,141 +0,0 @@ -package services - -import ( - "58team_blog/internal/application/commands" - "58team_blog/internal/application/common" - "58team_blog/internal/application/mapper" - "58team_blog/internal/application/queries" - "58team_blog/internal/domain/entities" - "58team_blog/internal/domain/repository" - "errors" - "fmt" -) - -type PostsService struct { - repo repository.PostsRepository -} - -func CreatePostsService(repo repository.PostsRepository) PostsService { - return PostsService{ - repo: repo, - } -} - -func (s *PostsService) Create(cmd commands.CreatePostsCommand) (*common.PostsResult, error) { - if user, err := s.repo.FindByPostId(cmd.PostId); user != nil { - if err != nil { - return nil, err - } - - return nil, errors.New("Posts already exists") - } - - entity, err := entities.CreatePosts(cmd.UserId, cmd.PostId) - if err != nil { - return nil, err - } - - if err := entity.Validate(); err != nil { - return nil, err - } - - result := mapper.CreatePostsResultFromEntity(&entity) - - return result, nil -} - -func (s *PostsService) FindByUserId(query queries.PostsFindByUserIdQuery) (*queries.PostsFindByUserIdResult, error) { - entity, err := s.repo.FindByUserId(query.UserId) - if err != nil { - return nil, err - } - - if entity == nil { - return nil, errors.New("Posts not found") - } - - if err := entity.Validate(); err != nil { - return nil, err - } - - result := mapper.CreatePostsFindByUserIdResultFromEntity(entity) - - return result, nil -} - -func (s *PostsService) FindByPostId(query queries.PostsFindByPostIdQuery) (*queries.PostsFindByPostIdResult, error) { - entity, err := s.repo.FindByPostId(query.PostId) - if err != nil { - return nil, err - } - - if entity == nil { - return nil, errors.New("Posts not found") - } - - if err := entity.Validate(); err != nil { - return nil, err - } - - result := mapper.CreatePostsFindByPostIdResultFromEntity(entity) - - return result, nil -} - -func (s *PostsService) FindAllByUserId(query queries.PostsFindByUserIdQuery) (*queries.PostsFindAllByUserIdResult, error) { - entities, err := s.repo.FindAllByUserId(query.UserId) - if err != nil { - return nil, err - } - - if entities == nil { - return nil, fmt.Errorf("No posts owned by user: %s", query.UserId.String()) - } - - for _, e := range entities { - if err := e.Validate(); err != nil { - return nil, err - } - } - - result := mapper.CreatePostsFindAllByUserIdResultFromEntity(entities) - - return result, nil -} - -func (s *PostsService) GetAll() (*queries.PostsGetAllResult, error) { - entities, err := s.repo.GetAll() - if err != nil { - return nil, err - } - - for _, e := range entities { - if err := e.Validate(); err != nil { - return nil, err - } - } - - result := mapper.CreatePostsGetAllResultFromEntity(entities) - return result, nil -} - -func (s *PostsService) Delete(cmd commands.DeletePostsCommand) error { - entity, err := s.repo.FindById(cmd.Id) - if err != nil { - return err - } - - if entity == nil { - return fmt.Errorf("Posts row not found: %s", cmd.Id) - } - - if err := entity.Validate(); err != nil { - return err - } - - if err := s.repo.Delete(cmd.Id); err != nil { - return err - } - - return nil -} diff --git a/internal/domain/entities/post.go b/internal/domain/entities/post.go index 5ac108b..918c284 100644 --- a/internal/domain/entities/post.go +++ b/internal/domain/entities/post.go @@ -5,21 +5,24 @@ import ( "time" "github.com/google/uuid" + "github.com/lib/pq" ) const PostTable = "post" type Post struct { - Id uuid.UUID `db:"id"` - UserId uuid.UUID `db:"userid"` - Title string `db:"title"` - Description string `db:"description"` - Content string `db:"content"` - CreatedAt time.Time `db:"createdat"` - UpdatedAt time.Time `db:"updatedat"` + Id uuid.UUID `db:"id"` + UserId uuid.UUID `db:"userid"` + Title string `db:"title"` + Description string `db:"description"` + Content string `db:"content"` + CreatedAt time.Time `db:"createdat"` + UpdatedAt time.Time `db:"updatedat"` + Category string `db:"category"` + Tags pq.StringArray `db:"tags"` // TODO: rewrite it to many2many } -func CreatePost(userId uuid.UUID, title string, description string, content string) (post Post, err error) { +func CreatePost(userId uuid.UUID, title string, description string, content string, category string, tags []string) (post Post, err error) { post = Post{ Id: uuid.New(), UserId: userId, @@ -28,6 +31,8 @@ func CreatePost(userId uuid.UUID, title string, description string, content stri Content: content, CreatedAt: time.Now(), UpdatedAt: time.Now(), + Category: category, + Tags: tags, } err = post.Validate() diff --git a/internal/domain/entities/posts.go b/internal/domain/entities/posts.go deleted file mode 100644 index 3c30c52..0000000 --- a/internal/domain/entities/posts.go +++ /dev/null @@ -1,43 +0,0 @@ -package entities - -import ( - "errors" - - "github.com/google/uuid" -) - -const PostsTable = "posts" - -type Posts struct { - Id uuid.UUID `db:"id"` - UserId uuid.UUID `db:"user_id"` - PostId uuid.UUID `db:"post_id"` -} - -func CreatePosts(userId uuid.UUID, postId uuid.UUID) (posts Posts, err error) { - posts = Posts{ - Id: uuid.New(), - UserId: userId, - PostId: postId, - } - - err = posts.Validate() - - return -} - -func (p *Posts) Validate() error { - if err := uuid.Validate(p.Id.String()); err != nil { - return errors.New("Invalid posts.id") - } - - if err := uuid.Validate(p.UserId.String()); err != nil { - return errors.New("Invalid posts.userId") - } - - if err := uuid.Validate(p.PostId.String()); err != nil { - return errors.New("Invalid posts.postId") - } - - return nil -} diff --git a/internal/domain/repository/posts_repo.go b/internal/domain/repository/posts_repo.go deleted file mode 100644 index 5dec120..0000000 --- a/internal/domain/repository/posts_repo.go +++ /dev/null @@ -1,17 +0,0 @@ -package repository - -import ( - "58team_blog/internal/domain/entities" - - "github.com/google/uuid" -) - -type PostsRepository interface { - Create(*entities.Posts) (*entities.Posts, error) - FindById(uuid.UUID) (*entities.Posts, error) - FindByPostId(uuid.UUID) (*entities.Posts, error) - FindByUserId(uuid.UUID) (*entities.Posts, error) - FindAllByUserId(uuid.UUID) ([]*entities.Posts, error) - GetAll() ([]*entities.Posts, error) - Delete(uuid.UUID) error -} diff --git a/internal/infrastructure/auth.go b/internal/infrastructure/auth.go new file mode 100644 index 0000000..89dcbf9 --- /dev/null +++ b/internal/infrastructure/auth.go @@ -0,0 +1,19 @@ +package infrastructure + +import ( + "net/http" + + "github.com/gin-contrib/sessions" + "github.com/gin-gonic/gin" +) + +func AuthRequired(c *gin.Context) { + session := sessions.Default(c) + + if user := session.Get("user"); user == nil { + c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "unauthorized"}) + return + } + + c.Next() +} diff --git a/internal/infrastructure/db/repo/post_repo.go b/internal/infrastructure/db/repo/post_repo.go index 6f99819..ffbf335 100644 --- a/internal/infrastructure/db/repo/post_repo.go +++ b/internal/infrastructure/db/repo/post_repo.go @@ -21,8 +21,8 @@ func CreatePostRepository(conn *db.Database) PostRepository { } func (r *PostRepository) Create(entity *entities.Post) (*entities.Post, error) { - query := "INSERT INTO " + entities.PostTable + " (id, userid, title, description, content, createdat, updatedat)" + - "VALUES (:id, :userid, :title, :description, :content, :createdat, :updatedat)" + query := "INSERT INTO " + entities.PostTable + " (id, userid, title, description, content, createdat, updatedat, category, tags)" + + "VALUES (:id, :userid, :title, :description, :content, :createdat, :updatedat, :category, :tags)" _, err := r.conn.Conn.NamedExec(query, entity) return entity, err @@ -49,9 +49,23 @@ func (r *PostRepository) FindById(id uuid.UUID) (*entities.Post, error) { func (r *PostRepository) FindAllByUserName(userName string) ([]*entities.Post, error) { var entity_list []*entities.Post + var id string + + user_query := "SELECT id FROM " + entities.UserTable + " WHERE username=?" + user_query, args, err := sqlx.In(user_query, userName) + if err != nil { + return nil, err + } + + user_query = r.conn.Conn.Rebind(user_query) + err = r.conn.Conn.Select(&id, user_query, args...) + if err != nil { + return nil, err + } + query := "SELECT * FROM " + entities.PostTable + " WHERE userid=?" - query, args, err := sqlx.In(query, userName) + query, args, err = sqlx.In(query, id) if err != nil { return nil, err } diff --git a/internal/infrastructure/db/repo/user_repo.go b/internal/infrastructure/db/repo/user_repo.go index 074998f..c1a968c 100644 --- a/internal/infrastructure/db/repo/user_repo.go +++ b/internal/infrastructure/db/repo/user_repo.go @@ -31,7 +31,7 @@ func (r *UserRepository) Create(entity *entities.User) (*entities.User, error) { } func (r *UserRepository) FindById(id uuid.UUID) (*entities.User, error) { - var entity *entities.User + var entity entities.User query := "SELECT * FROM " + entities.UserTable + " WHERE id=?" query, arg, err := sqlx.In(query, id) @@ -40,9 +40,9 @@ func (r *UserRepository) FindById(id uuid.UUID) (*entities.User, error) { } query = r.conn.Conn.Rebind(query) - err = r.conn.Conn.Select(entity, query, arg...) + err = r.conn.Conn.Get(&entity, query, arg...) - return entity, err + return &entity, err } func (r *UserRepository) FindByName(username string) (*entities.User, error) { diff --git a/internal/interfaces/api/controllers/images_controller.go b/internal/interfaces/api/controllers/images_controller.go index 8f7bc5f..801b51a 100644 --- a/internal/interfaces/api/controllers/images_controller.go +++ b/internal/interfaces/api/controllers/images_controller.go @@ -1,43 +1,155 @@ package controllers import ( + "58team_blog/internal/application/commands" + "58team_blog/internal/application/errors" "58team_blog/internal/application/services" + "58team_blog/internal/interfaces/api/mapper" + "58team_blog/internal/interfaces/api/responses" + "58team_blog/internal/utils" + "log" + "net/http" + "os" + "path/filepath" "github.com/gin-gonic/gin" + "github.com/google/uuid" ) type ImagesController struct { - service *services.ImagesService + images_path string + service *services.ImagesService } -func CreateImagesController(service *services.ImagesService) ImagesController { +func CreateImagesController(images_path string, service *services.ImagesService) ImagesController { return ImagesController{ - service: service, + images_path: images_path, + service: service, } } -// get /images/{path} -// post /images -// delete /images/{id} +// @Summary Upload new image +// @Description Upload new image and returns uploaded image json object +// @Tags images +// @Produce json +// @Param file formData file true "image file" +// @Success 200 {object} responses.ImageResponse +// @Failure 500 {object} responses.ErrorResponse +// @Router /images/ [post] +func (r *ImagesController) PostImage(c *gin.Context) { + file, err := c.FormFile("file") + if err != nil { + resp := utils.HandleError(errors.NewNotFoundError("File not found")) + c.JSON(resp.ErrorCode, resp) + return + } + + uploadedFile, err := file.Open() + if err != nil { + resp := utils.HandleError(errors.NewReadFileError(err.Error())) + c.JSON(resp.ErrorCode, resp) + return + } + + // Read first 512 bytes for detect MIME-type + buffer := make([]byte, 512) + _, err = uploadedFile.Read(buffer) + if err != nil { + resp := utils.HandleError(errors.NewReadFileError(err.Error())) + c.JSON(resp.ErrorCode, resp) + return + } + + uploadedFile.Close() + + mimeType := http.DetectContentType(buffer) + + if !utils.IsImageMime(mimeType) { + resp := utils.HandleError(errors.NewValidationError("Unexpected file type. Expected: jpeg, png, gif, webp, bmp.")) + c.JSON(resp.ErrorCode, resp) + return + } + + cmd := commands.CreateImageCommand{ + Path: uuid.NewString(), + } + + image, err := r.service.Create(cmd) + if err != nil { + resp := utils.HandleError(errors.NewValidationError(err.Error())) + c.JSON(resp.ErrorCode, resp) + return + } + + c.SaveUploadedFile(file, r.images_path+"/"+image.Path) + + resp := mapper.ResponseFromImageResult(image) + + c.JSON(http.StatusOK, resp) +} // @Summary Get an image by path // @Description get image by path -// @Param path query string true "Path to image" +// @Tags images +// @Param path path string true "Path to image" +// @Produce octet-stream +// @Produce json +// @Success 200 {file} blob +// @Failure 400 {object} responses.ErrorResponse +// @Failure 404 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse +// @Router /images/{path} [get] +func (r *ImagesController) GetImage(c *gin.Context) { + filename := c.Param("path") + + filePath := filepath.Join(r.images_path, filename) + + if _, err := os.Stat(filePath); os.IsNotExist(err) { + log.Println(err) + resp := responses.CreateErrorResponse(http.StatusNotFound, "Image not found") + c.JSON(resp.ErrorCode, resp) + return + } + + file, err := os.Open(filePath) + if err != nil { + log.Println(err) + resp := responses.CreateErrorResponse(http.StatusInternalServerError, "Cannot load image file from server") + c.JSON(resp.ErrorCode, resp) + return + } + + mimeData := make([]byte, 512) + if _, err := file.Read(mimeData); err != nil { + log.Println(err) + resp := responses.CreateErrorResponse(http.StatusInternalServerError, "Cannot load image from server") + c.JSON(resp.ErrorCode, resp) + return + } + + mimeType, err := utils.GetImageMimeType(mimeData) + if err != nil { + log.Println(err) + resp := responses.CreateErrorResponse(http.StatusInternalServerError, err.Error()) + c.JSON(resp.ErrorCode, resp) + return + } + + c.Header("Content-Type", mimeType) + c.File(filePath) +} + +// @Summary Delete image by path +// @Description Delete image from server by given path +// @Tags images +// @Param filename path string true "Path to image" // @Produce image/png // @Produce image/jpeg // @Success 200 -// @Router /images/{path} [get] -func (r *ImagesController) GetImage(c *gin.Context) { - // TODO: return image - panic("Not implemented") -} - -func (r *ImagesController) PostImage(c *gin.Context) { - // TODO: return image - panic("Not implemented") -} - +// @Failure 400 {object} responses.ErrorResponse +// @Failure 404 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse +// @Router /images/{path} [delete] func (r *ImagesController) DeleteImage(c *gin.Context) { - // TODO: return image panic("Not implemented") } diff --git a/internal/interfaces/api/controllers/post_controller.go b/internal/interfaces/api/controllers/post_controller.go index 742477b..069b3f9 100644 --- a/internal/interfaces/api/controllers/post_controller.go +++ b/internal/interfaces/api/controllers/post_controller.go @@ -17,12 +17,14 @@ import ( ) type PostController struct { - service *services.PostService + service *services.PostService + userService *services.UserService } -func CreatePostController(service *services.PostService) PostController { +func CreatePostController(service *services.PostService, userService *services.UserService) PostController { return PostController{ - service: service, + service: service, + userService: userService, } } @@ -61,6 +63,8 @@ func (r *PostController) Post(c *gin.Context) { Title: request.Title, Description: request.Description, Content: request.Content, + Category: request.Category, + Tags: request.Tags, } res, err := r.service.Create(cmd) @@ -70,7 +74,16 @@ func (r *PostController) Post(c *gin.Context) { return } + // Get username by userid + user, err := r.userService.FindById(queries.UserFindByIdQuery{Id: userId}) + if err != nil { + resp := utils.HandleError(err) + c.JSON(resp.ErrorCode, resp) + return + } + response := mapper.ResponseFromPostResult(res) + response.Username = user.Result.UserName c.JSON(http.StatusCreated, response) } @@ -94,6 +107,17 @@ func (r *PostController) GetAll(c *gin.Context) { res := mapper.ResponseFromPostGetAllResult(result) + for e, i := range res { + // Get username by userid + user, err := r.userService.FindById(queries.UserFindByIdQuery{Id: uuid.MustParse(i.UserId)}) + if err != nil { + resp := utils.HandleError(err) + c.JSON(resp.ErrorCode, resp) + return + } + res[e].Username = user.Result.UserName + } + c.JSON(http.StatusOK, res) } @@ -127,6 +151,17 @@ func (r *PostController) GetAllWithOffset(c *gin.Context) { res := mapper.ResponseFromPostGetAllResult(result) + for e, i := range res { + // Get username by userid + user, err := r.userService.FindById(queries.UserFindByIdQuery{Id: uuid.MustParse(i.UserId)}) + if err != nil { + resp := utils.HandleError(err) + c.JSON(resp.ErrorCode, resp) + return + } + res[e].Username = user.Result.UserName + } + c.JSON(http.StatusOK, res) } @@ -166,6 +201,14 @@ func (r *PostController) GetById(c *gin.Context) { result := mapper.ResponseFormPostFindByIdResult(posts) + user, err := r.userService.FindById(queries.UserFindByIdQuery{Id: uuid.MustParse(result.UserId)}) + if err != nil { + resp := utils.HandleError(err) + c.JSON(resp.ErrorCode, resp) + return + } + result.Username = user.Result.UserName + c.JSON(http.StatusOK, result) } diff --git a/internal/interfaces/api/controllers/user_controller.go b/internal/interfaces/api/controllers/user_controller.go index 790afbf..1db2a70 100644 --- a/internal/interfaces/api/controllers/user_controller.go +++ b/internal/interfaces/api/controllers/user_controller.go @@ -11,20 +11,117 @@ import ( "log" "net/http" + "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" "github.com/google/uuid" ) type UserController struct { - service *services.UserService + adminName string + adminPass string + service *services.UserService } -func CreateUserController(service *services.UserService) UserController { +func CreateUserController(service *services.UserService, adminName string, adminPass string) UserController { return UserController{ - service: service, + service: service, + adminName: adminName, + adminPass: adminPass, } } +// @Summary Login +// @Description Login user into system +// @Tags user +// @Accept json +// @Produce json +// @Param request body requests.LoginUserRequest true "User login data" +// @Success 200 +// @Failure 400 {object} responses.ErrorResponse +// @Failure 401 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse +// @Router /login [post] +func (r *UserController) Login(c *gin.Context) { + session := sessions.Default(c) + + var request requests.LoginUserRequest + if err := c.BindJSON(&request); err != nil { + log.Println("User invalid request: ", err) + resp := responses.CreateErrorResponse(http.StatusBadRequest, err.Error()) + c.JSON(resp.ErrorCode, resp) + return + } + + // Check admin login + if request.Username == r.adminName && request.Password == r.adminPass { + session.Set("user", uuid.NewString()) + if err := session.Save(); err != nil { + log.Println("User save session error: ", err) + resp := responses.CreateErrorResponse(http.StatusInternalServerError, "Internal server error") + c.JSON(resp.ErrorCode, resp) + return + } + + c.Status(http.StatusOK) + return + } + + user, err := r.service.FindByName(queries.UserFindByNameQuery{Name: request.Username}) + if err != nil { + resp := utils.HandleError(err) + c.JSON(resp.ErrorCode, resp) + return + } + + pass, err := utils.EncryptPassword(request.Password) + if err != nil { + log.Println("User encrypt password error: ", err) + resp := responses.CreateErrorResponse(http.StatusInternalServerError, "Internal server error") + c.JSON(resp.ErrorCode, resp) + return + } + + if utils.CheckPassword(user.Result.Password, pass) { + log.Println("Pass ", user.Result.Password, " != ", pass) + resp := responses.CreateErrorResponse(http.StatusUnauthorized, "Authentication error") + c.JSON(resp.ErrorCode, resp) + return + } + + session.Set("user", user.Result.Id.String()) + if err := session.Save(); err != nil { + log.Println("User save session error: ", err) + resp := responses.CreateErrorResponse(http.StatusInternalServerError, "Internal server error") + c.JSON(resp.ErrorCode, resp) + return + } + + c.Status(http.StatusOK) +} + +// @Summary Create new user +// @Description Creates new user in system +// @Tags user +// @Produce json +// @Success 200 +// @Failure 400 {object} responses.ErrorResponse +// @Failure 500 {object} responses.ErrorResponse +// @Router /logout [get] +func (r *UserController) Logout(c *gin.Context) { + session := sessions.Default(c) + user := session.Get("user") + if user == nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid session token"}) + return + } + session.Delete("user") + if err := session.Save(); err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to save session"}) + return + } + c.Status(http.StatusOK) +} + // @Summary Create new user // @Description Creates new user in system // @Tags user diff --git a/internal/interfaces/api/mapper/response_from_image_result.go b/internal/interfaces/api/mapper/response_from_image_result.go new file mode 100644 index 0000000..4c09b5c --- /dev/null +++ b/internal/interfaces/api/mapper/response_from_image_result.go @@ -0,0 +1,13 @@ +package mapper + +import ( + "58team_blog/internal/application/common" + "58team_blog/internal/interfaces/api/responses" +) + +func ResponseFromImageResult(result *common.ImageResult) responses.ImageResponse { + return responses.ImageResponse{ + Id: result.Id.String(), + Path: result.Path, + } +} diff --git a/internal/interfaces/api/mapper/response_from_post_find_by_id_result.go b/internal/interfaces/api/mapper/response_from_post_find_by_id_result.go index 86fb1bb..7e67115 100644 --- a/internal/interfaces/api/mapper/response_from_post_find_by_id_result.go +++ b/internal/interfaces/api/mapper/response_from_post_find_by_id_result.go @@ -15,5 +15,7 @@ func ResponseFormPostFindByIdResult(result *queries.PostFindByIdResult) response Content: res.Content, CreatedAt: res.CreatedAt, UpdatedAt: res.UpdatedAt, + Tags: res.Tags, + Category: res.Category, } } diff --git a/internal/interfaces/api/mapper/response_from_post_getall_result.go b/internal/interfaces/api/mapper/response_from_post_getall_result.go index faf0371..e2ffcc2 100644 --- a/internal/interfaces/api/mapper/response_from_post_getall_result.go +++ b/internal/interfaces/api/mapper/response_from_post_getall_result.go @@ -9,8 +9,12 @@ import ( func itemFromResult(item *common.PostResult) responses.GetListPostResponseItem { return responses.GetListPostResponseItem{ Id: item.Id.String(), + UserId: item.UserId.String(), Title: item.Title, Description: item.Description, + UpdatedAt: item.UpdatedAt.String(), + Tags: item.Tags, + Category: item.Category, } } diff --git a/internal/interfaces/api/mapper/response_from_post_result.go b/internal/interfaces/api/mapper/response_from_post_result.go index 86ba7c6..f4b6927 100644 --- a/internal/interfaces/api/mapper/response_from_post_result.go +++ b/internal/interfaces/api/mapper/response_from_post_result.go @@ -14,5 +14,7 @@ func ResponseFromPostResult(result *common.PostResult) responses.PostResponse { Content: result.Content, CreatedAt: result.CreatedAt, UpdatedAt: result.UpdatedAt, + Category: result.Category, + Tags: result.Tags, } } diff --git a/internal/interfaces/api/requests/create_post_request.go b/internal/interfaces/api/requests/create_post_request.go index a552ebc..d933b1a 100644 --- a/internal/interfaces/api/requests/create_post_request.go +++ b/internal/interfaces/api/requests/create_post_request.go @@ -1,8 +1,10 @@ package requests type CreatePostRequest struct { - Title string `json:"title" validate:"required,min=8,max=255"` - Description string `json:"description" validate:"required,min=8,max=255"` - Content string `json:"content" validate:"required,min=36"` - UserId string `json:"userId" validate:"required,uuid5"` + Title string `json:"title" validate:"required,min=8,max=255"` + Description string `json:"description" validate:"required,min=8,max=255"` + Content string `json:"content" validate:"required,min=36"` + UserId string `json:"userId" validate:"required,uuid5"` + Category string `json:"category"` + Tags []string `json:"tags"` } diff --git a/internal/interfaces/api/requests/login_user_request.go b/internal/interfaces/api/requests/login_user_request.go new file mode 100644 index 0000000..36b00a9 --- /dev/null +++ b/internal/interfaces/api/requests/login_user_request.go @@ -0,0 +1,6 @@ +package requests + +type LoginUserRequest struct { + Username string `json:"username" validate:"required,min=3,max=32"` + Password string `json:"password" validate:"required,min=6,max=32,password"` +} diff --git a/internal/interfaces/api/responses/get_list_post_response.go b/internal/interfaces/api/responses/get_list_post_response.go index 75c6be2..ad3c860 100644 --- a/internal/interfaces/api/responses/get_list_post_response.go +++ b/internal/interfaces/api/responses/get_list_post_response.go @@ -1,9 +1,14 @@ package responses type GetListPostResponseItem struct { - Id string `json:"id"` - Title string `json:"title"` - Description string `json:"description"` + Id string `json:"id"` + UserId string `json:"userId"` + Title string `json:"title"` + Description string `json:"description"` + UpdatedAt string `json:"updatedAt"` + Tags []string `json:"tags"` + Category string `json:"category"` + Username string `json:"username"` } type GetListPostResponse []GetListPostResponseItem diff --git a/internal/interfaces/api/responses/image_response.go b/internal/interfaces/api/responses/image_response.go new file mode 100644 index 0000000..483df24 --- /dev/null +++ b/internal/interfaces/api/responses/image_response.go @@ -0,0 +1,6 @@ +package responses + +type ImageResponse struct { + Id string `json:"id"` + Path string `json:"path"` +} diff --git a/internal/interfaces/api/responses/post_response.go b/internal/interfaces/api/responses/post_response.go index b4fe9c4..0aa0bb9 100644 --- a/internal/interfaces/api/responses/post_response.go +++ b/internal/interfaces/api/responses/post_response.go @@ -10,6 +10,9 @@ type PostResponse struct { Content string `json:"content"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` + Tags []string `json:"tags"` + Category string `json:"category"` + Username string `json:"username"` } type PostResponseList []*PostResponse diff --git a/internal/interfaces/route.go b/internal/interfaces/route.go index 1dbafa1..de88e66 100644 --- a/internal/interfaces/route.go +++ b/internal/interfaces/route.go @@ -2,27 +2,41 @@ package interfaces import ( "58team_blog/internal/application/services" + "58team_blog/internal/infrastructure" "58team_blog/internal/interfaces/api/controllers" "github.com/gin-gonic/gin" ) -func BindPostAdmin(service *services.PostService, group *gin.RouterGroup) { - post := controllers.CreatePostController(service) +func BindPostAdmin(service *services.PostService, userService *services.UserService, group *gin.RouterGroup) { + post := controllers.CreatePostController(service, userService) g := group.Group("/post") - g.GET("/", post.GetAll) - g.GET("/offset/:offset", post.GetAllWithOffset) - g.GET("/:id", post.GetById) + g.Use(infrastructure.AuthRequired) + g.POST("/", post.Post) g.PUT("/:id", post.Put) g.DELETE("/:id", post.Delete) } -func BindUser(service *services.UserService, group *gin.RouterGroup) { - user := controllers.CreateUserController(service) +func BindPost(service *services.PostService, userService *services.UserService, group *gin.RouterGroup) { + post := controllers.CreatePostController(service, userService) + g := group.Group("/post") + + g.GET("/", post.GetAll) + g.GET("/offset/:offset", post.GetAllWithOffset) + g.GET("/:id", post.GetById) +} + +func BindUser(adminName string, adminPass string, service *services.UserService, group *gin.RouterGroup) { + user := controllers.CreateUserController(service, adminName, adminPass) + + group.POST("/login", user.Login) + group.GET("/logout", user.Logout) g := group.Group("/user/") + g.Use(infrastructure.AuthRequired) + g.POST("/", user.Post) g.GET("/", user.GetAll) g.GET("/:id", user.FindById) @@ -30,3 +44,12 @@ func BindUser(service *services.UserService, group *gin.RouterGroup) { g.PUT("/:id", user.Put) g.DELETE("/:id", user.Delete) } + +func BindImages(images_path string, service *services.ImagesService, group *gin.RouterGroup) { + images := controllers.CreateImagesController(images_path, service) + + g := group.Group("/images/") + g.POST("/", images.PostImage) + g.GET("/:path", images.GetImage) + g.DELETE("/:path", images.DeleteImage) +} diff --git a/internal/utils/error_handler.go b/internal/utils/error_handler.go index 5975535..f23271b 100644 --- a/internal/utils/error_handler.go +++ b/internal/utils/error_handler.go @@ -16,6 +16,8 @@ func HandleError(err error) responses.ErrorResponse { if errors.Is(&ie.ValidationError{}, err) { errorCode = http.StatusBadRequest + } else if errors.Is(&ie.ReadFileError{}, err) { + errorCode = http.StatusInternalServerError } else if errors.Is(&ie.NotFoundError{}, err) { errorCode = http.StatusNotFound } else if errors.Is(&ie.AlreadyExistsError{}, err) { diff --git a/internal/utils/mime_image.go b/internal/utils/mime_image.go new file mode 100644 index 0000000..6a05a4c --- /dev/null +++ b/internal/utils/mime_image.go @@ -0,0 +1,29 @@ +package utils + +import ( + "errors" + "net/http" +) + +var allowedTypes = map[string]bool{ + "image/jpeg": true, + "image/jpg": true, + "image/png": true, + "image/gif": true, + "image/webp": true, + "image/bmp": true, +} + +func IsImageMime(data string) bool { + return allowedTypes[data] +} + +func GetImageMimeType(data []byte) (string, error) { + content_type := http.DetectContentType(data) + + if !IsImageMime(content_type) { + return "", errors.New("Unexpected image format.") + } + + return content_type, nil +} diff --git a/internal/utils/password_crypt.go b/internal/utils/password_crypt.go index 4f63565..a64489c 100644 --- a/internal/utils/password_crypt.go +++ b/internal/utils/password_crypt.go @@ -6,9 +6,10 @@ import ( "golang.org/x/crypto/bcrypt" ) +const salt = "58_team:%s:1205secret" + func EncryptPassword(pass string) (string, error) { var salted string - salt := "58_team:%s:1205secret" salted = fmt.Sprintf(salt, pass) @@ -19,3 +20,14 @@ func EncryptPassword(pass string) (string, error) { return string(hashed), nil } + +func CheckPassword(pass_hashed string, pass string) bool { + salted := fmt.Sprintf(salt, pass) + err := bcrypt.CompareHashAndPassword([]byte(pass_hashed), []byte(salted)) + + if err != nil { + return false + } + + return true +} diff --git a/migrations/00002_update_post.down.sql b/migrations/00002_update_post.down.sql new file mode 100644 index 0000000..85a76d6 --- /dev/null +++ b/migrations/00002_update_post.down.sql @@ -0,0 +1,2 @@ +ALTER TABLE post DROP COLUMN category; +ALTER TABLE post DROP COLUMN tags; diff --git a/migrations/00002_update_post.up.sql b/migrations/00002_update_post.up.sql new file mode 100644 index 0000000..6e65710 --- /dev/null +++ b/migrations/00002_update_post.up.sql @@ -0,0 +1,2 @@ +ALTER TABLE post ADD COLUMN category TEXT; +ALTER TABLE post ADD COLUMN tags TEXT[]; diff --git a/migrations/00003_update_old_posts.up.sql b/migrations/00003_update_old_posts.up.sql new file mode 100644 index 0000000..0d0f778 --- /dev/null +++ b/migrations/00003_update_old_posts.up.sql @@ -0,0 +1,2 @@ +UPDATE post SET category = '' WHERE category = NULL; +UPDATE post SET tags = '{}' WHERE tags = NULL;