using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using KmsDAL.DTO.KmArtifact; using KmsDAL.Query.KmArtifact; using KmsDAL.Query.KmContent; using Newtonsoft.Json; namespace KmsDAL.CustomCode.KmArtifact { public class KmArtifactDAL : IKmArtifactDAL { private readonly IQueryExecutor _qe; public KmArtifactDAL(IQueryExecutor qe) => _qe = qe; public async Task GetKmArtifact(int artifactId, LoginDTO login, CancellationToken ct) { var artifact = await _qe.QuerySingleAsync( login, KmArtifactQB.GET_KMARTIFACT, new { ArtifactId = artifactId, TenantId = login.ClientId }, cancellationToken: ct); if (artifact != null) { var contents = await _qe.QueryAsync( login, KmArtifactQB.GET_KMARTIFACT_CONTENTS, new { ArtifactId = artifactId }, cancellationToken: ct); artifact.Contents = contents.ToList(); } return JsonConvert.SerializeObject(artifact); } public async Task GetKmArtifacts(int domainId, byte governanceState, byte artifactType, int page, int pageSize, LoginDTO login, CancellationToken ct) { // Use QueryPagedAsync — Offset and PageSize must be in the param object var param = new { TenantId = login.ClientId, DomainId = domainId, GovernanceState = governanceState, ArtifactType = artifactType, Offset = (page - 1) * pageSize, PageSize = pageSize }; var result = await _qe.QueryPagedAsync( login, KmArtifactQB.GET_KMARTIFACTS_PAGED, param); return JsonConvert.SerializeObject(result); } public async Task GetKmArtifactCodeCount(string artifactCode, int artifactId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteScalarAsync( login, KmArtifactQB.GET_KMARTIFACT_CODE_COUNT, new { ArtifactCode = artifactCode, ArtifactId = artifactId, TenantId = login.ClientId }, cancellationToken: ct); public async Task SaveKmArtifact(KmArtifactDTO dto, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, KmArtifactQB.SAVE_KMARTIFACT, dto, cancellationToken: ct); public async Task UpdateKmArtifact(KmArtifactDTO dto, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, KmArtifactQB.UPDATE_KMARTIFACT, dto, cancellationToken: ct); public async Task UpdateGovernanceState(int artifactId, byte governanceState, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, KmArtifactQB.UPDATE_KMARTIFACT_GOVERNANCE_STATE, new { ArtifactId = artifactId, GovernanceState = governanceState, ModifiedById = login.UserId, TenantId = login.ClientId }, cancellationToken: ct); public async Task UpdateQdrantPoint(int artifactId, string qdrantPointId, string embeddingModel, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, KmArtifactQB.UPDATE_KMARTIFACT_QDRANT, new { ArtifactId = artifactId, QdrantPointId = qdrantPointId, EmbeddingModel = embeddingModel, TenantId = login.ClientId }, cancellationToken: ct); public async Task DeleteKmArtifact(int artifactId, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync(login, KmArtifactQB.DELETE_KMARTIFACT, new { ArtifactId = artifactId, ModifiedById = login.UserId, TenantId = login.ClientId }, cancellationToken: ct); public async Task GetArtifactCurrentState(int artifactId, LoginDTO login, CancellationToken ct) => await _qe.QuerySingleAsync( login, KmGovernanceStateQuery.GET_ARTIFACT_CURRENT_STATE, new { ArtifactId = artifactId, TenantId = login.ClientId }, cancellationToken: ct); } internal static class KmGovernanceStateQuery { public const string GET_ARTIFACT_CURRENT_STATE = @" SELECT GOVERNANCESTATE AS GovernanceState, VERSIONNUMBER AS VersionNumber, OWNERUSERID AS OwnerUserId, REVIEWERUSERID AS ReviewerUserId, TENANTID AS TenantId FROM MKMARTIFACT WHERE ARTIFACTID = @ArtifactId AND TENANTID = @TenantId AND STATUS NOT IN (2)"; } }