api: image temporary file will be removed after use

This commit is contained in:
Tigor Hutasuhut 2024-05-04 09:53:03 +07:00
parent 64c3d57a61
commit 7333e09e49

View file

@ -116,6 +116,7 @@ func (api *API) downloadSubredditListImage(ctx context.Context, list reddit.List
}() }()
if imageFile := api.findImageFileForDevices(ctx, post, devices); imageFile != nil { if imageFile := api.findImageFileForDevices(ctx, post, devices); imageFile != nil {
defer cleanup(imageFile)
err := api.saveImageToFSAndDatabase(ctx, imageFile, subreddit, post, acceptedDevices) err := api.saveImageToFSAndDatabase(ctx, imageFile, subreddit, post, acceptedDevices)
if err != nil { if err != nil {
log.New(ctx).Err(err).Error("failed to download subreddit image") log.New(ctx).Err(err).Error("failed to download subreddit image")
@ -149,7 +150,7 @@ func (api *API) downloadSubredditImage(ctx context.Context, post reddit.Post, su
if err != nil { if err != nil {
return errs.Wrapw(err, "failed to download image to temp file") return errs.Wrapw(err, "failed to download image to temp file")
} }
defer tmpImageFile.Close() defer cleanup(tmpImageFile)
thumbnailPath := post.GetThumbnailTargetPath(api.config) thumbnailPath := post.GetThumbnailTargetPath(api.config)
_, errStat := os.Stat(thumbnailPath) _, errStat := os.Stat(thumbnailPath)
@ -333,11 +334,12 @@ func (api *API) isImageEntryExists(ctx context.Context, post reddit.Post, device
// Return nil if no image file exists for the devices. // Return nil if no image file exists for the devices.
// //
// Ensure to close the file after use. // Ensure to close the file after use.
func (api *API) findImageFileForDevices(ctx context.Context, post reddit.Post, devices models.DeviceSlice) (oldImageFile *os.File) { func (api *API) findImageFileForDevices(ctx context.Context, post reddit.Post, devices models.DeviceSlice) *os.File {
for _, device := range devices { for _, device := range devices {
stat, err := os.Stat(post.GetImageTargetPath(api.config, device)) stat, err := os.Stat(post.GetImageTargetPath(api.config, device))
if err == nil { if err == nil {
oldImageFile, err = os.Open(post.GetImageTargetPath(api.config, device)) var err error
oldImageFile, err := os.Open(post.GetImageTargetPath(api.config, device))
if err != nil { if err != nil {
log.New(ctx).Err(err).Error("failed to open image file", "filename", post.GetImageTargetPath(api.config, device)) log.New(ctx).Err(err).Error("failed to open image file", "filename", post.GetImageTargetPath(api.config, device))
return nil return nil
@ -438,6 +440,10 @@ func (te *tempFile) Close() error {
return te.file.Close() return te.file.Close()
} }
func (te *tempFile) Name() string {
return te.filename
}
// copyImageToTempDir copies the image to a temporary directory and returns the file handle // copyImageToTempDir copies the image to a temporary directory and returns the file handle
// //
// file must be closed by the caller after use. // file must be closed by the caller after use.
@ -494,3 +500,13 @@ func (api *API) copyImageToTempDir(ctx context.Context, img reddit.PostImage) (t
filename: tmpFilename, filename: tmpFilename,
}, err }, err
} }
type removeableFile interface {
io.ReadCloser
Name() string
}
func cleanup(file removeableFile) {
_ = file.Close()
_ = os.Remove(file.Name())
}