package main import ( "context" "fmt" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "gitea.pena/PenaSide/verification/internal/models" ) const ( bucketName = "videodata" minioEndpoint = "localhost:9000" accessKeyID = "admin" secretAccessKey = "admin123" mongoURI = "mongodb://test:test@localhost:27024/?authSource=admin" mongoDBName = "admin" collectionName = "verification" ) func main() { ctx := context.Background() clientOptions := options.Client().ApplyURI(mongoURI) client, err := mongo.Connect(ctx, clientOptions) if err != nil { fmt.Println("Ошибка подключения к монго:", err) return } defer client.Disconnect(ctx) collection := client.Database(mongoDBName).Collection(collectionName) minioClient, err := minio.New(minioEndpoint, &minio.Options{ Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""), Secure: true, }) if err != nil { fmt.Println("Ошибка подключения к минио:", err) return } allFiles, err := getAllFilesInBucket(ctx, minioClient) if err != nil { fmt.Println("Ошибка при получении списка файлов в бакете:", err) return } verifications, err := getVerificationRecords(ctx, collection) if err != nil { fmt.Println("Ошибка при получении записей верификаций из базы данных:", err) return } for _, file := range allFiles { if !checkContains(verifications, file.Key) { fmt.Println("Удаление файла:", file.Key) err := deleteFileFromBucket(ctx, minioClient, file.Key) if err != nil { fmt.Println("Ошибка при удалении файла:", err) } } } } // получение всех файлов из минио по бакету func getAllFilesInBucket(ctx context.Context, client *minio.Client) ([]minio.ObjectInfo, error) { var files []minio.ObjectInfo objectCh := client.ListObjects(ctx, bucketName, minio.ListObjectsOptions{ Recursive: true, // флаг рекурсивного прохода по расположениям, добавлен с добавлением folder }) for object := range objectCh { if object.Err != nil { return nil, object.Err } files = append(files, object) } return files, nil } // удаление файла из минио func deleteFileFromBucket(ctx context.Context, client *minio.Client, fileName string) error { err := client.RemoveObject(ctx, bucketName, fileName, minio.RemoveObjectOptions{}) return err } // получение списка верефикаций из монго func getVerificationRecords(ctx context.Context, collection *mongo.Collection) ([]models.Verification, error) { var records []models.Verification cursor, err := collection.Find(ctx, bson.M{}) if err != nil { return nil, err } defer cursor.Close(ctx) for cursor.Next(ctx) { var record models.Verification if err := cursor.Decode(&record); err != nil { return nil, err } records = append(records, record) } if err := cursor.Err(); err != nil { return nil, err } return records, nil } // проверка на существования файла минио в монге по урлу func checkContains(verifications []models.Verification, fileKey string) bool { fileURL := fmt.Sprintf("%s/%s/%s", minioEndpoint, bucketName, fileKey) for _, verification := range verifications { for _, file := range verification.Files { if file.Url == fileURL { return true } } } return false }