added flag to indicate account is currently syncing

This commit is contained in:
Brad Rydzewski 2014-07-11 13:45:32 -07:00
parent 3a6ce5b5e1
commit b9b79b7994
4 changed files with 24 additions and 16 deletions

View file

@ -19,6 +19,7 @@ var stmts = []string{`
,user_token VARCHAR(255)
,user_admin BOOLEAN
,user_active BOOLEAN
,user_syncing BOOLEAN
,user_created INTEGER
,user_updated INTEGER
,user_synced INTEGER

View file

@ -7,10 +7,10 @@ import (
var stmts = []string{
// insert user entries
"insert into users values (1, 'github.com', 'smellypooper', 'f0b461ca586c27872b43a0685cbc2847', '976f22a5eef7caacb7e678d6c52f49b1', 'Dr. Cooper', 'drcooper@caltech.edu', 'b9015b0857e16ac4d94a0ffd9a0b79c8', 'e42080dddf012c718e476da161d21ad5', 1, 1, 1398065343, 1398065344, 1398065345);",
"insert into users values (2, 'github.com', 'lhofstadter', 'e4105c3059ac4c466594932dc9a4ffb2', '2257216903d9cd0d3d24772132febf52', 'Dr. Hofstadter', 'leanard@caltech.edu', '23dde632fdece6880f4ff03bb20f05d7', 'a5ad0d75f317f0b0a5dfdb68e5a3079e', 1, 1, 1398065343, 1398065344, 1398065345);",
"insert into users values (3, 'gitlab.com', 'browndynamite', '4821477cc26a0c8c80c6c9b568d98e32', '1dd52c37cf5c63fe5abfd047b5b74a31', 'Dr. Koothrappali', 'rajesh@caltech.edu', 'f9133051f480b7ea88848b9f0a079dae', '7a50ede04637d4a8fce532c7d511226b', 1, 1, 1398065343, 1398065344, 1398065345);",
"insert into users values (4, 'github.com', 'mrwolowitz', '1f6a80bde960e6913bf9b7e61eadd068', '74c40472494ba7f9f6c3ae061ff799ed', 'Mr. Wolowitz', 'wolowitz@caltech.edu', 'ea250570c794d84dc583421bb717be82', '3bd7e7d7411b2978e45919c9ad419984', 1, 1, 1398065343, 1398065344, 1398065345);",
"insert into users values (1, 'github.com', 'smellypooper', 'f0b461ca586c27872b43a0685cbc2847', '976f22a5eef7caacb7e678d6c52f49b1', 'Dr. Cooper', 'drcooper@caltech.edu', 'b9015b0857e16ac4d94a0ffd9a0b79c8', 'e42080dddf012c718e476da161d21ad5', 1, 1, 0, 1398065343, 1398065344, 1398065345);",
"insert into users values (2, 'github.com', 'lhofstadter', 'e4105c3059ac4c466594932dc9a4ffb2', '2257216903d9cd0d3d24772132febf52', 'Dr. Hofstadter', 'leanard@caltech.edu', '23dde632fdece6880f4ff03bb20f05d7', 'a5ad0d75f317f0b0a5dfdb68e5a3079e', 1, 1, 0, 1398065343, 1398065344, 1398065345);",
"insert into users values (3, 'gitlab.com', 'browndynamite', '4821477cc26a0c8c80c6c9b568d98e32', '1dd52c37cf5c63fe5abfd047b5b74a31', 'Dr. Koothrappali', 'rajesh@caltech.edu', 'f9133051f480b7ea88848b9f0a079dae', '7a50ede04637d4a8fce532c7d511226b', 1, 1, 0, 1398065343, 1398065344, 1398065345);",
"insert into users values (4, 'github.com', 'mrwolowitz', '1f6a80bde960e6913bf9b7e61eadd068', '74c40472494ba7f9f6c3ae061ff799ed', 'Mr. Wolowitz', 'wolowitz@caltech.edu', 'ea250570c794d84dc583421bb717be82', '3bd7e7d7411b2978e45919c9ad419984', 1, 1, 0, 1398065343, 1398065344, 1398065345);",
// insert repository entries
"insert into repos values (1, 0, 'github.com', 'github.com', 'lhofstadter', 'lenwoloppali', '', 'git://github.com/lhofstadter/lenwoloppali.git', '', '', 1, 1, 1, 1, 1, 'publickey', 'privatekey', 'params', 900, 1398065343, 1398065344);",

View file

@ -78,6 +78,7 @@ func (h *LoginHandler) GetLogin(w http.ResponseWriter, r *http.Request) error {
u.Secret = login.Secret
u.Name = login.Name
u.SetEmail(login.Email)
u.Syncing = u.IsStale()
if err := h.users.Update(u); err != nil {
return badRequest{err}
}
@ -85,23 +86,21 @@ func (h *LoginHandler) GetLogin(w http.ResponseWriter, r *http.Request) error {
// look at the last synchronized date to determine if
// we need to re-sync the account.
//
// TODO this should move to a server/sync package and
// should be injected into this struct, just like
// the database code.
if u.IsStale() {
// todo(bradrydzewski) this should move to a server/sync package and
// should be injected into this struct, just like the database code.
//
// todo(bradrydzewski) this login should be a bit more intelligent
// than the current implementation.
//
// todo(bradrydzewski) the github implementation will only sync a
// maximum of 100 repositories due to the api pagination. need to fix.
if u.Syncing {
redirect = "/sync"
log.Println("sync user account.", u.Login)
// sync inside a goroutine. This should eventually be moved to
// its own package / sync utility.
go func() {
// mark as synced
u.Synced = time.Now().Unix()
if err := h.users.Update(u); err != nil {
log.Println("Error syncing user account, updating sync date", u.Login, err)
return
}
// list all repositories
client := remote.GetClient(u.Access, u.Secret)
repos, err := client.GetRepos("")
@ -132,6 +131,13 @@ func (h *LoginHandler) GetLogin(w http.ResponseWriter, r *http.Request) error {
}
log.Println("Successfully syced repo.", u.Login+"/"+remoteRepo.Name)
u.Synced = time.Now().Unix()
u.Syncing = false
if err := h.users.Update(u); err != nil {
log.Println("Error syncing user account, updating sync date", u.Login, err)
return
}
}
}()
}
@ -148,7 +154,7 @@ func (h *LoginHandler) GetLogin(w http.ResponseWriter, r *http.Request) error {
// GET /logout
func (h *LoginHandler) GetLogout(w http.ResponseWriter, r *http.Request) error {
h.sess.Clear(w, r)
http.Redirect(w, r, "/", http.StatusSeeOther)
http.Redirect(w, r, "/login", http.StatusSeeOther)
return nil
}

View file

@ -16,6 +16,7 @@ type User struct {
Token string `meddler:"user_token" json:"-"`
Admin bool `meddler:"user_admin" json:"admin"`
Active bool `meddler:"user_active" json:"active"`
Syncing bool `meddler:"user_syncing" json:"syncing"`
Created int64 `meddler:"user_created" json:"created_at"`
Updated int64 `meddler:"user_updated" json:"updated_at"`
Synced int64 `meddler:"user_synced" json:"synced_at"`