From d974ae827c0018c2223a47dadda7a6553e1672a6 Mon Sep 17 00:00:00 2001 From: pbochis Date: Wed, 16 Sep 2015 17:35:16 +0300 Subject: [PATCH] Fix GET /users * only return users which were invited by the company the current user represents --- controllers/user.go | 75 ++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 39 deletions(-) diff --git a/controllers/user.go b/controllers/user.go index ab65c16..e5b71a8 100644 --- a/controllers/user.go +++ b/controllers/user.go @@ -4,6 +4,7 @@ import ( "errors" "net/http" "net/mail" + "time" "encoding/json" @@ -149,56 +150,52 @@ func getUsers(p *passenger.Passenger, ctx context.Context, w http.ResponseWriter if err != nil { return http.StatusInternalServerError, err } - - cckeys, err := model.NewQueryForChallenge().Ancestor(u.Company).KeysOnly().GetAll(ctx, nil) - if err != nil { - return http.StatusInternalServerError, err - } - - var resultKeys []*datastore.Key - for _, val := range cckeys { - rkeys, err := model.NewQueryForResult().Filter("Challenge =", val).KeysOnly().GetAll(ctx, nil) - if err != nil { + var state string + invitedUsers := make(map[*datastore.Key]string) + for _, invitation := range invitations { + if state, err = getUserState(ctx, invitation); err != nil { return http.StatusInternalServerError, err } - resultKeys = append(resultKeys, rkeys...) + invitedUsers[invitation.User] = state } - var users model.Users - keys, err := model.NewQueryForUser().GetAll(ctx, &users) - if err != nil { - return http.StatusInternalServerError, err - } + var usersWithState []keyedUserWithState + var user model.User + for key, state := range invitedUsers { - finishedUsers := make([]*datastore.Key, len(resultKeys)) - for i := range resultKeys { - finishedUsers[i] = resultKeys[i].Parent().Parent() + if err = datastore.Get(ctx, key, &user); err != nil { + return http.StatusInternalServerError, err + } + usersWithState = append(usersWithState, keyedUserWithState{ + KeyedUser: &model.KeyedUser{ + User: &user, + Key: key, + }, + State: state, + }) } + json.NewEncoder(w).Encode(usersWithState) + return http.StatusOK, nil +} - // TODO(victorbalan): Don`t load invited users that have an result. - invitedUsers := make([]*datastore.Key, len(invitations)) - for i, val := range invitations { - invitedUsers[i] = val.User +func getUserState(ctx context.Context, invitation model.Invitation) (string, error) { + var profiles model.Profiles + var results model.Results + keys, err := model.NewQueryForProfile().Ancestor(invitation.User).GetAll(ctx, &profiles) + // Profile should have been created when the user was invited to perform the challenge. + if err != nil || len(keys) != 1 { + return "", err } - mappedStates := make(map[string]string) - for _, val := range invitedUsers { - mappedStates[val.Encode()] = "invited" + if _, err := model.NewQueryForResult().Ancestor(keys[0]).GetAll(ctx, &results); err != nil { + return "", err } - for _, val := range finishedUsers { - mappedStates[val.Encode()] = "coding" + if len(results) == 0 { + return "invited", nil } - - usersWithState := make([]keyedUserWithState, len(users)) - for i := range users { - usersWithState[i] = keyedUserWithState{ - KeyedUser: &model.KeyedUser{ - User: &users[i], Key: keys[i], - }, - State: mappedStates[keys[i].Encode()], - } + if results[0].Started.Before(time.Now()) && results[0].Finished.IsZero() { + return "coding", nil } - json.NewEncoder(w).Encode(usersWithState) - return http.StatusOK, nil + return "finished", nil } func alreadyExists(ctx context.Context, property, value string) (exists bool, err error) {