You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.2 KiB
105 lines
2.2 KiB
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
|
|
}
|