From 15eb95f964a324a8a352d02dad07d7ecddea3d4f Mon Sep 17 00:00:00 2001 From: Steven Date: Fri, 6 Oct 2023 19:02:40 +0800 Subject: [PATCH] chore: delete resource file synchronously --- api/v2/resource_service.go | 31 ++++++++++++++++++++++++++++--- api/v2/v2.go | 6 +++--- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/api/v2/resource_service.go b/api/v2/resource_service.go index 209dede4..ade548d9 100644 --- a/api/v2/resource_service.go +++ b/api/v2/resource_service.go @@ -2,26 +2,39 @@ package v2 import ( "context" + "fmt" + "os" + "path/filepath" "time" + "go.uber.org/zap" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/timestamppb" + "github.com/usememos/memos/common/log" apiv2pb "github.com/usememos/memos/proto/gen/api/v2" + "github.com/usememos/memos/server/profile" "github.com/usememos/memos/store" ) +const ( + // thumbnailImagePath is the directory to store image thumbnails. + thumbnailImagePath = ".thumbnail_cache" +) + type ResourceService struct { apiv2pb.UnimplementedResourceServiceServer - Store *store.Store + Profile *profile.Profile + Store *store.Store } // NewResourceService creates a new ResourceService. -func NewResourceService(store *store.Store) *ResourceService { +func NewResourceService(profile *profile.Profile, store *store.Store) *ResourceService { return &ResourceService{ - Store: store, + Profile: profile, + Store: store, } } @@ -82,6 +95,18 @@ func (s *ResourceService) DeleteResource(ctx context.Context, request *apiv2pb.D if resource == nil { return nil, status.Errorf(codes.NotFound, "resource not found") } + // Delete the local file synchronously if it exists. + if resource.InternalPath != "" { + if err := os.Remove(resource.InternalPath); err != nil { + log.Warn(fmt.Sprintf("failed to delete local file with path %s", resource.InternalPath), zap.Error(err)) + } + } + // Delete the local thumbnail synchronously if it exists. + thumbnailPath := filepath.Join(s.Profile.Data, thumbnailImagePath, fmt.Sprintf("%d%s", resource.ID, filepath.Ext(resource.Filename))) + if err := os.Remove(thumbnailPath); err != nil { + log.Warn(fmt.Sprintf("failed to delete local thumbnail with path %s", thumbnailPath), zap.Error(err)) + } + // Delete the resource from the database. if err := s.Store.DeleteResource(ctx, &store.DeleteResource{ ID: resource.ID, }); err != nil { diff --git a/api/v2/v2.go b/api/v2/v2.go index e6b41f20..05e2f577 100644 --- a/api/v2/v2.go +++ b/api/v2/v2.go @@ -4,7 +4,7 @@ import ( "context" "fmt" - grpcRuntime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "github.com/improbable-eng/grpc-web/go/grpcweb" "github.com/labstack/echo/v4" "google.golang.org/grpc" @@ -37,7 +37,7 @@ func NewAPIV2Service(secret string, profile *profile.Profile, store *store.Store apiv2pb.RegisterUserServiceServer(grpcServer, NewUserService(store, secret)) apiv2pb.RegisterMemoServiceServer(grpcServer, NewMemoService(store)) apiv2pb.RegisterTagServiceServer(grpcServer, NewTagService(store)) - apiv2pb.RegisterResourceServiceServer(grpcServer, NewResourceService(store)) + apiv2pb.RegisterResourceServiceServer(grpcServer, NewResourceService(profile, store)) reflection.Register(grpcServer) return &APIV2Service{ @@ -66,7 +66,7 @@ func (s *APIV2Service) RegisterGateway(ctx context.Context, e *echo.Echo) error return err } - gwMux := grpcRuntime.NewServeMux() + gwMux := runtime.NewServeMux() if err := apiv2pb.RegisterSystemServiceHandler(context.Background(), gwMux, conn); err != nil { return err }