| @@ -1,4 +1,5 @@ | |||
| gogs | |||
| *.exe | |||
| *.exe~ | |||
| .DS_Store | |||
| .DS_Store | |||
| *.db | |||
| @@ -5,67 +5,42 @@ | |||
| package models | |||
| import ( | |||
| "os" | |||
| "path/filepath" | |||
| "github.com/lunny/xorm" | |||
| "time" | |||
| git "github.com/libgit2/git2go" | |||
| "github.com/lunny/xorm" | |||
| ) | |||
| const ( | |||
| UserRepo = iota | |||
| OrgRepo | |||
| var ( | |||
| // orm | |||
| orm *xorm.Engine | |||
| // repository root path | |||
| root string | |||
| ) | |||
| type User struct { | |||
| Id int64 | |||
| Name string `xorm:"unique"` | |||
| type PublicKey struct { | |||
| Id int64 | |||
| Name string `xorm:"unique not null"` | |||
| Content string `xorm:"text not null"` | |||
| Created time.Time `xorm:"created"` | |||
| Updated time.Time `xorm:"updated"` | |||
| } | |||
| type Org struct { | |||
| Id int64 | |||
| type Members struct { | |||
| Id int64 | |||
| OrgId int64 `xorm:"unique(s) index"` | |||
| UserId int64 `xorm:"unique(s)"` | |||
| } | |||
| type Repo struct { | |||
| Id int64 | |||
| OwnerId int64 `xorm:"unique(s)"` | |||
| Type int `xorm:"unique(s)"` | |||
| Name string `xorm:"unique(s)"` | |||
| type Issue struct { | |||
| Id int64 | |||
| RepoId int64 `xorm:"index"` | |||
| PosterId int64 | |||
| } | |||
| var ( | |||
| orm *xorm.Engine | |||
| ) | |||
| // | |||
| // create a repository for a user or orgnaziation | |||
| // | |||
| func CreateUserRepository(root string, user *User, reposName string) error { | |||
| p := filepath.Join(root, user.Name) | |||
| os.MkdirAll(p, os.ModePerm) | |||
| f := filepath.Join(p, reposName) | |||
| _, err := git.InitRepository(f, false) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| repo := Repo{OwnerId: user.Id, Type: UserRepo, Name: reposName} | |||
| _, err = orm.Insert(&repo) | |||
| if err != nil { | |||
| os.RemoveAll(f) | |||
| } | |||
| return err | |||
| type PullRequest struct { | |||
| Id int64 | |||
| } | |||
| // | |||
| // delete a repository for a user or orgnaztion | |||
| // | |||
| func DeleteUserRepository(root string, user *User, reposName string) error { | |||
| err := os.RemoveAll(filepath.Join(root, user.Name, reposName)) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| _, err = orm.Delete(&Repo{OwnerId: user.Id, Type: UserRepo, Name: reposName}) | |||
| return err | |||
| type Comment struct { | |||
| Id int64 | |||
| } | |||
| @@ -15,15 +15,28 @@ func init() { | |||
| fmt.Println(err) | |||
| } | |||
| err = orm.Sync(&User{}, &Org{}, &Repo{}) | |||
| orm.ShowSQL = true | |||
| orm.ShowDebug = true | |||
| err = orm.Sync(&User{}, &Repo{}) | |||
| if err != nil { | |||
| fmt.Println(err) | |||
| } | |||
| root = "test" | |||
| } | |||
| func TestCreateRepository(t *testing.T) { | |||
| user := User{Id: 1} | |||
| err := CreateUserRepository("test", &user, "test") | |||
| user := User{Id: 1, Type: Individual} | |||
| _, err := CreateRepository(&user, "test") | |||
| if err != nil { | |||
| t.Error(err) | |||
| } | |||
| } | |||
| func TestDeleteRepository(t *testing.T) { | |||
| user := User{Id: 1, Type: Individual} | |||
| err := DeleteRepository(&user, "test") | |||
| if err != nil { | |||
| t.Error(err) | |||
| } | |||
| @@ -0,0 +1,119 @@ | |||
| package models | |||
| import ( | |||
| "os" | |||
| "path/filepath" | |||
| "strings" | |||
| "time" | |||
| git "github.com/libgit2/git2go" | |||
| ) | |||
| type Repo struct { | |||
| Id int64 | |||
| OwnerId int64 `xorm:"unique(s)"` | |||
| ForkId int64 | |||
| LowerName string `xorm:"unique(s) index not null"` | |||
| Name string `xorm:"index not null"` | |||
| NumWatchs int | |||
| NumStars int | |||
| NumForks int | |||
| Created time.Time `xorm:"created"` | |||
| Updated time.Time `xorm:"updated"` | |||
| } | |||
| // check if repository is exist | |||
| func IsRepositoryExist(user *User, reposName string) (bool, error) { | |||
| repo := Repo{OwnerId: user.Id} | |||
| // TODO: get repository by nocase name | |||
| return orm.Where("lower_name = ?", strings.ToLower(reposName)).Get(&repo) | |||
| } | |||
| // | |||
| // create a repository for a user or orgnaziation | |||
| // | |||
| func CreateRepository(user *User, reposName string) (*Repo, error) { | |||
| p := filepath.Join(root, user.Name) | |||
| os.MkdirAll(p, os.ModePerm) | |||
| f := filepath.Join(p, reposName) | |||
| _, err := git.InitRepository(f, false) | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| repo := Repo{OwnerId: user.Id, Name: reposName} | |||
| session := orm.NewSession() | |||
| defer session.Close() | |||
| session.Begin() | |||
| _, err = session.Insert(&repo) | |||
| if err != nil { | |||
| os.RemoveAll(f) | |||
| session.Rollback() | |||
| return nil, err | |||
| } | |||
| _, err = session.Exec("update user set num_repos = num_repos + 1 where id = ?", user.Id) | |||
| if err != nil { | |||
| os.RemoveAll(f) | |||
| session.Rollback() | |||
| return nil, err | |||
| } | |||
| err = session.Commit() | |||
| if err != nil { | |||
| os.RemoveAll(f) | |||
| session.Rollback() | |||
| return nil, err | |||
| } | |||
| return &repo, nil | |||
| } | |||
| // list one user's repository | |||
| func GetRepositories(user *User) ([]Repo, error) { | |||
| repos := make([]Repo, 0) | |||
| err := orm.Find(&repos, &Repo{OwnerId: user.Id}) | |||
| return repos, err | |||
| } | |||
| func StarReposiory(user *User, repoName string) error { | |||
| return nil | |||
| } | |||
| func UnStarRepository() { | |||
| } | |||
| func WatchRepository() { | |||
| } | |||
| func UnWatchRepository() { | |||
| } | |||
| // | |||
| // delete a repository for a user or orgnaztion | |||
| // | |||
| func DeleteRepository(user *User, reposName string) error { | |||
| session := orm.NewSession() | |||
| _, err := session.Delete(&Repo{OwnerId: user.Id, Name: reposName}) | |||
| if err != nil { | |||
| session.Rollback() | |||
| return err | |||
| } | |||
| _, err = session.Exec("update user set num_repos = num_repos - 1 where id = ?", user.Id) | |||
| if err != nil { | |||
| session.Rollback() | |||
| return err | |||
| } | |||
| err = session.Commit() | |||
| if err != nil { | |||
| session.Rollback() | |||
| return err | |||
| } | |||
| err = os.RemoveAll(filepath.Join(root, user.Name, reposName)) | |||
| if err != nil { | |||
| // TODO: log and delete manully | |||
| return err | |||
| } | |||
| return nil | |||
| } | |||
| @@ -0,0 +1,148 @@ | |||
| package models | |||
| import ( | |||
| "errors" | |||
| "fmt" | |||
| "strings" | |||
| "time" | |||
| "github.com/dchest/scrypt" | |||
| ) // user type | |||
| const ( | |||
| Individual = iota + 1 | |||
| Organization | |||
| ) | |||
| // login type | |||
| const ( | |||
| Plain = iota + 1 | |||
| LDAP | |||
| ) | |||
| type User struct { | |||
| Id int64 | |||
| LowerName string `xorm:"unique not null"` | |||
| Name string `xorm:"unique not null"` | |||
| Email string `xorm:"unique not null"` | |||
| Passwd string `xorm:"not null"` | |||
| LoginType int | |||
| Type int | |||
| NumFollowers int | |||
| NumFollowings int | |||
| NumStars int | |||
| NumRepos int | |||
| Avatar string `xorm:"varchar(2048) not null"` | |||
| Created time.Time `xorm:"created"` | |||
| Updated time.Time `xorm:"updated"` | |||
| } | |||
| type Follow struct { | |||
| Id int64 | |||
| UserId int64 `xorm:"unique(s)"` | |||
| FollowId int64 `xorm:"unique(s)"` | |||
| Created time.Time `xorm:"created"` | |||
| } | |||
| const ( | |||
| OpCreateRepo = iota + 1 | |||
| OpDeleteRepo | |||
| OpStarRepo | |||
| OpFollowRepo | |||
| OpCommitRepo | |||
| OpPullRequest | |||
| ) | |||
| type Action struct { | |||
| Id int64 | |||
| UserId int64 | |||
| OpType int | |||
| RepoId int64 | |||
| Content string | |||
| Created time.Time `xorm:"created"` | |||
| } | |||
| var ( | |||
| ErrUserNotExist = errors.New("User not exist") | |||
| ) | |||
| // user's name should be noncased unique | |||
| func IsUserExist(name string) (bool, error) { | |||
| return orm.Get(&User{LowerName: strings.ToLower(name)}) | |||
| } | |||
| func RegisterUser(user *User) error { | |||
| _, err := orm.Insert(user) | |||
| return err | |||
| } | |||
| func UpdateUser(user *User) error { | |||
| _, err := orm.Id(user.Id).Update(user) | |||
| return err | |||
| } | |||
| func (user *User) EncodePasswd(pass string) error { | |||
| newPasswd, err := scrypt.Key([]byte(user.Passwd), []byte("!#@FDEWREWR&*("), 16384, 8, 1, 64) | |||
| user.Passwd = fmt.Sprintf("%x", newPasswd) | |||
| return err | |||
| } | |||
| func LoginUserPlain(name, passwd string) (*User, error) { | |||
| user := User{Name: name} | |||
| err := user.EncodePasswd(passwd) | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| has, err := orm.Get(&user) | |||
| if !has { | |||
| err = ErrUserNotExist | |||
| } | |||
| if err != nil { | |||
| return nil, err | |||
| } | |||
| return &user, nil | |||
| } | |||
| func FollowUser(userId int64, followId int64) error { | |||
| session := orm.NewSession() | |||
| defer session.Close() | |||
| session.Begin() | |||
| _, err := session.Insert(&Follow{UserId: userId, FollowId: followId}) | |||
| if err != nil { | |||
| session.Rollback() | |||
| return err | |||
| } | |||
| _, err = session.Exec("update user set num_followers = num_followers + 1 where id = ?", followId) | |||
| if err != nil { | |||
| session.Rollback() | |||
| return err | |||
| } | |||
| _, err = session.Exec("update user set num_followings = num_followings + 1 where id = ?", userId) | |||
| if err != nil { | |||
| session.Rollback() | |||
| return err | |||
| } | |||
| return session.Commit() | |||
| } | |||
| func UnFollowUser(userId int64, unFollowId int64) error { | |||
| session := orm.NewSession() | |||
| defer session.Close() | |||
| session.Begin() | |||
| _, err := session.Delete(&Follow{UserId: userId, FollowId: unFollowId}) | |||
| if err != nil { | |||
| session.Rollback() | |||
| return err | |||
| } | |||
| _, err = session.Exec("update user set num_followers = num_followers - 1 where id = ?", unFollowId) | |||
| if err != nil { | |||
| session.Rollback() | |||
| return err | |||
| } | |||
| _, err = session.Exec("update user set num_followings = num_followings - 1 where id = ?", userId) | |||
| if err != nil { | |||
| session.Rollback() | |||
| return err | |||
| } | |||
| return session.Commit() | |||
| } | |||