verification/script/main.go
skeris d02f851c82
Some checks failed
Lint / Lint (push) Failing after 1m27s
add lint and deploy pipelines
2024-12-08 16:10:21 +03:00

122 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}