feat: disciple link
This commit is contained in:
@@ -2,6 +2,7 @@ package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"go.mongodb.org/mongo-driver/v2/bson"
|
||||
@@ -88,6 +89,60 @@ func (r *DiscipleRepo) GetByLetterAndSuffix(ctx context.Context, letter *string,
|
||||
return results, nil
|
||||
}
|
||||
|
||||
// FindByIDs returns summary docs for the given ObjectID hex strings (order
|
||||
// unspecified). Ids that aren't valid ObjectIDs are skipped rather than
|
||||
// failing the batch — the ids come from a Postgres column with no FK, so a
|
||||
// malformed or stale value must degrade gracefully. An empty/all-invalid
|
||||
// input short-circuits without hitting Mongo.
|
||||
//
|
||||
// Used to hydrate disciple names onto admin user rows: the user→disciple link
|
||||
// lives in Postgres while the disciple record lives here.
|
||||
func (r *DiscipleRepo) FindByIDs(ctx context.Context, ids []string) ([]DiscipleSummaryDoc, error) {
|
||||
oids := make([]bson.ObjectID, 0, len(ids))
|
||||
for _, id := range ids {
|
||||
if oid, err := bson.ObjectIDFromHex(id); err == nil {
|
||||
oids = append(oids, oid)
|
||||
}
|
||||
}
|
||||
if len(oids) == 0 {
|
||||
return []DiscipleSummaryDoc{}, nil
|
||||
}
|
||||
cursor, err := r.col.Find(ctx,
|
||||
bson.M{"_id": bson.M{"$in": oids}},
|
||||
options.Find().SetProjection(discipleSummaryProjection),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer cursor.Close(ctx)
|
||||
var results []DiscipleSummaryDoc
|
||||
if err := cursor.All(ctx, &results); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return results, nil
|
||||
}
|
||||
|
||||
// FindByID returns one disciple summary, or nil when the id is malformed or
|
||||
// no such document exists. Callers use it to validate a link target before
|
||||
// writing it to Postgres.
|
||||
func (r *DiscipleRepo) FindByID(ctx context.Context, id string) (*DiscipleSummaryDoc, error) {
|
||||
oid, err := bson.ObjectIDFromHex(id)
|
||||
if err != nil {
|
||||
return nil, nil // malformed id — "not found", not an error
|
||||
}
|
||||
var doc DiscipleSummaryDoc
|
||||
err = r.col.FindOne(ctx, bson.M{"_id": oid},
|
||||
options.FindOne().SetProjection(discipleSummaryProjection),
|
||||
).Decode(&doc)
|
||||
if errors.Is(err, mongo.ErrNoDocuments) {
|
||||
return nil, nil
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &doc, nil
|
||||
}
|
||||
|
||||
func (r *DiscipleRepo) Count(ctx context.Context) (int64, error) {
|
||||
return r.col.CountDocuments(ctx, bson.M{})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user