174 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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<Shared.Proto.CloudFileReference> 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<CreateReferenceBatchResponse> CreateReferenceBatch(CreateReferenceBatchRequest 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.CreateReferencesAsync(
 | |
|             request.FilesId.ToList(),
 | |
|             request.Usage,
 | |
|             request.ResourceId,
 | |
|             expiredAt
 | |
|         );
 | |
|         var response = new CreateReferenceBatchResponse();
 | |
|         response.References.AddRange(references.Select(r => r.ToProtoValue()));
 | |
|         return response;
 | |
|     }
 | |
| 
 | |
|     public override async Task<GetReferencesResponse> 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<GetReferenceCountResponse> GetReferenceCount(GetReferenceCountRequest request,
 | |
|         ServerCallContext context)
 | |
|     {
 | |
|         var count = await fileReferenceService.GetReferenceCountAsync(request.FileId);
 | |
|         return new GetReferenceCountResponse { Count = count };
 | |
|     }
 | |
| 
 | |
|     public override async Task<GetReferencesResponse> 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<GetResourceFilesResponse> 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<DeleteResourceReferencesResponse> DeleteResourceReferences(
 | |
|         DeleteResourceReferencesRequest request, ServerCallContext context)
 | |
|     {
 | |
|         int deletedCount;
 | |
|         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<DeleteResourceReferencesResponse> DeleteResourceReferencesBatch(DeleteResourceReferencesBatchRequest request, ServerCallContext context)
 | |
|     {
 | |
|         var resourceIds = request.ResourceIds.ToList();
 | |
|         int deletedCount;
 | |
|         if (request.Usage is null)
 | |
|             deletedCount = await fileReferenceService.DeleteResourceReferencesBatchAsync(resourceIds);
 | |
|         else
 | |
|             deletedCount =
 | |
|                 await fileReferenceService.DeleteResourceReferencesBatchAsync(resourceIds, request.Usage!);
 | |
|         return new DeleteResourceReferencesResponse { DeletedCount = deletedCount };
 | |
|     }
 | |
| 
 | |
|     public override async Task<DeleteReferenceResponse> DeleteReference(DeleteReferenceRequest request,
 | |
|         ServerCallContext context)
 | |
|     {
 | |
|         var success = await fileReferenceService.DeleteReferenceAsync(Guid.Parse(request.ReferenceId));
 | |
|         return new DeleteReferenceResponse { Success = success };
 | |
|     }
 | |
| 
 | |
|     public override async Task<UpdateResourceFilesResponse> 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<SetReferenceExpirationResponse> 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<SetFileReferencesExpirationResponse> 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<HasFileReferencesResponse> HasFileReferences(HasFileReferencesRequest request,
 | |
|         ServerCallContext context)
 | |
|     {
 | |
|         var hasReferences = await fileReferenceService.HasFileReferencesAsync(request.FileId);
 | |
|         return new HasFileReferencesResponse { HasReferences = hasReferences };
 | |
|     }
 | |
| } |