diff --git a/cmd/user_data.go b/cmd/user_data.go index 17419568..aa343b7c 100644 --- a/cmd/user_data.go +++ b/cmd/user_data.go @@ -27,6 +27,18 @@ var UserData = &cli.Command{ }, }, }, + { + Name: "user-delete", + Usage: "Delete specified user", + Action: deleteUser, + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "username", + Aliases: []string{"n"}, + Usage: "Specific user name", + }, + }, + }, { Name: "transaction-check", Usage: "Check whether user all transactions and accounts are correct", @@ -79,6 +91,26 @@ func getUserInfo(c *cli.Context) error { return nil } +func deleteUser(c *cli.Context) error { + _, err := initializeSystem(c) + + if err != nil { + return err + } + + userName := c.String("username") + err = clis.UserData.DeleteUser(c, userName) + + if err != nil { + log.BootErrorf("[user_data.deleteUser] error occurs when deleting user") + return err + } + + log.BootInfof("[user_data.deleteUser] user \"%s\" has been deleted", userName) + + return nil +} + func checkUserTransactionAndAccount(c *cli.Context) error { _, err := initializeSystem(c) diff --git a/pkg/cli/user_data.go b/pkg/cli/user_data.go index c7a70605..1cf90968 100644 --- a/pkg/cli/user_data.go +++ b/pkg/cli/user_data.go @@ -54,6 +54,23 @@ func (a *UserDataCli) GetUserByUsername(c *cli.Context, username string) (*model return user, nil } +// DeleteUser deletes user according to the specified user name +func (a *UserDataCli) DeleteUser(c *cli.Context, username string) error { + if username == "" { + log.BootErrorf("[user_data.DeleteUser] user name is empty") + return errs.ErrUsernameIsEmpty + } + + err := a.users.DeleteUser(username) + + if err != nil { + log.BootErrorf("[user_data.DeleteUser] failed to delete user by user name \"%s\", because %s", username, err.Error()) + return err + } + + return nil +} + // CheckTransactionAndAccount checks whether all user transactions and all user accounts are correct func (a *UserDataCli) CheckTransactionAndAccount(c *cli.Context, uid int64) (bool, error) { accountMap, categoryMap, tagMap, tagIndexs, err := a.getUserEssentialData(uid) diff --git a/pkg/services/users.go b/pkg/services/users.go index 301acfe1..90b84c14 100644 --- a/pkg/services/users.go +++ b/pkg/services/users.go @@ -232,6 +232,29 @@ func (s *UserService) UpdateUserLastLoginTime(uid int64) error { }) } +// DeleteUser deletes an existed user from database +func (s *UserService) DeleteUser(username string) error { + if username == "" { + return errs.ErrUsernameIsEmpty + } + + now := time.Now().Unix() + + updateModel := &models.User{ + Deleted: true, + DeletedUnixTime: now, + } + + deletedRows, err := s.UserDB().Cols("deleted", "deleted_unix_time").Where("username=? AND deleted=?", username, false).Update(updateModel) + + if err != nil { + return err + } else if deletedRows < 1 { + return errs.ErrUserNotFound + } + return nil +} + // ExistsUsername returns whether the given user name exists func (s *UserService) ExistsUsername(username string) (bool, error) { if username == "" {