using CMSDAL.DTO.ContentVersion; using CMSDAL.Query.ContentVersion; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using Newtonsoft.Json; using System.Data.Common; namespace CMSDAL.CustomCode.ContentVersion; public class ContentVersionDAL : IContentVersionDAL { private readonly IQueryExecutor _qe; public ContentVersionDAL(IQueryExecutor qe) => _qe = qe; public async Task GetByContentAsync(int contentId, LoginDTO loginDTO, CancellationToken ct) { try { var result = await _qe.QueryAsync(loginDTO, ContentVersionQB.GET_BY_CONTENT, new { ContentId = contentId, TenantId = loginDTO.ClientId }, cancellationToken: ct); return JsonConvert.SerializeObject(result); } catch { throw; } } public async Task SaveAsync(ContentVersionDTO dto, LoginDTO loginDTO, CancellationToken ct) { await _qe.ExecuteAsync(loginDTO, ContentVersionQB.INSERT, new { dto.ContentId, dto.Version, dto.SnapshotJson, dto.Notes, TenantId = loginDTO.ClientId, CreatedById = loginDTO.UserId }, cancellationToken: ct).ConfigureAwait(false); return SuccessResponse.SaveSuccessMessage; } public async Task RestoreVersionAsync(int contentVersionId, int contentId, LoginDTO loginDTO, CancellationToken ct) { var snapshotRow = await _qe.QueryAsync(loginDTO, ContentVersionQB.GET_SNAPSHOT, new { ContentVersionId = contentVersionId, TenantId = loginDTO.ClientId }, cancellationToken: ct).ConfigureAwait(false); var snapshot = snapshotRow.FirstOrDefault() ?? throw new InvalidOperationException($"ContentVersion {contentVersionId} not found."); string snapshotJson = (string)snapshot.SnapshotJson; short nextVersion = await _qe.ExecuteScalarAsync(loginDTO, ContentVersionQB.GET_NEXT_VERSION, new { ContentId = contentId, TenantId = loginDTO.ClientId }, cancellationToken: ct).ConfigureAwait(false); await _qe.ExecuteAsync(loginDTO, ContentVersionQB.RESTORE_TO_DRAFT, new { DataJson = snapshotJson, ContentId = contentId, TenantId = loginDTO.ClientId, ModifiedById = loginDTO.UserId }, cancellationToken: ct).ConfigureAwait(false); await _qe.ExecuteAsync(loginDTO, ContentVersionQB.INSERT, new { ContentId = contentId, Version = nextVersion, SnapshotJson = snapshotJson, Notes = $"Restored from version {contentVersionId}", TenantId = loginDTO.ClientId, CreatedById = loginDTO.UserId }, cancellationToken: ct).ConfigureAwait(false); return SuccessResponse.UpdateSuccessMessage; } public async Task SaveWithAutoVersionAsync(ContentVersionDTO dto, LoginDTO loginDTO, DbTransaction tx, CancellationToken ct) { return await _qe.ExecuteIdentityAsync(loginDTO, ContentVersionQB.INSERT_WITH_NEXT_VERSION, new { dto.ContentId, dto.SnapshotJson, dto.Notes, TenantId = loginDTO.ClientId, CreatedById = loginDTO.UserId }, tx).ConfigureAwait(false); } }