]> source.dussan.org Git - gitea.git/commitdiff
work on #1493
authorUnknwon <u@gogs.io>
Mon, 17 Aug 2015 09:05:37 +0000 (17:05 +0800)
committerUnknwon <u@gogs.io>
Mon, 17 Aug 2015 09:05:37 +0000 (17:05 +0800)
gogs.go
models/repo.go
models/token.go
models/user.go
modules/auth/auth.go
routers/api/v1/user_app.go
routers/repo/http.go
routers/user/setting.go
templates/.VERSION

diff --git a/gogs.go b/gogs.go
index d197e32dab7370430f7cdcfb134edf488ae764fb..d090b2225bcf7bafda860dafbf1b885ceae4032e 100644 (file)
--- a/gogs.go
+++ b/gogs.go
@@ -17,7 +17,7 @@ import (
        "github.com/gogits/gogs/modules/setting"
 )
 
-const APP_VER = "0.6.5.0815 Beta"
+const APP_VER = "0.6.5.0817 Beta"
 
 func init() {
        runtime.GOMAXPROCS(runtime.NumCPU())
index 9aed7d7d334077beb149d5b0f66f4be134db9775..fb787baeac4e36740afdc2fcc7e0ce533be1a6db 100644 (file)
@@ -1435,9 +1435,9 @@ func NotifyWatchers(act *Action) error {
 //         \/           \/
 
 type Star struct {
-       Id     int64
-       Uid    int64 `xorm:"UNIQUE(s)"`
-       RepoId int64 `xorm:"UNIQUE(s)"`
+       ID     int64 `xorm:"pk autoincr"`
+       UID    int64 `xorm:"uid UNIQUE(s)"`
+       RepoID int64 `xorm:"UNIQUE(s)"`
 }
 
 // Star or unstar repository.
@@ -1446,7 +1446,7 @@ func StarRepo(uid, repoId int64, star bool) (err error) {
                if IsStaring(uid, repoId) {
                        return nil
                }
-               if _, err = x.Insert(&Star{Uid: uid, RepoId: repoId}); err != nil {
+               if _, err = x.Insert(&Star{UID: uid, RepoID: repoId}); err != nil {
                        return err
                } else if _, err = x.Exec("UPDATE `repository` SET num_stars = num_stars + 1 WHERE id = ?", repoId); err != nil {
                        return err
index 909d05e072b38f45a9a031e111cca667cc57485a..d17182776803f5525bfd5b9aca8e512eaaca86a0 100644 (file)
@@ -18,8 +18,8 @@ var (
 
 // AccessToken represents a personal access token.
 type AccessToken struct {
-       Id                int64
-       Uid               int64
+       ID                int64 `xorm:"pk autoincr"`
+       UID               int64 `xorm:"uid INDEX"`
        Name              string
        Sha1              string    `xorm:"UNIQUE VARCHAR(40)"`
        Created           time.Time `xorm:"CREATED"`
index ca49a5b8f63f156bae5537bb83236cf072407a3c..8f93707da1cb0abd1ca286038678f804abfcb28c 100644 (file)
@@ -515,8 +515,12 @@ func DeleteBeans(e Engine, beans ...interface{}) (err error) {
 }
 
 // FIXME: need some kind of mechanism to record failure. HINT: system notice
-// DeleteUser completely and permanently deletes everything of user.
+// DeleteUser completely and permanently deletes everything of a user,
+// but issues/comments/pulls will be kept and shown as someone has been deleted.
 func DeleteUser(u *User) error {
+       // Note: A user owns any repository or belongs to any organization
+       //      cannot perform delete operation.
+
        // Check ownership of repository.
        count, err := GetRepositoryCount(u)
        if err != nil {
@@ -533,80 +537,116 @@ func DeleteUser(u *User) error {
                return ErrUserHasOrgs{UID: u.Id}
        }
 
-       // Get watches before session.
+       sess := x.NewSession()
+       defer sessionRelease(sess)
+       if err = sess.Begin(); err != nil {
+               return err
+       }
+
+       // ***** START: Watch *****
        watches := make([]*Watch, 0, 10)
-       if err = x.Where("user_id=?", u.Id).Find(&watches); err != nil {
+       if err = x.Find(&watches, &Watch{UserID: u.Id}); err != nil {
                return fmt.Errorf("get all watches: %v", err)
        }
-       repoIDs := make([]int64, 0, len(watches))
        for i := range watches {
-               repoIDs = append(repoIDs, watches[i].RepoID)
+               if _, err = sess.Exec("UPDATE `repository` SET num_watches=num_watches-1 WHERE id=?", watches[i].RepoID); err != nil {
+                       return fmt.Errorf("decrease repository watch number[%d]: %v", watches[i].RepoID, err)
+               }
        }
+       // ***** END: Watch *****
 
-       // FIXME: check issues, other repos' commits
+       // ***** START: Star *****
+       stars := make([]*Star, 0, 10)
+       if err = x.Find(&stars, &Star{UID: u.Id}); err != nil {
+               return fmt.Errorf("get all stars: %v", err)
+       }
+       for i := range stars {
+               if _, err = sess.Exec("UPDATE `repository` SET num_stars=num_stars-1 WHERE id=?", stars[i].RepoID); err != nil {
+                       return fmt.Errorf("decrease repository star number[%d]: %v", stars[i].RepoID, err)
+               }
+       }
+       // ***** END: Star *****
 
-       sess := x.NewSession()
-       defer sessionRelease(sess)
-       if err = sess.Begin(); err != nil {
-               return err
+       // ***** START: Follow *****
+       followers := make([]*Follow, 0, 10)
+       if err = x.Find(&followers, &Follow{UserID: u.Id}); err != nil {
+               return fmt.Errorf("get all followers: %v", err)
+       }
+       for i := range followers {
+               if _, err = sess.Exec("UPDATE `user` SET num_followers=num_followers-1 WHERE id=?", followers[i].UserID); err != nil {
+                       return fmt.Errorf("decrease user follower number[%d]: %v", followers[i].UserID, err)
+               }
        }
+       // ***** END: Follow *****
 
        if err = DeleteBeans(sess,
-               &Follow{FollowID: u.Id},
                &Oauth2{Uid: u.Id},
-               &Action{UserID: u.Id},
-               &Access{UserID: u.Id},
+               &AccessToken{UID: u.Id},
                &Collaboration{UserID: u.Id},
-               &EmailAddress{Uid: u.Id},
+               &Access{UserID: u.Id},
                &Watch{UserID: u.Id},
+               &Star{UID: u.Id},
+               &Follow{FollowID: u.Id},
+               &Action{UserID: u.Id},
                &IssueUser{UID: u.Id},
+               &EmailAddress{Uid: u.Id},
        ); err != nil {
-               return err
+               return fmt.Errorf("DeleteBeans: %v", err)
        }
 
-       // Decrease all watch numbers.
-       for i := range repoIDs {
-               if _, err = sess.Exec("UPDATE `repository` SET num_watches=num_watches-1 WHERE id=?", repoIDs[i]); err != nil {
-                       return err
-               }
-       }
-
-       // Delete all SSH keys.
+       // ***** START: PublicKey *****
        keys := make([]*PublicKey, 0, 10)
        if err = sess.Find(&keys, &PublicKey{OwnerID: u.Id}); err != nil {
-               return err
+               return fmt.Errorf("get all public keys: %v", err)
        }
        for _, key := range keys {
                if err = deletePublicKey(sess, key); err != nil {
-                       return err
+                       return fmt.Errorf("deletePublicKey: %v", err)
                }
        }
+       // ***** END: PublicKey *****
 
        // Clear assignee.
        if _, err = sess.Exec("UPDATE `issue` SET assignee_id=0 WHERE assignee_id=?", u.Id); err != nil {
-               return err
+               return fmt.Errorf("clear assignee: %v", err)
        }
 
        if _, err = sess.Delete(u); err != nil {
-               return err
+               return fmt.Errorf("Delete: %v", err)
        }
 
-       // Delete user data.
-       if err = os.RemoveAll(UserPath(u.Name)); err != nil {
-               return err
+       if err = sess.Commit(); err != nil {
+               return fmt.Errorf("Commit: %v", err)
        }
-       // Delete avatar.
+
+       // FIXME: system notice
+       // Note: There are something just cannot be roll back,
+       //      so just keep error logs of those operations.
+
+       RewriteAllPublicKeys()
+       os.RemoveAll(UserPath(u.Name))
        os.Remove(u.CustomAvatarPath())
 
-       return sess.Commit()
+       return nil
 }
 
 // DeleteInactivateUsers deletes all inactivate users and email addresses.
-func DeleteInactivateUsers() error {
-       _, err := x.Where("is_active=?", false).Delete(new(User))
-       if err == nil {
-               _, err = x.Where("is_activated=?", false).Delete(new(EmailAddress))
+func DeleteInactivateUsers() (err error) {
+       users := make([]*User, 0, 10)
+       if err = x.Where("is_active=?", false).Find(&users); err != nil {
+               return fmt.Errorf("get all inactive users: %v", err)
+       }
+       for _, u := range users {
+               if err = DeleteUser(u); err != nil {
+                       // Ignore users that were set inactive by admin.
+                       if IsErrUserOwnRepos(err) || IsErrUserHasOrgs(err) {
+                               continue
+                       }
+                       return err
+               }
        }
+
+       _, err = x.Where("is_activated=?", false).Delete(new(EmailAddress))
        return err
 }
 
@@ -895,9 +935,9 @@ func SearchUserByName(opt SearchOption) (us []*User, err error) {
 
 // Follow is connection request for receiving user notification.
 type Follow struct {
-       Id       int64
-       UserID   int64 `xorm:"unique(follow)"`
-       FollowID int64 `xorm:"unique(follow)"`
+       ID       int64 `xorm:"pk autoincr"`
+       UserID   int64 `xorm:"UNIQUE(follow)"`
+       FollowID int64 `xorm:"UNIQUE(follow)"`
 }
 
 // FollowUser marks someone be another's follower.
index 92bcd720804a37a3ff2defdb03f18dc326b587c7..3898083266de8aa2382028228601656e78544d39 100644 (file)
@@ -44,7 +44,7 @@ func SignedInId(req *http.Request, sess session.Store) int64 {
                                        }
                                        return 0
                                }
-                               return t.Uid
+                               return t.UID
                        }
                }
        }
index 31da8a3eefa295f51f20c78940d71d4b8f9e7f3c..5e5156aca4d0a46d0e0befb7c03f1acab63552af 100644 (file)
@@ -34,7 +34,7 @@ type CreateAccessTokenForm struct {
 // POST /users/:username/tokens
 func CreateAccessToken(ctx *middleware.Context, form CreateAccessTokenForm) {
        t := &models.AccessToken{
-               Uid:  ctx.User.Id,
+               UID:  ctx.User.Id,
                Name: form.Name,
        }
        if err := models.NewAccessToken(t); err != nil {
index 54ea91cada10902b86dba75403c78c9ab6cf4d01..abf6134f23c5008d6285cf096827aa0a51b8812a 100644 (file)
@@ -122,7 +122,7 @@ func Http(ctx *middleware.Context) {
                                }
                                return
                        }
-                       authUser, err = models.GetUserByID(token.Uid)
+                       authUser, err = models.GetUserByID(token.UID)
                        if err != nil {
                                ctx.Handle(500, "GetUserById", err)
                                return
index de9af6556bb17d6e6f2b4f41ffb2844c6aca41eb..428065249aa883aacbb928aba61c80986f03ff8f 100644 (file)
@@ -420,7 +420,7 @@ func SettingsApplicationsPost(ctx *middleware.Context, form auth.NewAccessTokenF
                }
 
                t := &models.AccessToken{
-                       Uid:  ctx.User.Id,
+                       UID:  ctx.User.Id,
                        Name: form.Name,
                }
                if err := models.NewAccessToken(t); err != nil {
index 2b9aa5b037745f912dd7e8eb425fd7b1f153d424..9962d7894fc0722cd1c60613fb51dc101e01f399 100644 (file)
@@ -1 +1 @@
-0.6.5.0815 Beta
\ No newline at end of file
+0.6.5.0817 Beta
\ No newline at end of file