Files
Microsoft.SelfService.Porta…/Repository/TemplateRepository.cs

294 lines
10 KiB
C#

using Microsoft.EntityFrameworkCore;
using Microsoft.SelfService.Portal.Core.API.Context;
using Microsoft.SelfService.Portal.Core.API.Interfaces;
using Microsoft.SelfService.Portal.Core.API.JsonDocuments;
using Microsoft.SelfService.Portal.Core.API.Models;
namespace Microsoft.SelfService.Portal.Core.API.Repository
{
public class TemplateRepository : ITemplateInterface
{
private readonly DataContext _context;
public TemplateRepository(DataContext context)
{
_context = context;
}
public ICollection<TemplateModel> GetTemplates()
{
var templates = _context.Templates
.AsNoTracking()
.Include(template => template.TemplateVersions)
.ToList();
foreach (var template in templates)
{
ApplyPublishedVersion(template);
}
return templates;
}
public TemplateModel GetTemplateById(Guid Id)
{
var template = _context.Templates
.AsNoTracking()
.Include(t => t.TemplateVersions)
.Where(t => t.Id == Id)
.FirstOrDefault();
if (template != null)
{
ApplyPublishedVersion(template);
}
return template;
}
public bool AddTemplateById(TemplateModel template)
{
if (template.Id == Guid.Empty)
{
template.Id = Guid.NewGuid();
}
var document = ConfigurationDocumentValidator.NormalizeAndValidate(template.JSONData, ConfigurationDocumentKind.Template);
template.JSONData = document.JsonData;
var version = new TemplateVersionModel
{
Id = Guid.NewGuid(),
TemplateId = template.Id,
Version = string.IsNullOrWhiteSpace(template.Version) ? "1.0.0" : template.Version,
SchemaVersion = document.SchemaVersion,
IsPublished = true,
PublishedAt = DateTime.UtcNow,
PublishedBy = template.CreatedBy
};
version.SetJsonData(document.JsonData);
template.TemplateVersions.Add(version);
_context.Add(template);
return SaveChanges();
}
public bool EditTemplateById(TemplateModel template)
{
var existingTemplate = _context.Templates
.Include(existing => existing.TemplateVersions)
.FirstOrDefault(existing => existing.Id == template.Id);
if (existingTemplate == null)
{
return false;
}
var document = ConfigurationDocumentValidator.NormalizeAndValidate(template.JSONData, ConfigurationDocumentKind.Template);
var jsonData = document.JsonData;
var publishedVersion = existingTemplate.TemplateVersions.FirstOrDefault(version => version.IsPublished);
var jsonChanged = publishedVersion == null || !string.Equals(publishedVersion.JsonData, jsonData, StringComparison.Ordinal);
existingTemplate.Name = template.Name;
existingTemplate.Version = template.Version;
existingTemplate.Description = template.Description;
existingTemplate.JSONData = jsonData;
existingTemplate.TemplateCategoryId = template.TemplateCategoryId;
existingTemplate.DeploymentRuleId = template.DeploymentRuleId;
existingTemplate.Modified = DateTime.UtcNow;
existingTemplate.ModifiedBy = template.ModifiedBy;
if (jsonChanged)
{
var versionName = GetUniqueVersionName(
existingTemplate.Id,
string.IsNullOrWhiteSpace(template.Version) ? DateTime.UtcNow.ToString("yyyyMMddHHmmss") : template.Version);
var version = new TemplateVersionModel
{
Id = Guid.NewGuid(),
TemplateId = existingTemplate.Id,
Version = versionName,
SchemaVersion = document.SchemaVersion,
IsPublished = true,
PublishedAt = DateTime.UtcNow,
PublishedBy = template.ModifiedBy
};
version.SetJsonData(jsonData);
foreach (var existingVersion in existingTemplate.TemplateVersions)
{
existingVersion.IsPublished = false;
}
existingTemplate.TemplateVersions.Add(version);
}
return SaveChanges();
}
public bool DeleteTemplateById(TemplateModel template)
{
_context.Remove(template);
return SaveChanges();
}
public bool CheckTemplateById(Guid Id)
{
return _context.Templates
.Any(t => t.Id == Id);
}
public TemplateModel GetTemplateByName(string Name)
{
return _context.Templates
.AsNoTracking()
.Where(t => t.Name == Name)
.FirstOrDefault();
}
public bool CheckTemplateByName(string Name)
{
return _context.Templates
.Any(t => t.Name == Name);
}
public ICollection<TemplateVersionModel> GetTemplateVersions(Guid templateId)
{
return _context.TemplateVersions
.AsNoTracking()
.Where(version => version.TemplateId == templateId)
.OrderByDescending(version => version.Created)
.ToList();
}
public TemplateVersionModel? GetTemplateVersionById(Guid templateId, Guid versionId)
{
return _context.TemplateVersions
.AsNoTracking()
.FirstOrDefault(version => version.TemplateId == templateId && version.Id == versionId);
}
public TemplateVersionModel? GetPublishedTemplateVersion(Guid templateId)
{
return _context.TemplateVersions
.AsNoTracking()
.FirstOrDefault(version => version.TemplateId == templateId && version.IsPublished);
}
public bool AddTemplateVersion(Guid templateId, TemplateVersionModel version, bool publish)
{
if (!_context.Templates.Any(template => template.Id == templateId))
{
return false;
}
version.Id = version.Id == Guid.Empty ? Guid.NewGuid() : version.Id;
version.TemplateId = templateId;
version.Version = string.IsNullOrWhiteSpace(version.Version) ? "1.0.0" : version.Version;
var document = ConfigurationDocumentValidator.NormalizeAndValidate(
version.JsonData,
ConfigurationDocumentKind.Template,
version.SchemaVersion);
version.SchemaVersion = document.SchemaVersion;
version.SetJsonData(document.JsonData);
if (publish)
{
foreach (var existingVersion in _context.TemplateVersions.Where(existing => existing.TemplateId == templateId && existing.IsPublished))
{
existingVersion.IsPublished = false;
}
version.IsPublished = true;
version.PublishedAt = DateTime.UtcNow;
}
_context.TemplateVersions.Add(version);
return SaveChanges();
}
public bool PublishTemplateVersion(Guid templateId, Guid versionId, string? publishedBy)
{
var version = _context.TemplateVersions
.FirstOrDefault(existing => existing.TemplateId == templateId && existing.Id == versionId);
if (version == null)
{
return false;
}
foreach (var existingVersion in _context.TemplateVersions.Where(existing => existing.TemplateId == templateId && existing.IsPublished))
{
existingVersion.IsPublished = false;
}
version.IsPublished = true;
version.PublishedAt = DateTime.UtcNow;
version.PublishedBy = string.IsNullOrWhiteSpace(publishedBy) ? "System" : publishedBy;
var template = _context.Templates.FirstOrDefault(existing => existing.Id == templateId);
if (template != null)
{
template.Version = version.Version;
template.JSONData = version.JsonData;
template.Modified = DateTime.UtcNow;
template.ModifiedBy = version.PublishedBy;
}
return SaveChanges();
}
public bool CheckTemplateVersionById(Guid templateId, Guid versionId)
{
return _context.TemplateVersions
.Any(version => version.TemplateId == templateId && version.Id == versionId);
}
public bool CheckTemplateVersionByVersion(Guid templateId, string version)
{
return _context.TemplateVersions
.Any(existing => existing.TemplateId == templateId && existing.Version == version);
}
public bool SaveChanges()
{
var saved = _context.SaveChanges();
return saved > 0 ? true : false;
}
private static void ApplyPublishedVersion(TemplateModel template)
{
var publishedVersion = template.TemplateVersions?.FirstOrDefault(version => version.IsPublished);
if (publishedVersion == null)
{
return;
}
template.Version = publishedVersion.Version;
template.JSONData = publishedVersion.JsonData;
}
private string GetUniqueVersionName(Guid templateId, string version)
{
if (!CheckTemplateVersionByVersion(templateId, version))
{
return version;
}
var timestamp = DateTime.UtcNow.ToString("yyyyMMddHHmmss");
var candidate = $"{version}-{timestamp}";
var counter = 1;
while (CheckTemplateVersionByVersion(templateId, candidate))
{
counter++;
candidate = $"{version}-{timestamp}-{counter}";
}
return candidate;
}
}
}