public VenueEditViewModel(VenueForEditContract contract, IUserPermissionContext permissionContext) { ParamIs.NotNull(() => contract); Address = contract.Address; AddressCountryCode = contract.AddressCountryCode; Coordinates = contract.Coordinates; DefaultNameLanguage = contract.DefaultNameLanguage; Deleted = contract.Deleted; Description = contract.Description; Id = contract.Id; Name = contract.Name; Names = contract.Names; Status = contract.Status; WebLinks = contract.WebLinks; AllowedEntryStatuses = EntryPermissionManager.AllowedEntryStatuses(permissionContext).ToArray(); }
public int Update(VenueForEditContract contract) { ParamIs.NotNull(() => contract); PermissionContext.VerifyManageDatabase(); return(HandleTransaction(ctx => { Venue venue; if (contract.Id == 0) { venue = new Venue(contract.DefaultNameLanguage, contract.Names, contract.Description) { Address = contract.Address, AddressCountryCode = contract.AddressCountryCode, Coordinates = (contract.Coordinates != null) ? new OptionalGeoPoint(contract.Coordinates) : new OptionalGeoPoint(), Status = contract.Status }; ctx.Save(venue); var diff = new VenueDiff(VenueEditableFields.OriginalName | VenueEditableFields.Names); diff.Address.Set(!string.IsNullOrEmpty(contract.Address)); diff.AddressCountryCode.Set(!string.IsNullOrEmpty(contract.AddressCountryCode)); diff.Description.Set(!string.IsNullOrEmpty(contract.Description)); if (contract.Coordinates != null) { diff.Coordinates.Set(); } var webLinkDiff = venue.WebLinks.Sync(contract.WebLinks, venue); ctx.OfType <VenueWebLink>().Sync(webLinkDiff); if (webLinkDiff.Changed) { diff.WebLinks.Set(); } ctx.Update(venue); var archived = Archive(ctx, venue, diff, EntryEditEvent.Created, string.Empty); AddEntryEditedEntry(ctx.OfType <ActivityEntry>(), venue, EntryEditEvent.Created, archived); AuditLog($"created {_entryLinkFactory.CreateEntryLink(venue)}", ctx); } else { venue = ctx.Load <Venue>(contract.Id); _permissionContext.VerifyEntryEdit(venue); var diff = new VenueDiff(DoSnapshot(venue, ctx)); if (venue.TranslatedName.DefaultLanguage != contract.DefaultNameLanguage) { venue.TranslatedName.DefaultLanguage = contract.DefaultNameLanguage; diff.OriginalName.Set(); } var nameDiff = venue.Names.Sync(contract.Names, venue); ctx.Sync(nameDiff); if (nameDiff.Changed) { diff.Names.Set(); } if (venue.Address != contract.Address) { diff.Address.Set(); venue.Address = contract.Address; } if (venue.AddressCountryCode != contract.AddressCountryCode) { diff.AddressCountryCode.Set(); venue.AddressCountryCode = contract.AddressCountryCode; } if (venue.Description != contract.Description) { diff.Description.Set(); venue.Description = contract.Description; } if (!venue.Coordinates.Equals(contract.Coordinates)) { diff.Coordinates.Set(); venue.Coordinates = (contract.Coordinates != null) ? new OptionalGeoPoint(contract.Coordinates) : new OptionalGeoPoint(); } if (venue.Status != contract.Status) { diff.Status.Set(); venue.Status = contract.Status; } var webLinkDiff = venue.WebLinks.Sync(contract.WebLinks, venue); ctx.OfType <VenueWebLink>().Sync(webLinkDiff); if (webLinkDiff.Changed) { diff.WebLinks.Set(); } ctx.Update(venue); var archived = Archive(ctx, venue, diff, EntryEditEvent.Updated, string.Empty); AddEntryEditedEntry(ctx.OfType <ActivityEntry>(), venue, EntryEditEvent.Updated, archived); AuditLog($"updated {_entryLinkFactory.CreateEntryLink(venue)}", ctx); } return venue.Id; })); }