144 lines
4.1 KiB
Go
144 lines
4.1 KiB
Go
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"
|
|
folder = "folder"
|
|
)
|
|
|
|
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{})
|
|
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 {
|
|
firstTry := func(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
|
|
}
|
|
|
|
secondTry := func(verifications []models.Verification, fileKey string) bool {
|
|
for _, verification := range verifications {
|
|
for _, file := range verification.Files {
|
|
fileURL := fmt.Sprintf("%s/%s/%s/%s/%s", minioEndpoint, bucketName, folder, verification.UserID, fileKey)
|
|
if file.Url == fileURL {
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
if firstTry(verifications, fileKey) {
|
|
return true
|
|
}
|
|
|
|
if secondTry(verifications, fileKey) {
|
|
return true
|
|
}
|
|
return false
|
|
}
|