init push
This commit is contained in:
136
internal/transport/http/handlers/file_lifecycle_hooks.go
Normal file
136
internal/transport/http/handlers/file_lifecycle_hooks.go
Normal file
@@ -0,0 +1,136 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
filemanager "wucher/internal/domain/file_manager"
|
||||
)
|
||||
|
||||
func resolveFileIDFromAttachment(ctx context.Context, svc filemanager.Service, attachmentID []byte) ([]byte, error) {
|
||||
if len(attachmentID) != 16 || svc == nil {
|
||||
return nil, nil
|
||||
}
|
||||
attachment, err := svc.GetAttachmentByID(ctx, attachmentID)
|
||||
if err != nil || attachment == nil {
|
||||
return nil, err
|
||||
}
|
||||
return attachment.FileID, nil
|
||||
}
|
||||
|
||||
func syncAttachmentLifecycleSwap(
|
||||
ctx context.Context,
|
||||
svc filemanager.Service,
|
||||
oldAttachmentID []byte,
|
||||
newAttachmentID []byte,
|
||||
actorID []byte,
|
||||
) error {
|
||||
lifecycle, ok := svc.(filemanager.LifecycleManager)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
oldFileID, err := resolveFileIDFromAttachment(ctx, svc, oldAttachmentID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
newFileID, err := resolveFileIDFromAttachment(ctx, svc, newAttachmentID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(newFileID) == 16 {
|
||||
if err := lifecycle.MarkFileActive(ctx, newFileID, actorID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if len(oldFileID) == 16 && (len(newFileID) != 16 || string(oldFileID) != string(newFileID)) {
|
||||
if err := lifecycle.ReconcileFileLifecycle(ctx, oldFileID, actorID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func syncAttachmentLifecycleClear(
|
||||
ctx context.Context,
|
||||
svc filemanager.Service,
|
||||
oldAttachmentID []byte,
|
||||
actorID []byte,
|
||||
) error {
|
||||
return syncAttachmentLifecycleSwap(ctx, svc, oldAttachmentID, nil, actorID)
|
||||
}
|
||||
|
||||
func syncFileLifecycleSwap(
|
||||
ctx context.Context,
|
||||
svc filemanager.Service,
|
||||
oldFileID []byte,
|
||||
newFileID []byte,
|
||||
actorID []byte,
|
||||
) error {
|
||||
lifecycle, ok := svc.(filemanager.LifecycleManager)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
if len(newFileID) == 16 {
|
||||
if err := lifecycle.MarkFileActive(ctx, newFileID, actorID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if len(oldFileID) == 16 && (len(newFileID) != 16 || string(oldFileID) != string(newFileID)) {
|
||||
if err := lifecycle.ReconcileFileLifecycle(ctx, oldFileID, actorID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func syncAttachmentLifecycleSet(
|
||||
ctx context.Context,
|
||||
svc filemanager.Service,
|
||||
oldAttachmentIDs [][]byte,
|
||||
newAttachmentIDs [][]byte,
|
||||
actorID []byte,
|
||||
) error {
|
||||
lifecycle, ok := svc.(filemanager.LifecycleManager)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
oldMap := make(map[string][]byte, len(oldAttachmentIDs))
|
||||
newMap := make(map[string][]byte, len(newAttachmentIDs))
|
||||
for i := range oldAttachmentIDs {
|
||||
if len(oldAttachmentIDs[i]) == 16 {
|
||||
oldMap[string(oldAttachmentIDs[i])] = oldAttachmentIDs[i]
|
||||
}
|
||||
}
|
||||
for i := range newAttachmentIDs {
|
||||
if len(newAttachmentIDs[i]) == 16 {
|
||||
newMap[string(newAttachmentIDs[i])] = newAttachmentIDs[i]
|
||||
}
|
||||
}
|
||||
|
||||
for _, attachmentID := range newMap {
|
||||
fileID, err := resolveFileIDFromAttachment(ctx, svc, attachmentID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(fileID) == 16 {
|
||||
if err := lifecycle.MarkFileActive(ctx, fileID, actorID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for key, attachmentID := range oldMap {
|
||||
if _, keep := newMap[key]; keep {
|
||||
continue
|
||||
}
|
||||
fileID, err := resolveFileIDFromAttachment(ctx, svc, attachmentID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(fileID) == 16 {
|
||||
if err := lifecycle.ReconcileFileLifecycle(ctx, fileID, actorID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user