package repository import ( "context" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo" "go.mongodb.org/mongo-driver/v2/mongo/options" ) type MagazineRepo struct { meta *mongo.Collection issues *mongo.Collection } func NewMagazineRepo(db *MongoDB) *MagazineRepo { return &MagazineRepo{ meta: db.Collection("magazine_meta"), issues: db.Collection("magazine_issues"), } } type MagazineMetaDoc struct { ID bson.ObjectID `bson:"_id" json:"id"` Book string `bson:"book" json:"book"` Data interface{} `bson:"data" json:"data"` } type MagazineIssueDoc struct { ID bson.ObjectID `bson:"_id" json:"id"` Book string `bson:"book" json:"book"` Volume *int `bson:"volume,omitempty" json:"volume,omitempty"` Part int `bson:"part" json:"part"` Title string `bson:"title" json:"title"` Slug string `bson:"slug" json:"slug"` Order int `bson:"order" json:"order"` Paragraphs []string `bson:"paragraphs" json:"paragraphs"` } func (r *MagazineRepo) GetAllMetas(ctx context.Context) ([]MagazineMetaDoc, error) { cursor, err := r.meta.Find(ctx, bson.M{}) if err != nil { return nil, err } defer cursor.Close(ctx) var results []MagazineMetaDoc if err := cursor.All(ctx, &results); err != nil { return nil, err } return results, nil } func (r *MagazineRepo) GetMeta(ctx context.Context, book string) (*MagazineMetaDoc, error) { var doc MagazineMetaDoc err := r.meta.FindOne(ctx, bson.M{"book": book}).Decode(&doc) if err != nil { if err == mongo.ErrNoDocuments { return nil, nil } return nil, err } return &doc, nil } func (r *MagazineRepo) GetIssues(ctx context.Context, book string) ([]MagazineIssueDoc, error) { opts := options.Find().SetSort(bson.M{"order": 1}) cursor, err := r.issues.Find(ctx, bson.M{"book": book}, opts) if err != nil { return nil, err } defer cursor.Close(ctx) var results []MagazineIssueDoc if err := cursor.All(ctx, &results); err != nil { return nil, err } return results, nil } func (r *MagazineRepo) GetIssue(ctx context.Context, book, slug string) (*MagazineIssueDoc, error) { var doc MagazineIssueDoc err := r.issues.FindOne(ctx, bson.M{"book": book, "slug": slug}).Decode(&doc) if err != nil { if err == mongo.ErrNoDocuments { return nil, nil } return nil, err } return &doc, nil }