// Edit a student. func (h *handler) Edit(ctx context.Context, w http.ResponseWriter, r *http.Request) error { var ( err error payload struct { ID int IDNumber string FirstName string LastName string Email string PlaceOfBirth string Address string Birthdate time.Time Gender bool Nationality string PhoneNumber string } ) type Response struct { Success bool `json:"success"` ErrorMessage string `json:"errorMessage"` } if err = httputils.DecodeJSON(r.Body, &payload); err != nil { httputils.WriteError(w, http.StatusBadRequest, "") return nil } student := &models.Student{ ID: payload.ID, IDNumber: payload.IDNumber, FirstName: payload.FirstName, LastName: payload.LastName, Email: payload.Email, PlaceOfBirth: payload.PlaceOfBirth, Address: payload.Address, Birthdate: payload.Birthdate, Gender: payload.Gender, Nationality: payload.Nationality, PhoneNumber: payload.PhoneNumber, } err = h.studentService.Edit(student) if err != nil { if err == services.ErrDuplicatedStudentIDNumber { return httputils.WriteJSON(w, http.StatusOK, &Response{ Success: false, ErrorMessage: "El número de cédula o pasaporte ya existe!", }) } return err } return httputils.WriteJSON(w, http.StatusOK, &Response{ Success: true, }) }
// Edit a user. func (h *handler) Edit(ctx context.Context, w http.ResponseWriter, r *http.Request) error { var ( err error payload struct { ID int Username string Email string FirstName string LastName string Status int IsAdmin bool IsTeacher bool } ) type Response struct { Success bool `json:"success"` ErrorMessage string `json:"errorMessage"` } if err = httputils.DecodeJSON(r.Body, &payload); err != nil { httputils.WriteError(w, http.StatusBadRequest, "") return nil } user := &models.User{ ID: payload.ID, Username: payload.Username, Email: payload.Email, FirstName: payload.FirstName, LastName: payload.LastName, Status: payload.Status, IsAdmin: payload.IsAdmin, IsTeacher: payload.IsTeacher, } err = h.userService.Edit(user) if err != nil { if err == services.ErrDuplicatedUsername { return httputils.WriteJSON(w, http.StatusOK, &Response{ Success: false, ErrorMessage: "El nombre de usuario ya existe!", }) } return err } return httputils.WriteJSON(w, http.StatusOK, &Response{ Success: true, }) }
// Delete user. func (h *handler) Delete(ctx context.Context, w http.ResponseWriter, r *http.Request) error { var ( err error payload struct { UserID int } ) if err = httputils.DecodeJSON(r.Body, &payload); err != nil { httputils.WriteError(w, http.StatusBadRequest, "") return nil } err = h.userService.Delete(payload.UserID) if err != nil { return err } return httputils.WriteJSON(w, http.StatusOK, nil) }
// ChangePasswordForCurrentUser changes the logged user's password. func (h *handler) ChangePasswordForCurrentUser(ctx context.Context, w http.ResponseWriter, r *http.Request) error { var ( err error sessionData, _ = ctx.Value("sessionData").(*httputils.SessionData) payload struct { NewPassword string } ) if err = httputils.DecodeJSON(r.Body, &payload); err != nil { httputils.WriteError(w, http.StatusBadRequest, "") return nil } err = h.userService.ChangePassword(sessionData.UserID, payload.NewPassword) if err != nil && err != services.ErrRecordNotFound { return err } return httputils.WriteJSON(w, http.StatusOK, nil) }
// ChangePassword changes a user's password. func (h *handler) ChangePassword(ctx context.Context, w http.ResponseWriter, r *http.Request) error { var ( err error payload struct { UserID int NewPassword string } ) if err = httputils.DecodeJSON(r.Body, &payload); err != nil { httputils.WriteError(w, http.StatusBadRequest, "") return nil } err = h.userService.ChangePassword(payload.UserID, payload.NewPassword) if err != nil && err != services.ErrRecordNotFound { return err } return httputils.WriteJSON(w, http.StatusOK, nil) }
// Login does basic email/password login. // Checks: // - User must exist // - Passwords match // - User's status is Active // // If the checks pass, it sets up a session cookie. func (h *handler) Login(ctx context.Context, w http.ResponseWriter, r *http.Request) error { var ( cookieStore = ctx.Value("cookieStore").(*sessions.CookieStore) err error loginForm struct { Identifier string Password string } ) if err = httputils.DecodeJSON(r.Body, &loginForm); err != nil { httputils.WriteError(w, http.StatusBadRequest, "") return nil } user, err := h.authService.BasicAuth(loginForm.Identifier, loginForm.Password) if err != nil { httputils.WriteError(w, http.StatusInternalServerError, "") return nil } else if user == nil { httputils.WriteError(w, http.StatusUnauthorized, "Usuario/clave inválidos") return nil } session, _ := cookieStore.New(r, h.cfg.SessionCookieName) session.Values["data"] = &httputils.SessionData{ UserID: user.ID, Email: user.Email, IsAdmin: user.IsAdmin, IsTeacher: user.IsTeacher, ExpiresAt: time.Now().Add(h.cfg.SessionLifeTime), } return session.Save(r, w) }