2023-03-12 15:00:57 +00:00
// GoToSocial
// Copyright (C) GoToSocial Authors admin@gotosocial.org
// SPDX-License-Identifier: AGPL-3.0-or-later
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
2021-07-05 11:23:03 +00:00
package media
import (
2021-08-25 13:34:33 +00:00
"context"
2023-02-06 14:58:54 +00:00
"errors"
2021-07-05 11:23:03 +00:00
"fmt"
"strings"
2023-02-06 14:58:54 +00:00
"codeberg.org/gruf/go-store/v2/storage"
2021-07-05 11:23:03 +00:00
"github.com/superseriousbusiness/gotosocial/internal/db"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
)
2023-02-22 15:05:26 +00:00
// Delete deletes the media attachment with the given ID, including all files pertaining to that attachment.
func ( p * Processor ) Delete ( ctx context . Context , mediaAttachmentID string ) gtserror . WithCode {
2023-03-01 18:26:53 +00:00
attachment , err := p . state . DB . GetAttachmentByID ( ctx , mediaAttachmentID )
2021-08-25 13:34:33 +00:00
if err != nil {
2021-08-20 10:26:56 +00:00
if err == db . ErrNoEntries {
2021-07-05 11:23:03 +00:00
// attachment already gone
return nil
}
// actual error
return gtserror . NewErrorInternalError ( err )
}
errs := [ ] string { }
// delete the thumbnail from storage
2021-08-25 13:34:33 +00:00
if attachment . Thumbnail . Path != "" {
2023-03-01 18:26:53 +00:00
if err := p . state . Storage . Delete ( ctx , attachment . Thumbnail . Path ) ; err != nil && ! errors . Is ( err , storage . ErrNotFound ) {
2021-08-25 13:34:33 +00:00
errs = append ( errs , fmt . Sprintf ( "remove thumbnail at path %s: %s" , attachment . Thumbnail . Path , err ) )
2021-07-05 11:23:03 +00:00
}
}
// delete the file from storage
2021-08-25 13:34:33 +00:00
if attachment . File . Path != "" {
2023-03-01 18:26:53 +00:00
if err := p . state . Storage . Delete ( ctx , attachment . File . Path ) ; err != nil && ! errors . Is ( err , storage . ErrNotFound ) {
2021-08-25 13:34:33 +00:00
errs = append ( errs , fmt . Sprintf ( "remove file at path %s: %s" , attachment . File . Path , err ) )
2021-07-05 11:23:03 +00:00
}
}
// delete the attachment
2023-03-03 23:02:23 +00:00
if err := p . state . DB . DeleteAttachment ( ctx , mediaAttachmentID ) ; err != nil && ! errors . Is ( err , db . ErrNoEntries ) {
2023-02-07 08:51:15 +00:00
errs = append ( errs , fmt . Sprintf ( "remove attachment: %s" , err ) )
2021-07-05 11:23:03 +00:00
}
if len ( errs ) != 0 {
return gtserror . NewErrorInternalError ( fmt . Errorf ( "Delete: one or more errors removing attachment with id %s: %s" , mediaAttachmentID , strings . Join ( errs , "; " ) ) )
}
return nil
}