pki-manager/internal/repository/mongo_repository.go

230 lines
5.8 KiB
Go

package repository
import (
"context"
"log"
"time"
"pki-manager/internal/models"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
)
type MongoRepository struct {
db *mongo.Database
}
func NewMongoRepository(db *mongo.Database) *MongoRepository {
return &MongoRepository{db: db}
}
func (r *MongoRepository) CreateCA(ctx context.Context, ca *models.CA) error {
ca.CreatedAt = time.Now()
ca.UpdatedAt = time.Now()
_, err := r.db.Collection("cas").InsertOne(ctx, ca)
return err
}
func (r *MongoRepository) GetCA(ctx context.Context, id string) (*models.CA, error) {
var ca models.CA
err := r.db.Collection("cas").FindOne(ctx, bson.M{"_id": id}).Decode(&ca)
if err != nil {
return nil, err
}
return &ca, nil
}
func (r *MongoRepository) GetAllCAs(ctx context.Context) ([]*models.CA, error) {
var cas []*models.CA
cursor, err := r.db.Collection("cas").Find(ctx, bson.M{})
if err != nil {
// Retourner un tableau vide au lieu d'une erreur
return []*models.CA{}, nil
}
defer cursor.Close(ctx)
for cursor.Next(ctx) {
var ca models.CA
if err := cursor.Decode(&ca); err != nil {
continue // Ignorer les erreurs de décodage
}
cas = append(cas, &ca)
}
return cas, nil
}
func (r *MongoRepository) UpdateCA(ctx context.Context, id string, updates map[string]interface{}) error {
updates["updated_at"] = time.Now()
_, err := r.db.Collection("cas").UpdateOne(
ctx,
bson.M{"_id": id},
bson.M{"$set": updates},
)
return err
}
func (r *MongoRepository) DeleteCA(ctx context.Context, id string) error {
_, err := r.db.Collection("cas").DeleteOne(ctx, bson.M{"_id": id})
return err
}
// SubCA methods
func (r *MongoRepository) CreateSubCA(ctx context.Context, subca *models.SubCA) error {
subca.CreatedAt = time.Now()
subca.UpdatedAt = time.Now()
_, err := r.db.Collection("subcas").InsertOne(ctx, subca)
return err
}
func (r *MongoRepository) GetSubCA(ctx context.Context, id string) (*models.SubCA, error) {
var subca models.SubCA
err := r.db.Collection("subcas").FindOne(ctx, bson.M{"_id": id}).Decode(&subca)
if err != nil {
return nil, err
}
return &subca, nil
}
func (r *MongoRepository) GetSubCAsByParent(ctx context.Context, parentCAID string) ([]*models.SubCA, error) {
var subcas []*models.SubCA
cursor, err := r.db.Collection("subcas").Find(ctx, bson.M{"parent_ca_id": parentCAID})
if err != nil {
return nil, err
}
defer cursor.Close(ctx)
for cursor.Next(ctx) {
var subca models.SubCA
if err := cursor.Decode(&subca); err != nil {
log.Println("Error decoding SubCA:", err)
continue
}
subcas = append(subcas, &subca)
}
return subcas, nil
}
func (r *MongoRepository) GetAllSubCAs(ctx context.Context) ([]*models.SubCA, error) {
var subcas []*models.SubCA
cursor, err := r.db.Collection("subcas").Find(ctx, bson.M{})
if err != nil {
// Retourner un tableau vide au lieu d'une erreur
return []*models.SubCA{}, nil
}
defer cursor.Close(ctx)
for cursor.Next(ctx) {
var subca models.SubCA
if err := cursor.Decode(&subca); err != nil {
continue // Ignorer les erreurs de décodage
}
subcas = append(subcas, &subca)
}
return subcas, nil
}
func (r *MongoRepository) UpdateSubCA(ctx context.Context, id string, updates map[string]interface{}) error {
updates["updated_at"] = time.Now()
_, err := r.db.Collection("subcas").UpdateOne(
ctx,
bson.M{"_id": id},
bson.M{"$set": updates},
)
return err
}
func (r *MongoRepository) DeleteSubCA(ctx context.Context, id string) error {
_, err := r.db.Collection("subcas").DeleteOne(ctx, bson.M{"_id": id})
return err
}
// Certificate methods
func (r *MongoRepository) CreateCertificate(ctx context.Context, cert *models.Certificate) error {
cert.CreatedAt = time.Now()
_, err := r.db.Collection("certificates").InsertOne(ctx, cert)
return err
}
func (r *MongoRepository) GetCertificate(ctx context.Context, id string) (*models.Certificate, error) {
var cert models.Certificate
err := r.db.Collection("certificates").FindOne(ctx, bson.M{"_id": id}).Decode(&cert)
if err != nil {
return nil, err
}
return &cert, nil
}
func (r *MongoRepository) GetCertificatesByIssuer(ctx context.Context, issuerCAID string) ([]*models.Certificate, error) {
var certs []*models.Certificate
cursor, err := r.db.Collection("certificates").Find(ctx, bson.M{"issuer_ca_id": issuerCAID})
if err != nil {
return nil, err
}
defer cursor.Close(ctx)
for cursor.Next(ctx) {
var cert models.Certificate
if err := cursor.Decode(&cert); err != nil {
log.Println("Error decoding certificate:", err)
continue
}
certs = append(certs, &cert)
}
return certs, nil
}
func (r *MongoRepository) GetAllCertificates(ctx context.Context) ([]*models.Certificate, error) {
var certs []*models.Certificate
cursor, err := r.db.Collection("certificates").Find(ctx, bson.M{})
if err != nil {
// Retourner un tableau vide au lieu d'une erreur
return []*models.Certificate{}, nil
}
defer cursor.Close(ctx)
for cursor.Next(ctx) {
var cert models.Certificate
if err := cursor.Decode(&cert); err != nil {
continue // Ignorer les erreurs de décodage
}
certs = append(certs, &cert)
}
return certs, nil
}
func (r *MongoRepository) UpdateCertificate(ctx context.Context, id string, updates map[string]interface{}) error {
_, err := r.db.Collection("certificates").UpdateOne(
ctx,
bson.M{"_id": id},
bson.M{"$set": updates},
)
return err
}
func (r *MongoRepository) DeleteCertificate(ctx context.Context, id string) error {
_, err := r.db.Collection("certificates").DeleteOne(ctx, bson.M{"_id": id})
return err
}
func (r *MongoRepository) RevokeCertificate(ctx context.Context, id string, reason string) error {
updates := bson.M{
"revoked": true,
"revoked_at": time.Now(),
"revoked_reason": reason,
}
_, err := r.db.Collection("certificates").UpdateOne(
ctx,
bson.M{"_id": id},
bson.M{"$set": updates},
)
return err
}