diff --git a/script/main.go b/script/main.go new file mode 100644 index 0000000..563f216 --- /dev/null +++ b/script/main.go @@ -0,0 +1,120 @@ +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" + "penahub.gitlab.yandexcloud.net/backend/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: false, + }) + 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{}) + 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 { + fmt.Println(file.Url) + if file.Url == fileURL { + return true + } + } + } + return false +}