diff --git a/api.go b/api.go index 10b9436..4f4e481 100644 --- a/api.go +++ b/api.go @@ -2,6 +2,7 @@ package main import ( "git.sp4ke.com/sp4ke/bit4sat-server.git/storage" + "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" ) @@ -27,7 +28,10 @@ func (api *API) Run() { } func NewAPI() *API { + router := gin.Default() + router.Use(cors.Default()) + return &API{ - router: gin.Default(), + router: router, } } diff --git a/go.mod b/go.mod index 8a03d72..70d6b79 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module git.sp4ke.com/sp4ke/bit4sat-server.git go 1.12 require ( + github.com/gin-contrib/cors v0.0.0-20190301062745-f9e10995c85a github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 // indirect github.com/gin-gonic/gin v1.3.0 github.com/golang/protobuf v1.3.1 // indirect @@ -11,6 +12,4 @@ require ( github.com/mattn/go-sqlite3 v1.10.0 github.com/segmentio/ksuid v1.0.2 github.com/ugorji/go/codec v0.0.0-20190315113641-a70535d8491c // indirect - gopkg.in/go-playground/validator.v8 v8.18.2 // indirect - gopkg.in/yaml.v2 v2.2.2 // indirect ) diff --git a/go.sum b/go.sum index a12183a..efed9ac 100644 --- a/go.sum +++ b/go.sum @@ -1,27 +1,43 @@ +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gin-contrib/cors v0.0.0-20190301062745-f9e10995c85a h1:zBycVvXa03SIX+jdMv8wGu9TMDMWdN8EhaR1FoeKHNo= +github.com/gin-contrib/cors v0.0.0-20190301062745-f9e10995c85a/go.mod h1:pL2kNE+DgDU+eQ+dary5bX0Z6LPP8nR6Mqs1iejILw4= +github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 h1:t8FVkw33L+wilf2QiWkw0UV77qRpcH/JHPKGpKa2E8g= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-gonic/gin v1.3.0 h1:kCmZyPklC0gVdL728E6Aj20uYBJV93nj/TkwBTKhFbs= github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/segmentio/ksuid v1.0.2 h1:9yBfKyw4ECGTdALaF09Snw3sLJmYIX6AbPJrAy6MrDc= github.com/segmentio/ksuid v1.0.2/go.mod h1:BXuJDr2byAiHuQaQtSKoXh1J0YmUDurywOXgB2w+OSU= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/ugorji/go v1.1.2 h1:JON3E2/GPW2iDNGoSAusl1KDf5TRQ8k8q7Tp097pZGs= github.com/ugorji/go v1.1.2/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= +github.com/ugorji/go/codec v0.0.0-20181209151446-772ced7fd4c2/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v0.0.0-20190315113641-a70535d8491c h1:20Yyqg0mvFOyG3m7ejVqHEa03CBa3hTttx9jiYLkjYU= github.com/ugorji/go/codec v0.0.0-20190315113641-a70535d8491c/go.mod h1:iT03XoTwV7xq/+UGwKO3UbC1nNNlopQiY61beSdrtOA= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= diff --git a/storage/upload_ctrl.go b/storage/upload_ctrl.go index 0504799..f70c05e 100644 --- a/storage/upload_ctrl.go +++ b/storage/upload_ctrl.go @@ -4,6 +4,7 @@ import ( "fmt" "net/http" + "git.sp4ke.com/sp4ke/bit4sat-server.git/utils" "github.com/gin-gonic/gin" "github.com/segmentio/ksuid" ) @@ -12,7 +13,6 @@ type UploadCtrl struct{} func (ctrl UploadCtrl) New(c *gin.Context) { uploadForm := UploadForm{} - up := &Upload{} if err := c.ShouldBindJSON(&uploadForm); err != nil { c.JSON(http.StatusNotAcceptable, gin.H{ @@ -23,28 +23,36 @@ func (ctrl UploadCtrl) New(c *gin.Context) { return } - fmt.Println(uploadForm) - // Create unique id id := ksuid.New() - up.ID = id.String() - // Save new upload - err := up.Write() - if err != nil { - c.JSON(http.StatusInternalServerError, gin.H{ - "status": http.StatusInternalServerError, - "error": "could not start new upload", - "msg": err.Error(), - }) - c.Abort() - return + for _, file := range uploadForm.Files { + up := &Upload{} + up.ID = id.String() + + up.FileName, up.FileExt = utils.CleanFileName(file.Name) + + up.FileSize = file.Size + up.FileType = file.Type + up.SHA256 = file.SHA256 + up.Status = UpNew + + err := up.Write() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "status": http.StatusInternalServerError, + "error": "could not start new upload", + "msg": err.Error(), + }) + c.Abort() + return + } } c.JSON(http.StatusOK, gin.H{ "status": http.StatusOK, "result": gin.H{ - "id": up.ID, + "id": id, }, }) } diff --git a/storage/upload_model.go b/storage/upload_model.go index ed5a1e7..4adf713 100644 --- a/storage/upload_model.go +++ b/storage/upload_model.go @@ -14,13 +14,19 @@ const ( DBUploadSchema = ` CREATE TABLE IF NOT EXISTS "upload" ( upload_id TEXT NOT NULL, - path TEXT DEFAULT '', - status INTEGER DEFAULT 0, - PRIMARY KEY("upload_id") + sha256 TEXT NOT NULL, + file_name TEXT NOT NULL, + file_type TEXT DEFAULT '', + file_size INTEGER NOT NULL, + file_ext TEXT DEFAULT '', + status INTEGER DEFAULT 0 ); ` - QNewUpload = `INSERT INTO upload (upload_id) VALUES (:upload_id)` + QNewUpload = `INSERT INTO upload + (upload_id, sha256, file_name, file_type, file_size, file_ext, status) + VALUES + (:upload_id, :sha256, :file_name, :file_type, :file_size, :file_ext, :status)` ) const ( @@ -35,8 +41,13 @@ var ( ) type Upload struct { - ID string `db:"upload_id"` - Path string + ID string `db:"upload_id"` + SHA256 string `db:"sha256"` + FileName string `db:"file_name"` + FileType string `db:"file_type"` + FileSize int64 `db:"file_size"` + FileExt string `db:"file_ext"` + Status int `db:"status"` } func (u *Upload) Write() error { diff --git a/utils/paths.go b/utils/paths.go index 0fe8f2f..c725682 100644 --- a/utils/paths.go +++ b/utils/paths.go @@ -1,8 +1,10 @@ package utils import ( + "fmt" "os" "path/filepath" + "strings" ) const ( @@ -14,3 +16,15 @@ func Mkdir(path ...string) error { return os.MkdirAll(joined, MkdirMode) } + +func CleanFileName(path string) (name string, ext string) { + + base := filepath.Base(path) + ext = filepath.Ext(base) + fmt.Println(ext) + if len(ext) > 0 { + name = strings.Split(base, ".")[0] + } + + return +}