package mongodb import ( "context" "git.aiterp.net/rpdata/api/internal/generate" "git.aiterp.net/rpdata/api/models" "git.aiterp.net/rpdata/api/repositories" "github.com/globalsign/mgo" "github.com/globalsign/mgo/bson" ) type fileRepository struct { files *mgo.Collection } func (r *fileRepository) Find(ctx context.Context, id string) (*models.File, error) { file := new(models.File) err := r.files.FindId(id).One(file) if err != nil { if err == mgo.ErrNotFound { return nil, repositories.ErrNotFound } return nil, err } return file, nil } func (r *fileRepository) List(ctx context.Context, filter models.FileFilter) ([]*models.File, error) { query := bson.M{} if filter.Author != nil { query["author"] = *filter.Author } if filter.MimeTypes != nil { query["mimeType"] = bson.M{"$in": filter.MimeTypes} } if filter.Public != nil { query["public"] = *filter.Public } files := make([]*models.File, 0, 16) err := r.files.Find(query).Sort("-date").All(&files) if err != nil { return nil, err } return files, nil } func (r *fileRepository) Insert(ctx context.Context, file models.File) (*models.File, error) { file.ID = generate.FileID() err := r.files.Insert(&file) if err != nil { return nil, err } return &file, nil } func (r *fileRepository) Update(ctx context.Context, file models.File, update models.FileUpdate) (*models.File, error) { updateBson := bson.M{} if update.Public != nil { updateBson["public"] = *update.Public file.Public = *update.Public } if update.Name != nil { updateBson["name"] = *update.Name file.Name = *update.Name } err := r.files.UpdateId(file.ID, bson.M{"$set": updateBson}) if err != nil { return nil, err } return &file, nil } func (r *fileRepository) Delete(ctx context.Context, file models.File) error { return r.files.RemoveId(file.ID) } func newFileRepository(db *mgo.Database) (*fileRepository, error) { files := db.C("file.headers") err := files.EnsureIndexKey("author") if err != nil { return nil, err } err = files.EnsureIndexKey("mimeType") if err != nil { return nil, err } err = files.EnsureIndexKey("public") if err != nil { return nil, err } return &fileRepository{files: files}, nil }