Implemented first repository using tiedot
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
package repositories
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/HouzuoGuo/tiedot/db"
|
||||
"github.com/astaxie/beego"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type BaseRepository struct {
|
||||
col *db.Col
|
||||
}
|
||||
|
||||
func (r *BaseRepository) marshal(rec interface{}) (map[string]interface{}, error) {
|
||||
// Convert to JSON...
|
||||
b, err := json.Marshal(rec);
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// ... then convert to map
|
||||
var m map[string]interface{}
|
||||
err = json.Unmarshal(b, &m)
|
||||
return m, err
|
||||
}
|
||||
|
||||
func (r*BaseRepository) query(q string, a ...interface{}) (map[int]struct{}, error) {
|
||||
q = fmt.Sprintf(q, a)
|
||||
|
||||
var query interface{}
|
||||
json.Unmarshal([]byte(q), &query)
|
||||
|
||||
queryResult := make(map[int]struct{})
|
||||
|
||||
err := db.EvalQuery(query, r.col, &queryResult)
|
||||
if err != nil {
|
||||
beego.Warn("Error '%s' - query='%s'", q, err)
|
||||
}
|
||||
return queryResult, err
|
||||
}
|
||||
|
||||
func (r*BaseRepository) queryFirstKey(q string, a ...interface{}) (int, error) {
|
||||
result, err := r.query(q, a)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
for key, _ := range result {
|
||||
return key, nil
|
||||
}
|
||||
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
func (r *BaseRepository) saveOrUpdate(rec interface{}) error {
|
||||
m, err := r.marshal(rec)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
docId, err := r.queryFirstKey(`{"in": ["Id"], "eq": "%s"}`, m["Id"])
|
||||
if docId == 0 {
|
||||
_, err = r.col.Insert(m)
|
||||
return err
|
||||
}
|
||||
err = r.col.Update(docId, m)
|
||||
if err != nil {
|
||||
beego.Warn("Error updating %s[%d]: %s", r.col, docId, err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (r *BaseRepository) Dump() {
|
||||
r.col.ForEachDoc(func(id int, docContent []byte) (willMoveOn bool) {
|
||||
beego.Debug("Document", id, "=", string(docContent))
|
||||
return true
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
package repositories
|
||||
|
||||
import (
|
||||
"github.com/HouzuoGuo/tiedot/db"
|
||||
"github.com/astaxie/beego"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
_dbInstance *db.DB
|
||||
once sync.Once
|
||||
)
|
||||
|
||||
func createCollection(name string) *db.Col {
|
||||
col := dbInstance().Use(name)
|
||||
if col != nil {
|
||||
return col
|
||||
}
|
||||
if err := dbInstance().Create(name); err != nil {
|
||||
beego.Error(err)
|
||||
}
|
||||
if err := col.Index([]string{"Id"}); err != nil {
|
||||
beego.Error(name, err)
|
||||
}
|
||||
return col
|
||||
}
|
||||
|
||||
func dbInstance() *db.DB {
|
||||
once.Do(func() {
|
||||
instance, err := db.OpenDB(beego.AppConfig.String("dbPath"))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
_dbInstance = instance
|
||||
})
|
||||
return _dbInstance
|
||||
}
|
||||
@@ -1,10 +1,24 @@
|
||||
package repositories
|
||||
|
||||
//import "github.com/deluan/gosonic/models"
|
||||
//
|
||||
//func AddMediaFile(m models.MediaFile) string {
|
||||
// m.ID = "user_" + strconv.FormatInt(time.Now().UnixNano(), 10)
|
||||
// UserList[u.Id] = &u
|
||||
// return u.Id
|
||||
//}
|
||||
//
|
||||
import (
|
||||
"github.com/deluan/gosonic/models"
|
||||
"fmt"
|
||||
"crypto/md5"
|
||||
)
|
||||
|
||||
type MediaFile struct {
|
||||
BaseRepository
|
||||
}
|
||||
|
||||
func NewMediaFileRepository() *MediaFile {
|
||||
r := &MediaFile{}
|
||||
r.col = createCollection("MediaFiles")
|
||||
return r
|
||||
}
|
||||
|
||||
func (r *MediaFile) Add(m *models.MediaFile) error {
|
||||
if m.Id == "" {
|
||||
m.Id = fmt.Sprintf("%x", md5.Sum([]byte(m.Path)))
|
||||
}
|
||||
return r.saveOrUpdate(m)
|
||||
}
|
||||
@@ -5,9 +5,14 @@ import (
|
||||
"github.com/astaxie/beego"
|
||||
)
|
||||
|
||||
type MediaFolderRepository struct {}
|
||||
type MediaFolder struct {}
|
||||
|
||||
func (*MediaFolderRepository) GetAll() ([]*models.MediaFolder, error) {
|
||||
func NewMediaFolderRepository() *MediaFolder {
|
||||
return &MediaFolder{}
|
||||
}
|
||||
|
||||
|
||||
func (*MediaFolder) GetAll() ([]*models.MediaFolder, error) {
|
||||
mediaFolder := models.MediaFolder{Id: "0", Name: "iTunes Library", Path: beego.AppConfig.String("musicFolder")}
|
||||
result := make([]*models.MediaFolder, 1)
|
||||
result[0] = &mediaFolder
|
||||
|
||||
Reference in New Issue
Block a user