2015-01-21 18:35:08 +11:00
|
|
|
using System.Data;
|
2020-09-17 09:42:55 +02:00
|
|
|
using Microsoft.Extensions.Logging;
|
2016-04-12 15:11:07 +02:00
|
|
|
using NPoco;
|
2021-08-11 19:11:35 +02:00
|
|
|
using Umbraco.Cms.Core;
|
2021-02-09 10:22:42 +01:00
|
|
|
using Umbraco.Cms.Core.Cache;
|
|
|
|
|
using Umbraco.Cms.Core.Models;
|
|
|
|
|
using Umbraco.Cms.Core.Persistence.Querying;
|
|
|
|
|
using Umbraco.Cms.Core.Persistence.Repositories;
|
2021-02-12 13:36:50 +01:00
|
|
|
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
|
2022-01-13 17:44:11 +00:00
|
|
|
using Umbraco.Cms.Infrastructure.Scoping;
|
2021-02-09 11:26:22 +01:00
|
|
|
using Umbraco.Extensions;
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement;
|
2015-08-04 15:42:44 +02:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
// TODO: We need to get a readonly ISO code for the domain assigned
|
|
|
|
|
internal class DomainRepository : EntityRepositoryBase<int, IDomain>, IDomainRepository
|
|
|
|
|
{
|
|
|
|
|
public DomainRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger<DomainRepository> logger)
|
|
|
|
|
: base(scopeAccessor, cache, logger)
|
2015-01-21 17:03:56 +11:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
}
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
public IDomain? GetByName(string domainName) =>
|
|
|
|
|
GetMany().FirstOrDefault(x => x.DomainName.InvariantEquals(domainName));
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
public bool Exists(string domainName) => GetMany().Any(x => x.DomainName.InvariantEquals(domainName));
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
public IEnumerable<IDomain> GetAll(bool includeWildcards) =>
|
|
|
|
|
GetMany().Where(x => includeWildcards || x.IsWildcard == false);
|
2015-07-27 12:53:09 +02:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
public IEnumerable<IDomain> GetAssignedDomains(int contentId, bool includeWildcards) =>
|
|
|
|
|
GetMany()
|
|
|
|
|
.Where(x => x.RootContentId == contentId)
|
|
|
|
|
.Where(x => includeWildcards || x.IsWildcard == false);
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
protected override IRepositoryCachePolicy<IDomain, int> CreateCachePolicy() =>
|
|
|
|
|
new FullDataSetRepositoryCachePolicy<IDomain, int>(GlobalIsolatedCache, ScopeAccessor, GetEntityId, /*expires:*/
|
|
|
|
|
false);
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
protected override IDomain? PerformGet(int id) =>
|
2017-07-20 11:21:28 +02:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
// use the underlying GetAll which will force cache all domains
|
|
|
|
|
GetMany().FirstOrDefault(x => x.Id == id);
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
protected override IEnumerable<IDomain> PerformGetAll(params int[]? ids)
|
|
|
|
|
{
|
|
|
|
|
Sql<ISqlContext> sql = GetBaseQuery(false).Where<DomainDto>(x => x.Id > 0);
|
|
|
|
|
if (ids?.Any() ?? false)
|
2015-01-21 17:03:56 +11:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
sql.WhereIn<DomainDto>(x => x.Id, ids);
|
2015-01-21 17:03:56 +11:00
|
|
|
}
|
|
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
return Database.Fetch<DomainDto>(sql).Select(ConvertFromDto);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override IEnumerable<IDomain> PerformGetByQuery(IQuery<IDomain> query) =>
|
|
|
|
|
throw new NotSupportedException("This repository does not support this method");
|
|
|
|
|
|
|
|
|
|
protected override Sql<ISqlContext> GetBaseQuery(bool isCount)
|
|
|
|
|
{
|
|
|
|
|
Sql<ISqlContext> sql = Sql();
|
|
|
|
|
if (isCount)
|
2015-01-21 17:03:56 +11:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
sql.SelectCount().From<DomainDto>();
|
2015-01-21 17:03:56 +11:00
|
|
|
}
|
2022-06-02 08:18:31 +02:00
|
|
|
else
|
2015-01-21 17:03:56 +11:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
sql.Select("umbracoDomain.*, umbracoLanguage.languageISOCode")
|
|
|
|
|
.From<DomainDto>()
|
|
|
|
|
.LeftJoin<LanguageDto>()
|
|
|
|
|
.On<DomainDto, LanguageDto>(dto => dto.DefaultLanguage, dto => dto.Id);
|
|
|
|
|
}
|
2015-01-21 18:35:08 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
return sql;
|
|
|
|
|
}
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
protected override string GetBaseWhereClause() => $"{Constants.DatabaseSchema.Tables.Domain}.id = @id";
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
protected override IEnumerable<string> GetDeleteClauses()
|
|
|
|
|
{
|
|
|
|
|
var list = new List<string> { "DELETE FROM umbracoDomain WHERE id = @id" };
|
|
|
|
|
return list;
|
|
|
|
|
}
|
2015-08-04 15:42:44 +02:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
protected override void PersistNewItem(IDomain entity)
|
|
|
|
|
{
|
|
|
|
|
var exists = Database.ExecuteScalar<int>(
|
|
|
|
|
"SELECT COUNT(*) FROM umbracoDomain WHERE domainName = @domainName",
|
|
|
|
|
new { domainName = entity.DomainName });
|
|
|
|
|
if (exists > 0)
|
|
|
|
|
{
|
|
|
|
|
throw new DuplicateNameException(
|
|
|
|
|
string.Format("The domain name {0} is already assigned", entity.DomainName));
|
2015-01-21 17:03:56 +11:00
|
|
|
}
|
|
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
if (entity.RootContentId.HasValue)
|
2015-01-21 17:03:56 +11:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
var contentExists = Database.ExecuteScalar<int>(
|
|
|
|
|
$"SELECT COUNT(*) FROM {Constants.DatabaseSchema.Tables.Content} WHERE nodeId = @id",
|
|
|
|
|
new { id = entity.RootContentId.Value });
|
|
|
|
|
if (contentExists == 0)
|
2015-01-21 17:03:56 +11:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
throw new NullReferenceException("No content exists with id " + entity.RootContentId.Value);
|
2015-07-16 18:09:56 +02:00
|
|
|
}
|
2022-06-02 08:18:31 +02:00
|
|
|
}
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
if (entity.LanguageId.HasValue)
|
|
|
|
|
{
|
|
|
|
|
var languageExists = Database.ExecuteScalar<int>(
|
|
|
|
|
"SELECT COUNT(*) FROM umbracoLanguage WHERE id = @id",
|
|
|
|
|
new { id = entity.LanguageId.Value });
|
|
|
|
|
if (languageExists == 0)
|
2015-07-16 18:09:56 +02:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
throw new NullReferenceException("No language exists with id " + entity.LanguageId.Value);
|
2015-01-21 17:03:56 +11:00
|
|
|
}
|
2022-06-02 08:18:31 +02:00
|
|
|
}
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
entity.AddingEntity();
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
var factory = new DomainModelFactory();
|
|
|
|
|
DomainDto dto = factory.BuildDto(entity);
|
2015-08-04 15:42:44 +02:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
var id = Convert.ToInt32(Database.Insert(dto));
|
|
|
|
|
entity.Id = id;
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
// if the language changed, we need to resolve the ISO code!
|
|
|
|
|
if (entity.LanguageId.HasValue)
|
2015-07-27 12:53:09 +02:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
((UmbracoDomain)entity).LanguageIsoCode = Database.ExecuteScalar<string>(
|
|
|
|
|
"SELECT languageISOCode FROM umbracoLanguage WHERE id=@langId", new { langId = entity.LanguageId });
|
2015-01-21 17:03:56 +11:00
|
|
|
}
|
|
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
entity.ResetDirtyProperties();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void PersistUpdatedItem(IDomain entity)
|
|
|
|
|
{
|
|
|
|
|
entity.UpdatingEntity();
|
|
|
|
|
|
|
|
|
|
var exists = Database.ExecuteScalar<int>(
|
|
|
|
|
"SELECT COUNT(*) FROM umbracoDomain WHERE domainName = @domainName AND umbracoDomain.id <> @id",
|
|
|
|
|
new { domainName = entity.DomainName, id = entity.Id });
|
|
|
|
|
|
|
|
|
|
// ensure there is no other domain with the same name on another entity
|
|
|
|
|
if (exists > 0)
|
2015-01-21 17:03:56 +11:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
throw new DuplicateNameException(
|
|
|
|
|
string.Format("The domain name {0} is already assigned", entity.DomainName));
|
2015-07-27 12:53:09 +02:00
|
|
|
}
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
if (entity.RootContentId.HasValue)
|
2015-07-27 12:53:09 +02:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
var contentExists = Database.ExecuteScalar<int>(
|
|
|
|
|
$"SELECT COUNT(*) FROM {Constants.DatabaseSchema.Tables.Content} WHERE nodeId = @id",
|
|
|
|
|
new { id = entity.RootContentId.Value });
|
|
|
|
|
if (contentExists == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new NullReferenceException("No content exists with id " + entity.RootContentId.Value);
|
|
|
|
|
}
|
2015-07-27 12:53:09 +02:00
|
|
|
}
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
if (entity.LanguageId.HasValue)
|
2015-07-27 12:53:09 +02:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
var languageExists = Database.ExecuteScalar<int>(
|
|
|
|
|
"SELECT COUNT(*) FROM umbracoLanguage WHERE id = @id",
|
|
|
|
|
new { id = entity.LanguageId.Value });
|
|
|
|
|
if (languageExists == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new NullReferenceException("No language exists with id " + entity.LanguageId.Value);
|
|
|
|
|
}
|
2015-07-27 12:53:09 +02:00
|
|
|
}
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
var factory = new DomainModelFactory();
|
|
|
|
|
DomainDto dto = factory.BuildDto(entity);
|
|
|
|
|
|
|
|
|
|
Database.Update(dto);
|
|
|
|
|
|
|
|
|
|
// if the language changed, we need to resolve the ISO code!
|
|
|
|
|
if (entity.WasPropertyDirty("LanguageId"))
|
2015-07-27 12:53:09 +02:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
((UmbracoDomain)entity).LanguageIsoCode = Database.ExecuteScalar<string>(
|
|
|
|
|
"SELECT languageISOCode FROM umbracoLanguage WHERE id=@langId", new { langId = entity.LanguageId });
|
2017-07-20 11:21:28 +02:00
|
|
|
}
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
entity.ResetDirtyProperties();
|
|
|
|
|
}
|
2017-07-20 11:21:28 +02:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
private IDomain ConvertFromDto(DomainDto dto)
|
|
|
|
|
{
|
|
|
|
|
var factory = new DomainModelFactory();
|
|
|
|
|
IDomain entity = factory.BuildEntity(dto);
|
|
|
|
|
return entity;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal class DomainModelFactory
|
|
|
|
|
{
|
|
|
|
|
public IDomain BuildEntity(DomainDto dto)
|
|
|
|
|
{
|
|
|
|
|
var domain = new UmbracoDomain(dto.DomainName, dto.IsoCode)
|
2015-01-21 17:03:56 +11:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
Id = dto.Id,
|
|
|
|
|
LanguageId = dto.DefaultLanguage,
|
|
|
|
|
RootContentId = dto.RootStructureId,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// reset dirty initial properties (U4-1946)
|
|
|
|
|
domain.ResetDirtyProperties(false);
|
|
|
|
|
return domain;
|
|
|
|
|
}
|
2015-01-21 17:03:56 +11:00
|
|
|
|
2022-06-02 08:18:31 +02:00
|
|
|
public DomainDto BuildDto(IDomain entity)
|
|
|
|
|
{
|
|
|
|
|
var dto = new DomainDto
|
2015-01-21 17:03:56 +11:00
|
|
|
{
|
2022-06-02 08:18:31 +02:00
|
|
|
DefaultLanguage = entity.LanguageId,
|
|
|
|
|
DomainName = entity.DomainName,
|
|
|
|
|
Id = entity.Id,
|
|
|
|
|
RootStructureId = entity.RootContentId,
|
|
|
|
|
};
|
|
|
|
|
return dto;
|
2015-01-21 17:03:56 +11:00
|
|
|
}
|
|
|
|
|
}
|
2017-07-20 11:21:28 +02:00
|
|
|
}
|