Project 'andrew.cornell/nfa-pruning-analysis' was moved to 'katherine.cornell/nfa-pruning-analysis'. Please update any links and bookmarks that may still have the old path.
Select Git revision
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ResourceModel.cs 13.02 KiB
using Coscine.Api.Project.ReturnObjects;
using Coscine.ApiCommons.Models;
using Coscine.Database.Model;
using LinqToDB;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace Coscine.Api.Project.Models
{
public class ResourceModel : DatabaseModel<Resource>
{
public ResourceModel() : base(Program.Configuration)
{
}
public Resource StoreFromObject(ResourceObject resourceObject)
{
if (resourceObject.Disciplines.Count() == 0 || resourceObject.ResourceTypeOption == null)
{
throw new ArgumentException("Discipline and ResourceTypeOption are necessary!");
}
Resource resource = new Resource()
{
DisplayName = resourceObject.DisplayName,
ResourceName = resourceObject.ResourceName,
Description = resourceObject.Description,
Keywords = resourceObject.Keywords,
UsageRights = resourceObject.UsageRights,
TypeId = resourceObject.Type.Id,
Type = new ResourceTypeModel().GetById(resourceObject.Type.Id),
VisibilityId = resourceObject.Visibility.Id,
};
if(resourceObject.License != null)
{
resource.LicenseId = resourceObject.License.Id;
}
Insert(resource);
try
{
SetDisciplines(resource, resourceObject.Disciplines);
SetResourceTypeObject(resource, resourceObject.ResourceTypeOption);
}
catch (Exception e)
{
Delete(resource);
throw e;
}
return resource;
}
public int DeleteResource(Resource resource)
{
ProjectResourceModel projectResourceModel = new ProjectResourceModel();
foreach (var projectResource in projectResourceModel.GetAllWhere((projectResource) => projectResource.ResourceId == resource.Id))
{
projectResourceModel.Delete(projectResource);
}
ResourceDisciplineModel resourceDisciplineModel = new ResourceDisciplineModel();
foreach (var resourceDiscipline in resourceDisciplineModel.GetAllWhere((resourceDicipline) => resourceDicipline.ResourceId == resource.Id))
{
resourceDisciplineModel.Delete(resourceDiscipline);
}
DeleteResourceTypeObject(resource);
return Delete(resource);
}
private void SetResourceTypeObject(Resource resource, JObject resourceTypeOption)
{
if (resource.Type.DisplayName == "rds")
{
RDSResourceTypeObject rdsResourceTypeObject = resourceTypeOption.ToObject<RDSResourceTypeObject>();
RDSResourceTypeModel rdsResourceTypeModel = new RDSResourceTypeModel();
if (resource.ResourceTypeOptionId != null)
{
RDSResourceType rdsResourceType = rdsResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
rdsResourceType.BucketName = rdsResourceTypeObject.BucketName;
rdsResourceType.AccessKey = rdsResourceTypeObject.AccessKey ?? rdsResourceType.AccessKey;
rdsResourceType.SecretKey = rdsResourceTypeObject.SecretKey ?? rdsResourceType.SecretKey;
rdsResourceTypeModel.Update(rdsResourceType);
}
else
{
RDSResourceType rdsResourceType = new RDSResourceType()
{
BucketName = rdsResourceTypeObject.BucketName,
AccessKey = rdsResourceTypeObject.AccessKey,
SecretKey = rdsResourceTypeObject.SecretKey
};
rdsResourceTypeModel.Insert(rdsResourceType);
resource.ResourceTypeOptionId = rdsResourceType.Id;
Update(resource);
}
}
else if (resource.Type.DisplayName == "gitlab")
{
GitlabResourceTypeObject gitlabResourceTypeObject = resourceTypeOption.ToObject<GitlabResourceTypeObject>();
GitlabResourceTypeModel gitlabResourceTypeModel = new GitlabResourceTypeModel();
if (resource.ResourceTypeOptionId != null)
{
GitlabResourceType gitlabResourceType = gitlabResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
gitlabResourceType.RepositoryNumber = gitlabResourceTypeObject.RepositoryNumber;
gitlabResourceType.RepositoryUrl = gitlabResourceTypeObject.RepositoryUrl;
gitlabResourceType.Token = gitlabResourceTypeObject.Token ?? gitlabResourceType.Token;
gitlabResourceTypeModel.Update(gitlabResourceType);
}
else
{
GitlabResourceType gitlabResourceType = new GitlabResourceType()
{
RepositoryNumber = gitlabResourceTypeObject.RepositoryNumber,
RepositoryUrl = gitlabResourceTypeObject.RepositoryUrl,
Token = gitlabResourceTypeObject.Token
};
gitlabResourceTypeModel.Insert(gitlabResourceType);
resource.ResourceTypeOptionId = gitlabResourceType.Id;
Update(resource);
}
}
else
{
throw new ArgumentException("Not supported resource type!");
}
}
private void SetDisciplines(Resource resource, IEnumerable<DisciplineObject> disciplines)
{
ResourceDisciplineModel resourceDisciplineModel = new ResourceDisciplineModel();
foreach (var oldDiscipline in resourceDisciplineModel.GetAllWhere((resourceDiscipline) => resourceDiscipline.ResourceId == resource.Id))
{
resourceDisciplineModel.Delete(oldDiscipline);
}
foreach (var discipline in disciplines)
{
ResourceDiscipline resourceDiscipline = new ResourceDiscipline()
{
DisciplineId = discipline.Id,
ResourceId = resource.Id
};
resourceDisciplineModel.Insert(resourceDiscipline);
}
}
public bool OwnsResource(User user, Resource resource)
{
return DatabaseConnection.ConnectToDatabase((db) =>
{
return (from relation in db.ProjectRoles
where relation.User == user
&& relation.Role.DisplayName == "Owner"
&& (relation.Project.ProjectResourceProjectIdIds != null && relation.Project.ProjectResourceProjectIdIds.
Any((projectResource) => projectResource.Resource == resource))
select relation).Any();
});
}
public int UpdateByObject(Resource resource, ResourceObject resourceObject)
{
if (resourceObject.Disciplines.Count() == 0 || resourceObject.ResourceTypeOption == null)
{
throw new ArgumentException("Discipline and ResourceTypeOption are necessary!");
}
if (resource.TypeId != resourceObject.Type.Id)
{
DeleteResourceTypeObject(resource);
}
resource.DisplayName = resourceObject.DisplayName;
resource.ResourceName = resourceObject.ResourceName;
resource.Description = resourceObject.Description;
resource.Keywords = resourceObject.Keywords;
resource.UsageRights = resourceObject.UsageRights;
resource.TypeId = resourceObject.Type.Id;
resource.Type = new ResourceTypeModel().GetById(resourceObject.Type.Id);
resource.VisibilityId = resourceObject.Visibility.Id;
if(resourceObject.License != null)
{
resource.LicenseId = resourceObject.License.Id;
}
resource.ApplicationProfile = resourceObject.ApplicationProfile;
resource.FixedValues = resourceObject.FixedValues.ToString();
SetDisciplines(resource, resourceObject.Disciplines);
SetResourceTypeObject(resource, resourceObject.ResourceTypeOption);
return Update(resource);
}
// TODO: Find out why resource.Type is not set
public void SetType(Resource resource)
{
if (resource.Type == null)
{
ResourceTypeModel resourceTypeModel = new ResourceTypeModel();
resource.Type = resourceTypeModel.GetById(resource.TypeId);
}
}
public void DeleteResourceTypeObject(Resource resource)
{
SetType(resource);
if (resource.Type.DisplayName == "rds" && resource.ResourceTypeOptionId != null)
{
RDSResourceTypeModel rdsResourceTypeModel = new RDSResourceTypeModel();
rdsResourceTypeModel.Delete(rdsResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value));
}
else if (resource.Type.DisplayName == "gitlab" && resource.ResourceTypeOptionId != null)
{
GitlabResourceTypeModel gitlabResourceTypeModel = new GitlabResourceTypeModel();
gitlabResourceTypeModel.Delete(gitlabResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value));
}
}
public ResourceObject CreateReturnObjectFromDatabaseObject(Resource resource)
{
SetType(resource);
DisciplineModel disciplineModel = new DisciplineModel();
var disciplines = disciplineModel.GetAllWhere((discipline) =>
(from relation in discipline.ResourceDisciplineDisciplineIdIds
where relation.ResourceId == resource.Id
select relation).Any())
.Select((discipline) => new DisciplineObject(discipline.Id, discipline.Url, discipline.DisplayNameDe, discipline.DisplayNameEn));
if (resource.Visibility == null && resource.VisibilityId != null)
{
VisibilityModel visibilityModel = new VisibilityModel();
resource.Visibility = visibilityModel.GetById(resource.VisibilityId.Value);
}
if (resource.License == null && resource.LicenseId != null)
{
LicenseModel licenseModel = new LicenseModel();
resource.License = licenseModel.GetById(resource.LicenseId.Value);
}
ResourceTypeOptionObject resourceTypeOptionObject = null;
if(resource.Type.DisplayName == "rds" && resource.ResourceTypeOptionId != null)
{
RDSResourceTypeModel rdsResourceTypeModel = new RDSResourceTypeModel();
var rdsResourceType = rdsResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
resourceTypeOptionObject = new RDSResourceTypeObject(rdsResourceType.Id, rdsResourceType.BucketName, null, null);
}
else if(resource.Type.DisplayName == "gitlab" && resource.ResourceTypeOptionId != null)
{
GitlabResourceTypeModel gitlabResourceTypeModel = new GitlabResourceTypeModel();
var gitlabResourceType = gitlabResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value);
resourceTypeOptionObject = new GitlabResourceTypeObject(gitlabResourceType.Id, gitlabResourceType.RepositoryNumber, gitlabResourceType.RepositoryUrl, null);
}
return new ResourceObject(
resource.Id,
resource.DisplayName,
resource.ResourceName,
resource.Description,
resource.Keywords,
resource.UsageRights,
new ResourceTypeObject(resource.Type.Id, resource.Type.DisplayName),
disciplines,
(resource.Visibility != null) ? new VisibilityObject(resource.Visibility.Id, resource.Visibility.DisplayName) : null,
(resource.License != null) ? new LicenseObject(resource.License.Id, resource.License.DisplayName) : null,
JObject.FromObject(resourceTypeOptionObject),
resource.ApplicationProfile,
JToken.Parse(resource.FixedValues)
);
}
public override Expression<Func<Resource, Guid>> GetIdFromObject()
{
return databaseObject => databaseObject.Id;
}
public override ITable<Resource> GetITableFromDatabase(CoscineDB db)
{
return db.Resources;
}
public override void SetObjectId(Resource databaseObject, Guid id)
{
databaseObject.Id = id;
}
}
}