Skip to content

Commit

Permalink
refactor: update the service to improve the test coverage && support …
Browse files Browse the repository at this point in the history
…delete the folder && support i18n #7 #8 #12
  • Loading branch information
saltbo committed Sep 20, 2020
1 parent a1e687e commit 5cea121
Show file tree
Hide file tree
Showing 15 changed files with 662 additions and 428 deletions.
2 changes: 1 addition & 1 deletion assets/statik.go

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion cmd/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func serverRun(conf *config.Config) {
ginutil.SetupResource(apiRouter,
rest.NewUserResource(),
rest.NewFileResource(conf.Provider),
rest.NewFolderResource(conf.Provider),
rest.NewFolderResource(),
rest.NewShareResource(),
)

Expand Down
31 changes: 31 additions & 0 deletions disk/mock.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package disk

import (
"fmt"
"net/http"
)

type MockProvider struct {
}

func (m MockProvider) SignedPutURL(key, filetype string, public bool) (url string, headers http.Header, err error) {
headers = make(http.Header)
headers.Add("", "")
return fmt.Sprintf("http://dl.test.com/%s", key), headers, nil
}

func (m MockProvider) SignedGetURL(key, filename string) (url string, err error) {
return fmt.Sprintf("http://dl.test.com/%s", key), nil
}

func (m MockProvider) PublicURL(key string) (url string) {
return fmt.Sprintf("http://dl.test.com/%s", key)
}

func (m MockProvider) ObjectDelete(key string) error {
return nil
}

func (m MockProvider) ObjectsDelete(keys []string) error {
return nil
}
8 changes: 8 additions & 0 deletions fakefs/ffs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package fakefs

import "github.com/saltbo/zpan/service"

type FakeFS struct {
service.Folder
service.File
}
6 changes: 6 additions & 0 deletions model/matter.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ func (Matter) TableName() string {

func (m *Matter) Clone() *Matter {
clone := *m
clone.Id = 0
clone.Alias = strutil.RandomText(16)
return &clone
}

Expand All @@ -61,6 +63,10 @@ func (m *Matter) Public() bool {
return m.ACL == AclPublic
}

func (m *Matter) UserAccessible(uid int64) bool {
return m.Uid == uid
}

func (m *Matter) SetURL(fc func(object string) string) {
if m.Public() {
m.URL = fc(m.Object)
Expand Down
190 changes: 34 additions & 156 deletions rest/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,18 @@ package rest
import (
"fmt"
"log"
"path/filepath"
"strings"
"time"

"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
"github.com/saltbo/gopkg/ginutil"
"github.com/saltbo/gopkg/gormutil"
"github.com/saltbo/gopkg/timeutil"

"github.com/saltbo/zpan/disk"
"github.com/saltbo/zpan/rest/bind"
"github.com/saltbo/zpan/service"
)

type FileResource struct {
provider disk.Provider
fs *service.File
folder *service.Folder
}

func NewFileResource(conf disk.Config) ginutil.Resource {
Expand All @@ -29,7 +24,7 @@ func NewFileResource(conf disk.Config) ginutil.Resource {
}

return &FileResource{
provider: provider,
fs: service.NewFile(provider),
}
}

Expand All @@ -51,25 +46,20 @@ func (rs *FileResource) findAll(c *gin.Context) {
return
}

sm := service.NewMatter(userIdGet(c))
mq := service.NewMatterQuery(userIdGet(c))
if p.Type != "" {
sm.SetType(p.Type)
mq.SetType(p.Type)
} else if p.Keyword != "" {
sm.SetKeyword(p.Keyword)
mq.SetKeyword(p.Keyword)
} else {
sm.SetDir(p.Dir)
mq.SetDir(p.Dir)
}
list, total, err := sm.Find(p.Offset, p.Limit)
list, total, err := rs.fs.FindAll(mq, p.Offset, p.Limit)
if err != nil {
ginutil.JSONServerError(c, err)
return
}

// inject the url for the public object
for idx := range list {
list[idx].SetURL(rs.provider.PublicURL)
}

ginutil.JSONList(c, list, total)
}

Expand All @@ -86,90 +76,44 @@ func (rs *FileResource) create(c *gin.Context) {
return
}

if !service.MatterParentExist(user.Id, p.Dir) {
ginutil.JSONBadRequest(c, fmt.Errorf("parent dir not exist"))
return
}

// check current dir file quota
if service.MatterOverflowed(user.Id, p.Dir) {
ginutil.JSONBadRequest(c, fmt.Errorf("dir file quota is not enough"))
return
}

// auto append a suffix if matter exist
if service.MatterExist(user.Id, p.Name, p.Dir) {
ext := filepath.Ext(p.Name)
name := strings.TrimSuffix(p.Name, ext)
suffix := fmt.Sprintf("_%s", timeutil.Format(time.Now(), "YYYYMMDD_HHmmss"))
p.Name = name + suffix + ext
}

matter := p.ToMatter(user.Id)
link, headers, err := rs.provider.SignedPutURL(matter.Object, p.Type, p.Public)
link, headers, err := rs.fs.PreSignPutURL(matter)
if err != nil {
ginutil.JSONServerError(c, err)
return
}

fc := func(tx *gorm.DB) error {
if err := tx.Create(matter).Error; err != nil {
return err
}

// update the service
expr := gorm.Expr("storage_used+?", p.Size)
if err := tx.Model(user).Update("storage_used", expr).Error; err != nil {
return err
}

return nil
}
if err := gormutil.DB().Transaction(fc); err != nil {
ginutil.JSONServerError(c, err)
return
}

ginutil.JSONData(c, gin.H{
"alias": matter.Alias,
"link": link,
"object": matter.Object,
"link": link,
"headers": headers,
})
}

func (rs *FileResource) find(c *gin.Context) {
file, err := service.FileGet(c.Param("alias"))
if err != nil {
ginutil.JSONBadRequest(c, err)
return
}

link, err := rs.provider.SignedGetURL(file.Object, file.Name)
func (rs *FileResource) uploaded(c *gin.Context) {
uid := userIdGet(c)
alias := c.Param("alias")
m, err := rs.fs.UploadDone(uid, alias)
if err != nil {
ginutil.JSONServerError(c, err)
return
}

ginutil.JSONData(c, gin.H{
"link": link,
})
ginutil.JSONData(c, m)
}

func (rs *FileResource) uploaded(c *gin.Context) {
file, err := service.UserFileGet(userIdGet(c), c.Param("alias"))
func (rs *FileResource) find(c *gin.Context) {
alias := c.Param("alias")
link, err := rs.fs.PreSignGetURL(alias)
if err != nil {
ginutil.JSONBadRequest(c, err)
return
}

if err = service.FileUploaded(file); err != nil {
ginutil.JSONServerError(c, err)
return
}

file.SetURL(rs.provider.PublicURL)
ginutil.JSONData(c, file)
ginutil.JSONData(c, gin.H{
"link": link,
})
}

func (rs *FileResource) rename(c *gin.Context) {
Expand All @@ -179,18 +123,9 @@ func (rs *FileResource) rename(c *gin.Context) {
return
}

file, err := service.UserFileGet(userIdGet(c), c.Param("alias"))
if err != nil {
ginutil.JSONBadRequest(c, err)
return
}

if file.IsDir() {
ginutil.JSONBadRequest(c, fmt.Errorf("not support rename the dir"))
return
}

if err = service.FileRename(file, p.NewName); err != nil {
uid := userIdGet(c)
alias := c.Param("alias")
if err := rs.fs.Rename(uid, alias, p.NewName); err != nil {
ginutil.JSONServerError(c, err)
return
}
Expand All @@ -204,36 +139,14 @@ func (rs *FileResource) move(c *gin.Context) {
ginutil.JSONBadRequest(c, err)
return
}
uid := userIdGet(c)
file, err := service.UserFileGet(uid, c.Param("alias"))
if err != nil {
ginutil.JSONBadRequest(c, err)
return
}
//resolve issue #4
if ok, err := service.CanMove(uid, p.NewDir, file); !ok {
ginutil.JSONBadRequest(c, err)
return
}

// check current dir file quota
if service.MatterOverflowed(file.Uid, p.NewDir) {
ginutil.JSONBadRequest(c, fmt.Errorf("dir file quota is not enough"))
uid := userIdGet(c)
alias := c.Param("alias")
if err := rs.fs.Move(uid, alias, p.NewDir); err != nil {
ginutil.JSONServerError(c, err)
return
}

if file.IsDir() {
if err = service.FolderMove(file, p.NewDir); err != nil {
ginutil.JSONServerError(c, err)
return
}
} else {
if err = service.FileMove(file, p.NewDir); err != nil {
ginutil.JSONServerError(c, err)
return
}
}

ginutil.JSON(c)
}

Expand All @@ -244,19 +157,9 @@ func (rs *FileResource) copy(c *gin.Context) {
return
}

file, err := service.UserFileGet(userIdGet(c), c.Param("alias"))
if err != nil {
ginutil.JSONBadRequest(c, err)
return
}

// check current dir file quota
if service.MatterOverflowed(file.Uid, p.NewPath) {
ginutil.JSONBadRequest(c, fmt.Errorf("dir file quota is not enough"))
return
}

if err = service.FileCopy(file, p.NewPath); err != nil {
uid := userIdGet(c)
alias := c.Param("alias")
if err := rs.fs.Copy(uid, alias, p.NewPath); err != nil {
ginutil.JSONServerError(c, err)
return
}
Expand All @@ -265,34 +168,9 @@ func (rs *FileResource) copy(c *gin.Context) {
}

func (rs *FileResource) delete(c *gin.Context) {
user := userGet(c)
file, err := service.UserFileGet(user.Id, c.Param("alias"))
if err != nil {
ginutil.JSONBadRequest(c, err)
return
}

if err := rs.provider.ObjectDelete(file.Object); err != nil {
ginutil.JSONServerError(c, err)
return
}

fc := func(tx *gorm.DB) error {
// delete for the list
if err := tx.Delete(file).Error; err != nil {
return err
}

// update the user storage
expr := gorm.Expr("storage_used-?", file.Size)
if err := tx.Model(user).Update("storage_used", expr).Error; err != nil {
return err
}

return nil
}

if err := gormutil.DB().Transaction(fc); err != nil {
uid := userIdGet(c)
alias := c.Param("alias")
if err := rs.fs.Delete(uid, alias); err != nil {
ginutil.JSONServerError(c, err)
return
}
Expand Down

0 comments on commit 5cea121

Please sign in to comment.