90 lines
2.4 KiB
Go
90 lines
2.4 KiB
Go
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
|
|
}
|