diff --git a/authorizationapp/delivery/http/handler.go b/authorizationapp/delivery/http/handler.go index 7a6c7ceb..1230fbc9 100644 --- a/authorizationapp/delivery/http/handler.go +++ b/authorizationapp/delivery/http/handler.go @@ -17,8 +17,8 @@ func NewRoleHandler(service service.Authorization) RoleHandler { func (r RoleHandler) Store(c *gin.Context) { var request service.StoreRoleRequest - err := c.ShouldBindJSON(&request) + if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return @@ -31,5 +31,20 @@ func (r RoleHandler) Store(c *gin.Context) { } c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("role %s created successfully", role.Title_fa)}) - return +} + +func (r RoleHandler) Update(c *gin.Context) { + var request service.UpdateRoleRequest + if err := c.ShouldBindJSON(&request); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + role, err := r.service.Update(c, request) + if err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, gin.H{"message": fmt.Sprintf("role %s updated successfully", role.Title_fa)}) } diff --git a/authorizationapp/delivery/http/server.go b/authorizationapp/delivery/http/server.go index 6e1c002b..65948bfc 100644 --- a/authorizationapp/delivery/http/server.go +++ b/authorizationapp/delivery/http/server.go @@ -1,9 +1,7 @@ package http import ( - "fmt" "git.gocasts.ir/ebhomengo/niki/pkg/httpserver" - "github.com/gin-gonic/gin" ) type RoleServer struct { @@ -16,11 +14,5 @@ func NewRoleServer(cfg httpserver.Config, handler RoleHandler) RoleServer { } func (s RoleServer) Start() { - r := gin.Default() - r.POST("/role/create", s.handler.Store) - err := r.Run(fmt.Sprintf("%s:%s", s.cfg.Host, s.cfg.Port)) - if err != nil { - panic(err.Error()) - } } diff --git a/domain/authorization/repository/mysql_repo.go b/domain/authorization/repository/mysql_repo.go index ef446e0b..c1e312fd 100644 --- a/domain/authorization/repository/mysql_repo.go +++ b/domain/authorization/repository/mysql_repo.go @@ -3,9 +3,8 @@ package repository import ( "context" "git.gocasts.ir/ebhomengo/niki/domain/authorization/service" - - richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" "git.gocasts.ir/ebhomengo/niki/pkg/database/mysql" + richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" "git.gocasts.ir/ebhomengo/niki/types" ) @@ -32,3 +31,34 @@ func (m RoleRepo) Store(ctx context.Context, req service.StoreRoleRequest) (type return types.ID(roleID), nil } + +func (m RoleRepo) Update(ctx context.Context, req service.UpdateRoleRequest) (types.ID, error) { + const op = "domain.authorization.repository.role.update" + + result, err := m.conn.Conn().ExecContext(ctx, + "UPDATE roles SET title = ?, title_fa = ? WHERE id = ?", + req.Title, req.TitleFa, req.ID) + + if err != nil { + return 0, richerror.New(op).WithErr(err) + } + + _, err = result.RowsAffected() + if err != nil { + return 0, richerror.New(op).WithErr(err) + } + + return types.ID(req.ID), nil +} + + +func (m RoleRepo) IsRoleExistsByID(ctx context.Context, id types.ID) error { + const op = "domain.authorization.repository.role.is_exists_by_id" + + var exists bool + err := m.conn.Conn().QueryRowContext(ctx, "SELECT EXISTS(SELECT 1 FROM roles WHERE id = ?)", id).Scan(&exists) + if err != nil { + return richerror.New(op).WithErr(err) + } + return nil +} diff --git a/domain/authorization/service/authorization.go b/domain/authorization/service/authorization.go index 90bff27d..6adff60b 100644 --- a/domain/authorization/service/authorization.go +++ b/domain/authorization/service/authorization.go @@ -4,8 +4,6 @@ import ( "context" "git.gocasts.ir/ebhomengo/niki/domain/authorization/entity" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" - "github.com/go-ozzo/ozzo-validation/v4" - "regexp" ) type Authorization struct { @@ -34,16 +32,21 @@ func (a Authorization) Store(ctx context.Context, req StoreRoleRequest) (entity. }, nil } -func (s Authorization) validateStoreRole(req StoreRoleRequest) error { - return validation.ValidateStruct(&req, - validation.Field(&req.Title, - validation.Required, - validation.Length(4, 0), - validation.Match(regexp.MustCompile(`^[a-zA-Z\s]+$`))), +func (a Authorization) Update(ctx context.Context, req UpdateRoleRequest) (entity.Role, error) { + const op = "authorizationservice.Update" - validation.Field(&req.TitleFa, - validation.Required, - validation.Length(4, 0), - validation.Match(regexp.MustCompile(`^[\x{0600}-\x{06FF}\s]+$`))), - ) + if err := a.validateUpdateRole(ctx, req); err != nil { + return entity.Role{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected) + } + + role, err := a.roleRepo.Update(ctx, req) + if err != nil { + return entity.Role{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected) + } + + return entity.Role{ + ID: role, + Title_fa: req.TitleFa, + Title: req.Title, + }, nil } diff --git a/domain/authorization/service/param.go b/domain/authorization/service/param.go index afdde9bb..f5a16fe5 100644 --- a/domain/authorization/service/param.go +++ b/domain/authorization/service/param.go @@ -1,6 +1,17 @@ package service +import "git.gocasts.ir/ebhomengo/niki/types" + type RoleRequest struct { Title string `json:"title"` TitleFa string `json:"title_fa"` } + +type StoreRoleRequest struct { + RoleRequest +} + +type UpdateRoleRequest struct { + ID types.ID `json:"id"` + RoleRequest +} diff --git a/domain/authorization/service/repo_contract.go b/domain/authorization/service/repo_contract.go index 70bae722..c4055fd8 100644 --- a/domain/authorization/service/repo_contract.go +++ b/domain/authorization/service/repo_contract.go @@ -2,9 +2,11 @@ package service import ( "context" -"git.gocasts.ir/ebhomengo/niki/types" + "git.gocasts.ir/ebhomengo/niki/types" ) type RoleRepo interface { Store(ctx context.Context, req StoreRoleRequest) (types.ID, error) + Update(ctx context.Context, req UpdateRoleRequest) (types.ID, error) + IsRoleExistsByID(ctx context.Context, id types.ID) error } diff --git a/domain/authorization/service/validator.go b/domain/authorization/service/validator.go new file mode 100644 index 00000000..78814bcd --- /dev/null +++ b/domain/authorization/service/validator.go @@ -0,0 +1,45 @@ +package service + +import ( + "context" + "github.com/go-ozzo/ozzo-validation/v4" + "regexp" +) + +func (a Authorization) validateStoreRole(req StoreRoleRequest) error { + return validation.ValidateStruct(&req, + validation.Field(&req.Title, + validation.Required, + validation.Length(4, 0), + validation.Match(regexp.MustCompile(`^[a-zA-Z\s]+$`))), + + validation.Field(&req.TitleFa, + validation.Required, + validation.Length(4, 0), + validation.Match(regexp.MustCompile(`^[\x{0600}-\x{06FF}\s]+$`))), + ) +} + +func (a Authorization) validateUpdateRole(ctx context.Context, req UpdateRoleRequest) error { + return validation.ValidateStruct(&req, + validation.Field(&req.ID, + validation.Required, + validation.By(func(value interface{}) error { + err := a.roleRepo.IsRoleExistsByID(ctx, req.ID) + if err != nil { + return err + } + return nil + }), + ), + validation.Field(&req.Title, + validation.Required, + validation.Length(4, 0), + validation.Match(regexp.MustCompile(`^[a-zA-Z\s]+$`))), + + validation.Field(&req.TitleFa, + validation.Required, + validation.Length(4, 0), + validation.Match(regexp.MustCompile(`^[\x{0600}-\x{06FF}\s]+$`))), + ) +}