public void CreateDirectory(string applicationName, string directoryName, string description) { if (string.IsNullOrWhiteSpace(directoryName)) { throw new SettingsStoreException(Constants.ERROR_DIRECTORY_NO_NAME); } var application = GetApplicationsData(applicationName).SingleOrDefault(); if (application == null) { throw new SettingsNotFoundException(Constants.ERROR_APPLICATION_UNKNOWN); } if (!Auth.AllowCreateDirectory(applicationName, directoryName)) { throw new SettingsAuthorizationException(AuthorizationScope.Directory, AuthorizationLevel.Create, directoryName, Auth.CurrentIdentity.Id); } if (DirectoryExists(application, directoryName)) { throw new SettingsDuplicateException(Constants.ERROR_DIRECTORY_ALREADY_EXISTS); } if (!NameValidator.ValidateName(directoryName)) { throw new SettingsNotFoundException(Constants.ERROR_DIRECTORY_NAME_INVALID); } DirectoryData directory; using (TransactionScope scope = new TransactionScope()) { directory = new DirectoryData(); directory.ApplicationId = application.Id; directory.Name = directoryName.Trim(); if (description != null) directory.Description = description.Trim(); directory.Created = DateTime.Now; Store.Context.Directories.Add(directory); Store.Save(); scope.Complete(); } Auth.Invalidate(); }
public void CopyApplication(string applicationName, string newApplicationName, string newApplicationDescription, int version) { if (!Auth.AllowCreateApplication(applicationName)) { throw new SettingsAuthorizationException(AuthorizationScope.Application, AuthorizationLevel.Create, applicationName, Auth.CurrentIdentity.Id); } if (string.IsNullOrWhiteSpace(applicationName)) { throw new SettingsStoreException(Constants.ERROR_APPLICATION_NO_NAME); } var application = GetApplicationsData(applicationName).SingleOrDefault(); if (application == null) { throw new SettingsNotFoundException(Constants.ERROR_APPLICATION_UNKNOWN); } using (TransactionScope scope = new TransactionScope()) { CreateApplication(newApplicationName, newApplicationDescription); var newApplication = GetApplicationsData(newApplicationName).Single(); List<DirectoryData> newDirectories = new List<DirectoryData>(); List<VersionData> copyVersions = new List<VersionData>(); List<SettingData> newSettings = new List<SettingData>(); foreach (var item in application.Directories) { DirectoryData data = new DirectoryData { ApplicationId = newApplication.Id, Name = item.Name, Description = item.Description }; newApplication.Directories.Add(data); newDirectories.Add(data); } if (version == 0) { copyVersions.AddRange((from v in application.Versions orderby v.Version descending select v)); } else { copyVersions.Add((from v in application.Versions orderby v.Version ascending select v).First()); } foreach (var item in copyVersions) { VersionData newVersion = new VersionData(); newVersion.Version = item.Version; newVersion.ApplicationId = newApplication.Id; newVersion.Created = DateTime.UtcNow; Store.Save(); foreach (var setting in item.Settings) { SettingData newSetting = SettingData.Copy(setting); setting.VersionId = newVersion.Id; setting.DirectoryId = newDirectories.Single(d => d.Name == setting.Directory.Name).Id; newSettings.Add(newSetting); } } Store.Context.Settings.AddRange(newSettings); Store.Save(); scope.Complete(); } }
public ApplicationModel CreateApplication(string applicationName, string applicationDescription, string directoryName, string directoryDescription) { if (!Auth.AllowCreateApplication(applicationName)) { throw new SettingsAuthorizationException(AuthorizationScope.Application, AuthorizationLevel.Create, applicationName, Auth.CurrentIdentity.Id); } if (string.IsNullOrWhiteSpace(applicationName)) { throw new SettingsStoreException(Constants.ERROR_APPLICATION_NO_NAME); } var application = Store.Context.Applications.FirstOrDefault(app => app.Name == applicationName); if (application != null) { throw new SettingsStoreException(Constants.ERROR_APPLICATION_ALREADY_EXISTS); } if (!NameValidator.ValidateName(applicationName)) { throw new SettingsNotFoundException(Constants.ERROR_APPLICATION_NAME_INVALID); } application = new ApplicationData(); DirectoryData cust_directory = null; DirectoryData def_directory = null; using (TransactionScope scope = new TransactionScope()) { application.Name = applicationName; if (string.IsNullOrWhiteSpace(applicationDescription)) { applicationDescription = Constants.DEAULT_APPLICATION_DESCRIPTION; } //Create application application.Description = applicationDescription.Trim().Replace(" ", " "); application.Created = DateTime.UtcNow; Store.Context.Applications.Add(application); Store.Context.SaveChanges(); //Create version 1 VersionData version = new VersionData { Version = 1, Created = DateTime.UtcNow, ApplicationId = application.Id }; Store.Context.Versions.Add(version); Store.Context.SaveChanges(); //Create application default directory def_directory = new DirectoryData(); def_directory.Name = Constants.DEAULT_DIRECTORY_NAME; def_directory.Description = Constants.DEAULT_DIRECTORY_DESCRIPTION; def_directory.ApplicationId = application.Id; def_directory.Created = DateTime.UtcNow; Store.Context.Directories.Add(def_directory); //Create custom first directory, if provided. if (!string.IsNullOrWhiteSpace(directoryName)) { cust_directory = new DirectoryData(); cust_directory.Name = directoryName.Trim(); if (directoryDescription != null) cust_directory.Description = directoryDescription.Trim(); cust_directory.ApplicationId = application.Id; cust_directory.Created = DateTime.UtcNow; Store.Context.Directories.Add(cust_directory); } Store.Context.SaveChanges(); //Create default api key for applicaiton, a trigger maintains access for the master apikey to the application directories. ApiKeyData apiKey = new ApiKeyData { ApiKey = ApiKeyGenerator.Create(), Name = application.Name, Application = application, Active = true, AdminKey = true, Created = DateTime.UtcNow }; Store.Context.ApiKeys.Add(apiKey); Store.Context.SaveChanges(); //Set access right to default directory. DirectoryAccessData access = new DirectoryAccessData(); access.AllowWrite = true; access.AllowDelete = true; access.AllowCreate = true; access.ApiKey = apiKey; access.Directory = def_directory; Store.Context.Access.Add(access); //Set access right to custom directory. if (cust_directory != null) { access = new DirectoryAccessData(); access.AllowWrite = true; access.AllowDelete = true; access.AllowCreate = true; access.ApiKey = apiKey; access.Directory = cust_directory; Store.Context.Access.Add(access); } Store.Save(); scope.Complete(); } Auth.Invalidate(); Store.Context.Entry<ApplicationData>(application).Reload(); //reload the enities the reflect the master key access created by the trigger. if (cust_directory != null) Store.Context.Entry<DirectoryData>(cust_directory).Collection("Access").Load(); if (def_directory != null) Store.Context.Entry<DirectoryData>(def_directory).Collection("Access").Load(); return GetApplication(applicationName); }