diff --git a/api/user.go b/api/user.go index cf1757eb..13625623 100644 --- a/api/user.go +++ b/api/user.go @@ -73,3 +73,7 @@ type UserFind struct { Name *string `json:"name"` OpenID *string } + +type UserDelete struct { + ID int +} diff --git a/server/user.go b/server/user.go index 701041a8..2ba64cb8 100644 --- a/server/user.go +++ b/server/user.go @@ -44,6 +44,11 @@ func (s *Server) registerUserRoutes(g *echo.Group) { return echo.NewHTTPError(http.StatusInternalServerError, "Failed to fetch user list").SetInternal(err) } + for _, user := range userList { + // data desensitize + user.OpenID = "" + } + c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(userList)); err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "Failed to encode user list response").SetInternal(err) diff --git a/store/db/seed/10001__user.sql b/store/db/seed/10001__user.sql index cda2e750..1d6182a7 100644 --- a/store/db/seed/10001__user.sql +++ b/store/db/seed/10001__user.sql @@ -37,3 +37,25 @@ VALUES -- raw password: secret '$2a$14$ajq8Q7fbtFRQvXpdCq7Jcuy.Rx1h/L4J60Otx.gyNLbAYctGMJ9tK' ); + +INSERT INTO + user ( + `id`, + `row_status`, + `email`, + `role`, + `name`, + `open_id`, + `password_hash` + ) +VALUES + ( + 103, + 'ARCHIVED', + 'bob@usememos.com', + 'USER', + 'Bob', + 'bob_open_id', + -- raw password: secret + '$2a$14$ajq8Q7fbtFRQvXpdCq7Jcuy.Rx1h/L4J60Otx.gyNLbAYctGMJ9tK' + ); \ No newline at end of file diff --git a/store/user.go b/store/user.go index f52b34c7..14a2be13 100644 --- a/store/user.go +++ b/store/user.go @@ -96,6 +96,15 @@ func (s *Store) FindUser(find *api.UserFind) (*api.User, error) { return user, nil } +func (s *Store) DeleteUser(delete *api.UserDelete) error { + err := deleteUser(s.db, delete) + if err != nil { + return FormatError(err) + } + + return nil +} + func createUser(db *sql.DB, create *api.UserCreate) (*userRaw, error) { row, err := db.Query(` INSERT INTO user ( @@ -224,7 +233,7 @@ func findUserList(db *sql.DB, find *api.UserFind) ([]*userRaw, error) { row_status FROM user WHERE `+strings.Join(where, " AND ")+` - ORDER BY created_ts DESC`, + ORDER BY created_ts DESC, row_status DESC`, args..., ) if err != nil { @@ -259,3 +268,17 @@ func findUserList(db *sql.DB, find *api.UserFind) ([]*userRaw, error) { return userRawList, nil } + +func deleteUser(db *sql.DB, delete *api.UserDelete) error { + result, err := db.Exec(`DELETE FROM user WHERE id = ?`, delete.ID) + if err != nil { + return FormatError(err) + } + + rows, _ := result.RowsAffected() + if rows == 0 { + return &common.Error{Code: common.NotFound, Err: fmt.Errorf("user ID not found: %d", delete.ID)} + } + + return nil +}