1// Copyright 2023 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package cmd
5
6import (
7 "errors"
8 "fmt"
9 "strings"
10
11 user_model "forgejo.org/models/user"
12 "forgejo.org/modules/storage"
13 user_service "forgejo.org/services/user"
14
15 "github.com/urfave/cli/v2"
16)
17
18var microcmdUserDelete = &cli.Command{
19 Name: "delete",
20 Usage: "Delete specific user by id, name or email",
21 Flags: []cli.Flag{
22 &cli.Int64Flag{
23 Name: "id",
24 Usage: "ID of user of the user to delete",
25 },
26 &cli.StringFlag{
27 Name: "username",
28 Aliases: []string{"u"},
29 Usage: "Username of the user to delete",
30 },
31 &cli.StringFlag{
32 Name: "email",
33 Aliases: []string{"e"},
34 Usage: "Email of the user to delete",
35 },
36 &cli.BoolFlag{
37 Name: "purge",
38 Usage: "Purge user, all their repositories, organizations and comments",
39 },
40 },
41 Action: runDeleteUser,
42}
43
44func runDeleteUser(c *cli.Context) error {
45 if !c.IsSet("id") && !c.IsSet("username") && !c.IsSet("email") {
46 return errors.New("You must provide the id, username or email of a user to delete")
47 }
48
49 ctx, cancel := installSignals()
50 defer cancel()
51
52 if err := initDB(ctx); err != nil {
53 return err
54 }
55
56 if err := storage.Init(); err != nil {
57 return err
58 }
59
60 var err error
61 var user *user_model.User
62 if c.IsSet("email") {
63 user, err = user_model.GetUserByEmail(ctx, c.String("email"))
64 } else if c.IsSet("username") {
65 user, err = user_model.GetUserByName(ctx, c.String("username"))
66 } else {
67 user, err = user_model.GetUserByID(ctx, c.Int64("id"))
68 }
69 if err != nil {
70 return err
71 }
72 if c.IsSet("username") && user.LowerName != strings.ToLower(strings.TrimSpace(c.String("username"))) {
73 return fmt.Errorf("The user %s who has email %s does not match the provided username %s", user.Name, c.String("email"), c.String("username"))
74 }
75
76 if c.IsSet("id") && user.ID != c.Int64("id") {
77 return fmt.Errorf("The user %s does not match the provided id %d", user.Name, c.Int64("id"))
78 }
79
80 return user_service.DeleteUser(ctx, user, c.Bool("purge"))
81}