// IncPatchNumber increases the count for the user's patch submissions by one, // and then returns the new count. func (u *DBUser) IncPatchNumber() (int, error) { dbUser := &DBUser{} _, err := db.FindAndModify( Collection, bson.M{ IdKey: u.Id, }, nil, mgo.Change{ Update: bson.M{ "$inc": bson.M{ PatchNumberKey: 1, }, }, Upsert: true, ReturnNew: true, }, dbUser, ) if err != nil { return 0, err } return dbUser.PatchNumber, nil }
// IncKeyHandler increments the value stored in the given key, and returns it func IncKeyHandler(w http.ResponseWriter, r *http.Request) { key := "" err := util.ReadJSONInto(r.Body, &key) if err != nil { evergreen.Logger.Logf(slogger.ERROR, "Error geting key: %v", err) plugin.WriteJSON(w, http.StatusInternalServerError, err.Error()) return } change := mgo.Change{ Update: bson.M{ "$inc": bson.M{"value": 1}, }, ReturnNew: true, Upsert: true, } keyVal := &KeyVal{} _, err = db.FindAndModify(KeyValCollection, bson.M{"_id": key}, nil, change, keyVal) if err != nil { evergreen.Logger.Logf(slogger.ERROR, "error doing findAndModify: %v", err) plugin.WriteJSON(w, http.StatusInternalServerError, err.Error()) return } plugin.WriteJSON(w, http.StatusOK, keyVal) }
// AddTasks adds more tasks to a patch document. // This is meant to be used after initial patch creation, to reconfigure the patch. func (p *Patch) AddTasks(tasks []string) error { change := mgo.Change{ Update: bson.M{ "$addToSet": bson.M{TasksKey: bson.M{"$each": tasks}}, }, ReturnNew: true, } _, err := db.FindAndModify(Collection, bson.M{IdKey: p.Id}, nil, change, p) return err }
func DequeueAlertRequest() (*AlertRequest, error) { out := AlertRequest{} _, err := db.FindAndModify(Collection, bson.M{QueueStatusKey: Pending}, []string{CreatedAtKey}, mgo.Change{ Update: bson.M{"$set": bson.M{QueueStatusKey: InProgress}}, Upsert: false, Remove: false, ReturnNew: true, }, &out) if err == mgo.ErrNotFound { return nil, nil } if err != nil { return nil, err } return &out, nil }
// GetOrCreateUser fetches a user with the given userId and returns it. If no document exists for // that userId, inserts it along with the provided display name and email. func GetOrCreateUser(userId, displayName, email string) (*user.DBUser, error) { u := &user.DBUser{} _, err := db.FindAndModify(user.Collection, bson.M{user.IdKey: userId}, nil, mgo.Change{ Update: bson.M{ "$set": bson.M{ user.DispNameKey: displayName, user.EmailAddressKey: email, }, "$setOnInsert": bson.M{ user.APIKeyKey: util.RandomString(), }, }, ReturnNew: true, Upsert: true, }, u) if err != nil { return nil, err } return u, nil }
// GetNewRevisionOrderNumber gets a new revision order number for a project. func GetNewRevisionOrderNumber(projectId string) (int, error) { repo := &Repository{} _, err := db.FindAndModify( RepositoriesCollection, bson.M{ RepoProjectKey: projectId, }, nil, mgo.Change{ Update: bson.M{ "$inc": bson.M{ RepositoryOrderNumberKey: 1, }, }, Upsert: true, ReturnNew: true, }, repo, ) if err != nil { return 0, err } return repo.RevisionOrderNumber, nil }