Skip to content

Commit faf0ff4

Browse files
authored
Merge pull request #356 from k1LoW/correct-shared
fix: to work properly with Shared Drive
2 parents 9ea2876 + c356a30 commit faf0ff4

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

deck.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ func Delete(ctx context.Context, id string, opts ...Option) (err error) {
220220
if err := d.initialize(ctx); err != nil {
221221
return err
222222
}
223-
if err := d.driveSrv.Files.Delete(id).Context(ctx).Do(); err != nil {
223+
if err := d.deleteOrTrashFile(ctx, id); err != nil {
224224
return fmt.Errorf("failed to delete presentation: %w", err)
225225
}
226226
return nil
@@ -420,7 +420,7 @@ func (d *Deck) AllowReadingByAnyone(ctx context.Context) (err error) {
420420
Type: "anyone",
421421
Role: "reader",
422422
}
423-
if _, err := d.driveSrv.Permissions.Create(d.id, permission).Context(ctx).Do(); err != nil {
423+
if _, err := d.driveSrv.Permissions.Create(d.id, permission).SupportsAllDrives(true).Context(ctx).Do(); err != nil {
424424
return fmt.Errorf("failed to set permission: %w", err)
425425
}
426426
return nil
@@ -629,3 +629,24 @@ func (d *Deck) refresh(ctx context.Context) (err error) {
629629

630630
return nil
631631
}
632+
633+
// deleteOrTrashFile attempts to delete a file, or move it to trash if deletion is not allowed.
634+
func (d *Deck) deleteOrTrashFile(ctx context.Context, id string) error {
635+
file, err := d.driveSrv.Files.Get(id).SupportsAllDrives(true).Fields("capabilities").Context(ctx).Do()
636+
if err != nil {
637+
return fmt.Errorf("file not found or not accessible before deletion (file ID: %s): %w", id, err)
638+
}
639+
640+
if file.Capabilities == nil || file.Capabilities.CanDelete {
641+
return d.driveSrv.Files.Delete(id).SupportsAllDrives(true).Context(ctx).Do()
642+
}
643+
if file.Capabilities.CanTrash {
644+
updateRequest := &drive.File{Trashed: true}
645+
_, err := d.driveSrv.Files.Update(id, updateRequest).SupportsAllDrives(true).Context(ctx).Do()
646+
if err != nil {
647+
return fmt.Errorf("failed to trash presentation: %w", err)
648+
}
649+
return nil
650+
}
651+
return fmt.Errorf("file cannot be deleted or trashed (file ID: %s)", id)
652+
}

preload.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,9 @@ func (d *Deck) startUploadingImages(
223223
if _, err := d.driveSrv.Permissions.Create(uploaded.Id, &drive.Permission{
224224
Type: "anyone",
225225
Role: "reader",
226-
}).Do(); err != nil {
226+
}).SupportsAllDrives(true).Do(); err != nil {
227227
// Clean up uploaded file on permission error
228-
if deleteErr := d.driveSrv.Files.Delete(uploaded.Id).SupportsAllDrives(true).Do(); deleteErr != nil {
228+
if deleteErr := d.deleteOrTrashFile(ctx, uploaded.Id); deleteErr != nil {
229229
d.logger.Error("failed to delete uploaded file after permission error",
230230
slog.String("id", uploaded.Id),
231231
slog.Any("error", deleteErr))
@@ -235,10 +235,10 @@ func (d *Deck) startUploadingImages(
235235
}
236236

237237
// Get webContentLink
238-
f, err := d.driveSrv.Files.Get(uploaded.Id).Fields("webContentLink").Do()
238+
f, err := d.driveSrv.Files.Get(uploaded.Id).Fields("webContentLink").SupportsAllDrives(true).Do()
239239
if err != nil {
240240
// Clean up uploaded file on error
241-
if deleteErr := d.driveSrv.Files.Delete(uploaded.Id).SupportsAllDrives(true).Do(); deleteErr != nil {
241+
if deleteErr := d.deleteOrTrashFile(ctx, uploaded.Id); deleteErr != nil {
242242
d.logger.Error("failed to delete uploaded file after webContentLink fetch error",
243243
slog.String("id", uploaded.Id),
244244
slog.Any("error", deleteErr))
@@ -249,7 +249,7 @@ func (d *Deck) startUploadingImages(
249249

250250
if f.WebContentLink == "" {
251251
// Clean up uploaded file on error
252-
if deleteErr := d.driveSrv.Files.Delete(uploaded.Id).SupportsAllDrives(true).Do(); deleteErr != nil {
252+
if deleteErr := d.deleteOrTrashFile(ctx, uploaded.Id); deleteErr != nil {
253253
d.logger.Error("failed to delete uploaded file after empty webContentLink",
254254
slog.String("id", uploaded.Id),
255255
slog.Any("error", deleteErr))
@@ -306,7 +306,7 @@ func (d *Deck) cleanupUploadedImages(ctx context.Context, uploadedCh <-chan uplo
306306
// Note: We only log errors here instead of returning them to ensure
307307
// all images are attempted to be deleted. A single deletion failure
308308
// should not prevent cleanup of other successfully uploaded images.
309-
if err := d.driveSrv.Files.Delete(info.uploadedID).SupportsAllDrives(true).Do(); err != nil {
309+
if err := d.deleteOrTrashFile(ctx, info.uploadedID); err != nil {
310310
d.logger.Error("failed to delete uploaded image",
311311
slog.String("id", info.uploadedID),
312312
slog.Any("error", err))

0 commit comments

Comments
 (0)