// Save the domain object in the database and by consequence will also save the // nameservers and ds set. On creation the domain object is going to receive the id that // refers to the entry in the database func (dao DomainDAO) Save(domain *model.Domain) error { // Check if the programmer forgot to set the database in DomainDAO object if dao.Database == nil { return ErrDomainDAOUndefinedDatabase } // When creating a new domain object, the id will be probably nil (or kind of new // according to bson.ObjectId), so we must initialize it if len(domain.Id.Hex()) == 0 { domain.Id = bson.NewObjectId() } // Every time we modified a domain object we increase the revision counter to identify // changes in high level structures. Maybe a better approach would be doing this on the // MongoDB server side, check out the link http://docs.mongodb.org/manual/tutorial // /optimize-query-performance-with-indexes-and-projections/ - Use the Increment // Operator to Perform Operations Server-Side domain.Revision += 1 // Store the last time that the object was modified domain.LastModifiedAt = time.Now().UTC() // Upsert try to update the collection entry if exists, if not, it creates a new entry. // For all the domain objects we are going to use the collection "domain". We also avoid // concurency adding the revision as a paremeter for updating the entry _, err := dao.Database.C(domainDAOCollection).Upsert(bson.M{ "_id": domain.Id, "revision": domain.Revision - 1, }, domain) return err }