Create User @Tags users @Summary Create user @Description Create user @Accept json @Produce json @Param request body docs.UserCreate true "request" @Success 200 {object} v1User.User @Security ApiKeyAuth @Router /users [post]
()
| 107 | // @Security ApiKeyAuth |
| 108 | // @Router /users [post] |
| 109 | func (h *Handler) CreateUser() iris.Handler { |
| 110 | return func(ctx *context.Context) { |
| 111 | var req User |
| 112 | if err := ctx.ReadJSON(&req); err != nil { |
| 113 | ctx.StatusCode(iris.StatusBadRequest) |
| 114 | ctx.Values().Set("message", err.Error()) |
| 115 | return |
| 116 | } |
| 117 | u := ctx.Values().Get("profile") |
| 118 | profile := u.(session.UserProfile) |
| 119 | //tx |
| 120 | tx, err := server.DB().Begin(true) |
| 121 | if err != nil { |
| 122 | ctx.StatusCode(iris.StatusInternalServerError) |
| 123 | ctx.Values().Set("message", err.Error()) |
| 124 | return |
| 125 | } |
| 126 | req.CreatedBy = profile.Name |
| 127 | if req.Language == "" { |
| 128 | req.Language = profile.Language |
| 129 | } |
| 130 | req.Type = v1User.LOCAL |
| 131 | if err := h.userService.Create(&req.User, common.DBOptions{DB: tx}); err != nil { |
| 132 | _ = tx.Rollback() |
| 133 | if errors.Is(err, storm.ErrAlreadyExists) { |
| 134 | u, _ := h.userService.GetByNameOrEmail(req.User.Name, common.DBOptions{}) |
| 135 | if u != nil { |
| 136 | ctx.StatusCode(iris.StatusInternalServerError) |
| 137 | ctx.Values().Set("message", "username already exists") |
| 138 | return |
| 139 | } |
| 140 | u, _ = h.userService.GetByNameOrEmail(req.User.Email, common.DBOptions{}) |
| 141 | if u != nil { |
| 142 | ctx.StatusCode(iris.StatusInternalServerError) |
| 143 | ctx.Values().Set("message", "email already exists") |
| 144 | return |
| 145 | } |
| 146 | } |
| 147 | ctx.StatusCode(iris.StatusInternalServerError) |
| 148 | ctx.Values().Set("message", err.Error()) |
| 149 | return |
| 150 | } |
| 151 | if len(req.Roles) > 0 { |
| 152 | for i := range req.Roles { |
| 153 | roleName := req.Roles[i] |
| 154 | binding := v1Role.Binding{ |
| 155 | BaseModel: v1.BaseModel{ |
| 156 | Kind: "RoleBind", |
| 157 | ApiVersion: "v1", |
| 158 | CreatedBy: profile.Name, |
| 159 | }, |
| 160 | Metadata: v1.Metadata{ |
| 161 | Name: fmt.Sprintf("role-binding-%s-%s", roleName, req.Name), |
| 162 | }, |
| 163 | Subject: v1Role.Subject{ |
| 164 | Kind: "User", |
| 165 | Name: req.Name, |
| 166 | }, |
no test coverage detected