using DysonNetwork.Shared.Proto; using Grpc.Core; using NodaTime; using Duration = NodaTime.Duration; namespace DysonNetwork.Drive.Storage { public class FileReferenceServiceGrpc(FileReferenceService fileReferenceService) : Shared.Proto.FileReferenceService.FileReferenceServiceBase { public override async Task CreateReference(CreateReferenceRequest request, ServerCallContext context) { Instant? expiredAt = null; if (request.ExpiredAt != null) expiredAt = Instant.FromUnixTimeSeconds(request.ExpiredAt.Seconds); else if (request.Duration != null) expiredAt = SystemClock.Instance.GetCurrentInstant() + Duration.FromTimeSpan(request.Duration.ToTimeSpan()); var reference = await fileReferenceService.CreateReferenceAsync( request.FileId, request.Usage, request.ResourceId, expiredAt ); return reference.ToProtoValue(); } public override async Task GetReferences(GetReferencesRequest request, ServerCallContext context) { var references = await fileReferenceService.GetReferencesAsync(request.FileId); var response = new GetReferencesResponse(); response.References.AddRange(references.Select(r => r.ToProtoValue())); return response; } public override async Task GetReferenceCount(GetReferenceCountRequest request, ServerCallContext context) { var count = await fileReferenceService.GetReferenceCountAsync(request.FileId); return new GetReferenceCountResponse { Count = count }; } public override async Task GetResourceReferences(GetResourceReferencesRequest request, ServerCallContext context) { var references = await fileReferenceService.GetResourceReferencesAsync(request.ResourceId, request.Usage); var response = new GetReferencesResponse(); response.References.AddRange(references.Select(r => r.ToProtoValue())); return response; } public override async Task GetResourceFiles(GetResourceFilesRequest request, ServerCallContext context) { var files = await fileReferenceService.GetResourceFilesAsync(request.ResourceId, request.Usage); var response = new GetResourceFilesResponse(); response.Files.AddRange(files.Select(f => f.ToProtoValue())); return response; } public override async Task DeleteResourceReferences( DeleteResourceReferencesRequest request, ServerCallContext context) { var deletedCount = 0; if (request.Usage is null) deletedCount = await fileReferenceService.DeleteResourceReferencesAsync(request.ResourceId); else deletedCount = await fileReferenceService.DeleteResourceReferencesAsync(request.ResourceId, request.Usage!); return new DeleteResourceReferencesResponse { DeletedCount = deletedCount }; } public override async Task DeleteReference(DeleteReferenceRequest request, ServerCallContext context) { var success = await fileReferenceService.DeleteReferenceAsync(Guid.Parse(request.ReferenceId)); return new DeleteReferenceResponse { Success = success }; } public override async Task UpdateResourceFiles(UpdateResourceFilesRequest request, ServerCallContext context) { Instant? expiredAt = null; if (request.ExpiredAt != null) { expiredAt = Instant.FromUnixTimeSeconds(request.ExpiredAt.Seconds); } else if (request.Duration != null) { expiredAt = SystemClock.Instance.GetCurrentInstant() + Duration.FromTimeSpan(request.Duration.ToTimeSpan()); } var references = await fileReferenceService.UpdateResourceFilesAsync( request.ResourceId, request.FileIds, request.Usage, expiredAt ); var response = new UpdateResourceFilesResponse(); response.References.AddRange(references.Select(r => r.ToProtoValue())); return response; } public override async Task SetReferenceExpiration( SetReferenceExpirationRequest request, ServerCallContext context) { Instant? expiredAt = null; if (request.ExpiredAt != null) { expiredAt = Instant.FromUnixTimeSeconds(request.ExpiredAt.Seconds); } else if (request.Duration != null) { expiredAt = SystemClock.Instance.GetCurrentInstant() + Duration.FromTimeSpan(request.Duration.ToTimeSpan()); } var success = await fileReferenceService.SetReferenceExpirationAsync(Guid.Parse(request.ReferenceId), expiredAt); return new SetReferenceExpirationResponse { Success = success }; } public override async Task SetFileReferencesExpiration( SetFileReferencesExpirationRequest request, ServerCallContext context) { var expiredAt = Instant.FromUnixTimeSeconds(request.ExpiredAt.Seconds); var updatedCount = await fileReferenceService.SetFileReferencesExpirationAsync(request.FileId, expiredAt); return new SetFileReferencesExpirationResponse { UpdatedCount = updatedCount }; } public override async Task HasFileReferences(HasFileReferencesRequest request, ServerCallContext context) { var hasReferences = await fileReferenceService.HasFileReferencesAsync(request.FileId); return new HasFileReferencesResponse { HasReferences = hasReferences }; } } }