diff --git a/.github/workflows/dev.yaml b/.github/workflows/dev.yaml deleted file mode 100644 index 94e235d..0000000 --- a/.github/workflows/dev.yaml +++ /dev/null @@ -1,37 +0,0 @@ -name: Docker Image CI - -on: - push: - branches: ["main"] - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push with Buildx - uses: docker/build-push-action@v4 - with: - context: . - file: ./Dockerfile - platforms: linux/arm64, linux/amd64 - push: true - tags: ${{ secrets.DOCKERHUB_USERNAME }}/tempfiles-backend:latest-dev diff --git a/.github/workflows/ghr-image-bp.yml b/.github/workflows/ghr-image-bp.yml new file mode 100644 index 0000000..fdff76e --- /dev/null +++ b/.github/workflows/ghr-image-bp.yml @@ -0,0 +1,46 @@ +name: BUILD and PUSH to GHR + +on: + workflow_dispatch: + push: + branches: ["main"] + +env: + REGISTRY: ghcr.io + REGISTRY_IMAGE: ghcr.io/${{ github.repository }} + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push with Buildx + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + platforms: linux/arm64, linux/amd64 + push: true + tags: ${{ env.REGISTRY_IMAGE }}:${{ github.head_ref }}, ${{ env.REGISTRY_IMAGE }}:${{ github.sha }} + cache-from: type=gha + cache-to: type=gha,mode=min diff --git a/.github/workflows/production.yaml b/.github/workflows/production.yaml deleted file mode 100644 index 9114fab..0000000 --- a/.github/workflows/production.yaml +++ /dev/null @@ -1,37 +0,0 @@ -name: Docker Image CI - -on: - push: - branches: ["production"] - workflow_dispatch: - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push with Buildx - uses: docker/build-push-action@v4 - with: - context: . - file: ./Dockerfile - platforms: linux/arm64, linux/amd64 - push: true - tags: ${{ secrets.DOCKERHUB_USERNAME }}/tempfiles-backend:latest diff --git a/Dockerfile b/Dockerfile index 9f650d0..abffedf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,19 +1,22 @@ # Step 1: Modules caching -FROM golang:1.19.4-alpine as modules +FROM --platform=$BUILDPLATFORM golang:1.19.4-alpine as modules COPY go.mod go.sum /modules/ WORKDIR /modules RUN go mod download # Step 2: Builder -FROM golang:1.19.4-alpine AS builder +FROM --platform=$BUILDPLATFORM golang:1.19.4-alpine AS builder COPY --from=modules /go/pkg /go/pkg COPY . /app ENV CGO_ENABLED=0 WORKDIR /app -RUN go build -o /bin/app . +ARG TARGETOS TARGETARCH +ENV CGO_ENABLED=0 +RUN GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /app/server . # GOPATH for scratch images is / FROM scratch -COPY --from=builder /bin/app /app +WORKDIR /app +COPY --from=builder /app/server /app/server EXPOSE 5000 -CMD ["/app"] \ No newline at end of file +CMD ./server \ No newline at end of file diff --git a/controllers/files.go b/controllers/files.go new file mode 100644 index 0000000..1a8c3e9 --- /dev/null +++ b/controllers/files.go @@ -0,0 +1,357 @@ +package controller + +import ( + "fmt" + "log" + "net/http" + "net/url" + "os" + "strconv" + "strings" + "time" + + "github.com/go-fuego/fuego" + "github.com/tempfiles-Team/tempfiles-backend/database" + "github.com/tempfiles-Team/tempfiles-backend/utils" +) + +type FilesRessources struct { + // TODO add ressources + FilesService RealFilesService +} + +type Files struct { + Data interface{} `json:"data"` + Error string `json:"error"` + Message string `json:"message"` +} + +type FilesCreate struct { + Message string `json:"message"` +} + +func (rs FilesRessources) Routes(s *fuego.Server) { + filesGroup := fuego.Group(s, "/files") + + fuego.Get(filesGroup, "/", rs.getAllFiles) + fuego.Post(filesGroup, "/", rs.postFiles) + + fuego.GetStd(filesGroup, "/{id}/{name}", rs.downloadFile) + fuego.Get(filesGroup, "/{id}", rs.getFiles) + fuego.Delete(filesGroup, "/{id}", rs.deleteFiles) +} + +func (rs FilesRessources) getAllFiles(c fuego.ContextNoBody) (Files, error) { + return rs.FilesService.GetAllFiles() +} + +func (rs FilesRessources) postFiles(c *fuego.ContextWithBody[any]) (Files, error) { + + return rs.FilesService.CreateFiles(c) +} + +func (rs FilesRessources) getFiles(c fuego.ContextNoBody) (Files, error) { + return rs.FilesService.GetFiles(c.PathParam("id")) +} + +func (rs FilesRessources) deleteFiles(c *fuego.ContextNoBody) (Files, error) { + return rs.FilesService.DeleteFiles(c.PathParam("id")) +} + +func (rs FilesRessources) downloadFile(w http.ResponseWriter, r *http.Request) { + id := r.PathValue("id") + name := r.PathValue("name") + + path, err := rs.FilesService.DownloadFile(id, name) + + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + w.Header().Set("Content-Disposition", "attachment; filename="+strings.ReplaceAll(url.PathEscape(name), "+", "%20")) + http.ServeFile(w, r, path) +} + +type FilesService interface { + GetFiles(id string) (Files, error) + CreateFiles(FilesCreate) (Files, error) + GetAllFiles() ([]Files, error) + DeleteFiles(id string) (any, error) + DownloadFile(id string, name string) (Files, error) +} + +type RealFilesService struct { + FilesService +} + +func (s RealFilesService) GetFiles(id string) (Files, error) { + + FileTracking := database.FileTracking{ + FolderId: id, + } + + has, err := database.Engine.Get(&FileTracking) + + if err != nil { + return Files{ + Message: "db query error", + }, err + } + + if !has { + return Files{ + Message: "file not found", + }, nil + } + + // scheme := "http" + // if c.Request.TLS != nil || c.Request.Header.Get("X-Forwarded-Proto") == "https" { + // scheme = "https" + // } + + // baseUrl := scheme + "://" + c.Request.Host + + if files, err := utils.GetFiles(FileTracking.FolderId); err != nil { + return Files{ + Message: "folder not found", + }, nil + } else { + log.Println("✨ File found: ", FileTracking.FolderId) + return Files{ + Data: files, + Message: "file found", + }, nil + } +} + +func (s RealFilesService) DownloadFile(id string, name string) (path string, error error) { + + FileTracking := database.FileTracking{ + FolderId: id, + } + + has, err := database.Engine.Get(&FileTracking) + + if err != nil { + return "", err + } + + if !has { + return "", fmt.Errorf("folder not found") + } + + if !utils.CheckIsFileExist(FileTracking.FolderId, name) { + return "", fmt.Errorf("file not found") + } + + // db DownloadCount +1 + FileTracking.DownloadCount++ + if _, err := database.Engine.ID(FileTracking.Id).Update(&FileTracking); err != nil { + + return "", err + } + + if FileTracking.DownloadLimit != 0 && FileTracking.DownloadCount >= FileTracking.DownloadLimit { + + FileTracking.IsDeleted = true + + log.Printf("πŸ—‘οΈ Set this folder for deletion: %s \n", FileTracking.FolderId) + if _, err := database.Engine.ID(FileTracking.Id).Cols("Is_deleted").Update(&FileTracking); err != nil { + + return "", err + } + } + + log.Printf("πŸ“₯️ Successfully downloaded %s, %s\n", FileTracking.FolderId, name) + + return "tmp/" + FileTracking.FolderId + "/" + name, nil +} + +func (s RealFilesService) CreateFiles(c *fuego.ContextWithBody[any]) (Files, error) { + + err := c.Request().ParseMultipartForm(10 << 20) // limit file size to 10MB + if err != nil { + return Files{ + Message: fmt.Sprintf("Error parsing file: %v", err), + }, nil + } + + isHidden, err := strconv.ParseBool(c.Header("X-Hidden")) + if err != nil { + isHidden = false + } + + downloadLimit, err := strconv.Atoi(c.Header("X-Download-Limit")) + if err != nil { + downloadLimit = 100 + } + expireTime, err := strconv.Atoi(c.Header("X-Time-Limit")) + + var expireTimeDate time.Time + + if err != nil || expireTime <= 0 { + expireTimeDate = time.Now().Add(time.Duration(60*3) * time.Minute) + } else { + expireTimeDate = time.Now().Add(time.Duration(expireTime) * time.Minute) + } + + // Multipart File And Header + MFAHASH, err := utils.FormFiles(c.Request(), "file") + if err != nil { + return Files{ + Message: fmt.Sprintf("Please send the file using the β€œfile” field in multipart/form-data.: %v", err), + }, nil + } + + FolderHash, err := utils.GenIdFormMulitpart(MFAHASH) + if err != nil { + return Files{ + Message: fmt.Sprintf("folder id generation error: %v", err), + }, nil + } + + isExist, err := database.Engine.Exist(&database.FileTracking{FolderHash: FolderHash}) + + if err != nil { + return Files{ + Error: err.Error(), + Message: fmt.Sprintf("database exist error: %v", err), + }, nil + } + + if isExist { + FileTracking := database.FileTracking{ + FolderHash: FolderHash, + } + _, err := database.Engine.Get(&FileTracking) + if err != nil { + + return Files{ + Error: err.Error(), + Message: fmt.Sprintf("database get error: %v", err), + }, nil + } + + return Files{ + Data: FileTracking, + Message: fmt.Sprintf("File %s already exists", FileTracking.FolderHash), + }, nil + } + + MFAH, err := utils.FormFiles(c.Request(), "file") + if err != nil { + return Files{ + Message: fmt.Sprintf("Please send the file using the β€œfile” field in multipart/form-data.: %v", err), + }, nil + } + + FileTracking := &database.FileTracking{ + FileCount: len(MFAH), + FolderId: FolderHash[:5], + IsHidden: isHidden, + FolderHash: FolderHash, + UploadDate: time.Now(), + DownloadLimit: int64(downloadLimit), + ExpireTime: expireTimeDate, + } + + if utils.CheckFileFolder(FileTracking.FolderId) != nil { + + return Files{ + Error: err.Error(), + Message: fmt.Sprintf("file folder duplication error: %v", err), + }, nil + + } + + for _, file := range MFAH { + + if err := utils.SaveFile(FileTracking.FolderId, file.Header.Filename, file.File); err != nil { + + return Files{ + Error: err.Error(), + Message: fmt.Sprintf("file save error: %v", err), + }, nil + } + } + + _, err = database.Engine.Insert(FileTracking) + if err != nil { + + return Files{ + Error: err.Error(), + Message: fmt.Sprintf("database insert error: %v", err), + }, nil + } + + log.Printf("πŸ₯° Successfully uploaded %s, %d files\n", FileTracking.FolderId, FileTracking.FileCount) + + return Files{ + Data: FileTracking, + Message: fmt.Sprintf("File %s uploaded successfully", FileTracking.FolderHash), + }, nil + +} + +func (s RealFilesService) GetAllFiles() (Files, error) { + // TODO implement + + var files []database.FileTracking + + if err := database.Engine.Where("is_deleted = ? AND is_hidden = ?", false, false).Find(&files); err != nil { + return Files{ + Message: "db query error", + Error: err.Error(), + }, nil + } + + return Files{ + Data: files, + Message: "File list successfully", + }, nil +} + +func (s RealFilesService) DeleteFiles(id string) (Files, error) { + FileTracking := database.FileTracking{ + FolderId: id, + } + + has, err := database.Engine.Get(&FileTracking) + + if err != nil { + return Files{ + Message: "db query error", + Error: err.Error(), + }, nil + } + + if !has { + return Files{ + Message: "file not found", + Error: "true", + }, nil + } + + if err := os.RemoveAll("tmp/" + FileTracking.FolderId); err != nil { + + return Files{ + Message: "file delete error", + Error: err.Error(), + }, nil + } + + if _, err := database.Engine.Delete(&FileTracking); err != nil { + + return Files{ + Message: "db delete error", + Error: err.Error(), + }, nil + } + + log.Printf("πŸ—‘οΈ Delete this folder: %s\n", FileTracking.FolderId) + + return Files{ + Message: "File deleted successfully", + }, nil +} diff --git a/doc/openapi.json b/doc/openapi.json new file mode 100644 index 0000000..3131ea5 --- /dev/null +++ b/doc/openapi.json @@ -0,0 +1 @@ +{"components":{"schemas":{"Files":{"properties":{"data":{},"error":{"type":"string"},"message":{"type":"string"}},"type":"object"},"unknown-interface":{}}},"info":{"description":"OpenAPI","title":"OpenAPI","version":"0.0.1"},"openapi":"3.0.3","paths":{"/files/":{"get":{"description":"controller: github.com/tempfiles-Team/tempfiles-backend/controllers.FilesRessources.getAllFiles","operationId":"GET /files/:getAllFiles","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Files"}}},"description":"OK"},"default":{"description":""}},"summary":"getAllFiles","tags":["Files"]},"post":{"description":"controller: github.com/tempfiles-Team/tempfiles-backend/controllers.FilesRessources.postFiles","operationId":"POST /files/:postFiles","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Files"}}},"description":"OK"},"default":{"description":""}},"summary":"postFiles","tags":["Files"]}},"/files/{id}":{"delete":{"description":"controller: github.com/tempfiles-Team/tempfiles-backend/controllers.FilesRessources.deleteFiles","operationId":"DELETE /files/{id}:deleteFiles","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Files"}}},"description":"OK"},"default":{"description":""}},"summary":"deleteFiles","tags":["Files"]},"get":{"description":"controller: github.com/tempfiles-Team/tempfiles-backend/controllers.FilesRessources.getFiles","operationId":"GET /files/{id}:getFiles","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Files"}}},"description":"OK"},"default":{"description":""}},"summary":"getFiles","tags":["Files"]}},"/files/{id}/{name}":{"get":{"description":"controller: github.com/tempfiles-Team/tempfiles-backend/controllers.FilesRessources.downloadFile","operationId":"GET /files/{id}/{name}:downloadFile","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/unknown-interface"}}},"description":"OK"},"default":{"description":""}},"summary":"downloadFile"}}}} \ No newline at end of file diff --git a/file/delete.go b/file/delete.go deleted file mode 100644 index 30597c9..0000000 --- a/file/delete.go +++ /dev/null @@ -1,69 +0,0 @@ -package file - -import ( - "log" - "os" - - "github.com/gin-gonic/gin" - "github.com/tempfiles-Team/tempfiles-backend/database" -) - -func DeleteHandler(c *gin.Context) { - id := c.Param("id") - - if id == "" { - c.JSON(400, gin.H{ - "message": "Please provide a file id", - "error": nil, - "delete": false, - }) - return - } - - FileTracking := database.FileTracking{ - FolderId: id, - } - - has, err := database.Engine.Get(&FileTracking) - - if err != nil { - c.JSON(500, gin.H{ - "message": "db query error", - "error": err.Error(), - }) - return - } - - if !has { - c.JSON(404, gin.H{ - "message": "file not found", - "error": nil, - }) - return - } - - if err := os.RemoveAll("tmp/" + FileTracking.FolderId); err != nil { - c.JSON(500, gin.H{ - "message": "file delete error", - "error": err.Error(), - "delete": false, - }) - } - - if _, err := database.Engine.Delete(&FileTracking); err != nil { - c.JSON(500, gin.H{ - "message": "db delete error", - "error": err.Error(), - "delete": false, - }) - return - } - - log.Printf("πŸ—‘οΈ Delete this folder: %s\n", FileTracking.FolderId) - - c.JSON(200, gin.H{ - "message": "File deleted successfully", - "error": nil, - "delete": true, - }) -} diff --git a/file/download.go b/file/download.go deleted file mode 100644 index fabc5ca..0000000 --- a/file/download.go +++ /dev/null @@ -1,90 +0,0 @@ -package file - -import ( - "log" - "net/url" - "strings" - - "github.com/gin-gonic/gin" - "github.com/tempfiles-Team/tempfiles-backend/database" -) - -func DownloadHandler(c *gin.Context) { - id := c.Param("id") - name, err := url.PathUnescape(c.Param("name")) - if err != nil { - c.JSON(400, gin.H{ - "message": "invalid file name", - "error": err.Error(), - }) - return - } - - if id == "" { - c.JSON(400, gin.H{ - "message": "Please provide a file id", - "error": nil, - "download": false, - }) - return - } - - FileTracking := database.FileTracking{ - FolderId: id, - } - - has, err := database.Engine.Get(&FileTracking) - - if err != nil { - c.JSON(500, gin.H{ - "message": "db query error", - "error": err.Error(), - }) - return - } - - if !has { - c.JSON(404, gin.H{ - "message": "folder not found", - "error": nil, - }) - return - } - - if !CheckIsFileExist(FileTracking.FolderId, name) { - c.JSON(404, gin.H{ - "message": "file not found!!", - "error": nil, - }) - return - } - - // db DownloadCount +1 - FileTracking.DownloadCount++ - if _, err := database.Engine.ID(FileTracking.Id).Update(&FileTracking); err != nil { - c.JSON(500, gin.H{ - "message": "db update error", - "error": err.Error(), - }) - return - } - - if FileTracking.DownloadLimit != 0 && FileTracking.DownloadCount >= FileTracking.DownloadLimit { - - FileTracking.IsDeleted = true - - log.Printf("πŸ—‘οΈ Set this folder for deletion: %s \n", FileTracking.FolderId) - if _, err := database.Engine.ID(FileTracking.Id).Cols("Is_deleted").Update(&FileTracking); err != nil { - c.JSON(500, gin.H{ - "message": "db update error", - "error": err.Error(), - }) - return - } - } - - log.Printf("πŸ“₯️ Successfully downloaded %s, %s\n", FileTracking.FolderId, name) - - c.Header("Content-Disposition", "attachment; filename="+strings.ReplaceAll(url.PathEscape(name), "+", "%20")) - c.File("tmp/" + FileTracking.FolderId + "/" + name) -} diff --git a/file/dto.go b/file/dto.go deleted file mode 100644 index 78b4762..0000000 --- a/file/dto.go +++ /dev/null @@ -1,26 +0,0 @@ -package file - -import ( - "github.com/tempfiles-Team/tempfiles-backend/database" -) - -type FileListResponse struct { - FileName string `json:"fileName"` - FileSize int64 `json:"fileSize"` - DownloadUrl string `json:"downloadUrl"` -} - -type FileResponse struct { - database.FileTracking - DeleteUrl string `json:"deleteUrl"` - Files []FileListResponse `json:"files"` -} - -func (f *FileResponse) NewFileResponse(fileTracking database.FileTracking, files []FileListResponse, message, baseUrl string) *FileResponse { - - f.DeleteUrl = baseUrl + "/del/" + fileTracking.FolderId - f.FileTracking = fileTracking - f.Files = files - return f - -} diff --git a/file/file.go b/file/file.go deleted file mode 100644 index 8fea15e..0000000 --- a/file/file.go +++ /dev/null @@ -1,60 +0,0 @@ -package file - -import ( - "log" - - "github.com/gin-gonic/gin" - "github.com/tempfiles-Team/tempfiles-backend/database" -) - -func FileHandler(c *gin.Context) { - id := c.Param("id") - - if id == "" { - c.JSON(400, gin.H{ - "message": "Please provide a file id", - "error": nil, - }) - return - } - - FileTracking := database.FileTracking{ - FolderId: id, - } - - has, err := database.Engine.Get(&FileTracking) - - if err != nil { - c.JSON(500, gin.H{ - "message": "db query error", - "error": err.Error(), - }) - return - } - - if !has { - c.JSON(404, gin.H{ - "message": "file not found", - "error": nil, - }) - return - } - - scheme := "http" - if c.Request.TLS != nil || c.Request.Header.Get("X-Forwarded-Proto") == "https" { - scheme = "https" - } - - baseUrl := scheme + "://" + c.Request.Host - - if files, err := GetFiles(FileTracking.FolderId, baseUrl); err != nil { - c.JSON(500, gin.H{ - "message": "folder not found", - "error": nil, - }) - return - } else { - log.Println("✨ File found: ", FileTracking.FolderId) - c.JSON(200, new(FileResponse).NewFileResponse(FileTracking, files, "file found", baseUrl)) - } -} diff --git a/file/id_generator.go b/file/id_generator.go deleted file mode 100644 index de772c3..0000000 --- a/file/id_generator.go +++ /dev/null @@ -1,39 +0,0 @@ -package file - -import ( - "bytes" - "crypto/sha1" - "encoding/base64" - "mime/multipart" - "sort" -) - -func GenerateFolderId(files []*multipart.FileHeader) (string, error) { - - sort.Slice(files, func(i, j int) bool { - return files[i].Filename < files[j].Filename - }) - - var hashes [][]byte - - for _, file := range files { - fileData, err := file.Open() - if err != nil { - return "", err - } - defer fileData.Close() - - buf := new(bytes.Buffer) - buf.ReadFrom(fileData) - fileBytes := buf.Bytes() - - nameHash := sha1.Sum([]byte(file.Filename)) - hashes = append(hashes, nameHash[:]) - fileHash := sha1.Sum(fileBytes) - hashes = append(hashes, fileHash[:]) - } - - combinedHash := sha1.Sum(bytes.Join(hashes, nil)) - - return base64.RawURLEncoding.EncodeToString(combinedHash[:]), nil -} diff --git a/file/list.go b/file/list.go deleted file mode 100644 index 4a232c3..0000000 --- a/file/list.go +++ /dev/null @@ -1,24 +0,0 @@ -package file - -import ( - "github.com/gin-gonic/gin" - "github.com/tempfiles-Team/tempfiles-backend/database" -) - -func ListHandler(c *gin.Context) { - - var files []database.FileTracking - - if err := database.Engine.Where("is_deleted = ? AND is_hidden = ?", false, false).Find(&files); err != nil { - c.JSON(500, gin.H{ - "message": "db query error", - "error": err.Error(), - }) - return - } - - c.JSON(200, gin.H{ - "message": "File list successfully", - "list": files, - }) -} diff --git a/file/upload.go b/file/upload.go deleted file mode 100644 index 58d931c..0000000 --- a/file/upload.go +++ /dev/null @@ -1,129 +0,0 @@ -package file - -import ( - "fmt" - "log" - "strconv" - "time" - - "github.com/gin-gonic/gin" - "github.com/tempfiles-Team/tempfiles-backend/database" -) - -func UploadHandler(c *gin.Context) { - - form, err := c.MultipartForm() - - if err != nil { - c.JSON(400, gin.H{ - "error": err.Error(), - }) - return - } - - if form == nil || len(form.File["file"]) == 0 { - c.JSON(400, gin.H{ - "error": "Please send the file using the β€œfile” field in multipart/form-data.", - }) - return - } - - isHidden, err := strconv.ParseBool(c.GetHeader("X-Hidden")) - if err != nil { - isHidden = false - } - - downloadLimit, err := strconv.Atoi(c.GetHeader("X-Download-Limit")) - if err != nil { - downloadLimit = 100 - } - expireTime, err := strconv.Atoi(c.GetHeader("X-Time-Limit")) - - var expireTimeDate time.Time - - if err != nil || expireTime <= 0 { - expireTimeDate = time.Now().Add(time.Duration(60*3) * time.Minute) - } else { - expireTimeDate = time.Now().Add(time.Duration(expireTime) * time.Minute) - } - - FolderHash, err := GenerateFolderId(form.File["file"]) - - if err != nil { - c.JSON(500, gin.H{ - "message": "folder id generation error", - "error": err.Error(), - }) - return - } - - isExist, err := database.Engine.Exist(&database.FileTracking{FolderHash: FolderHash}) - - if err != nil { - c.JSON(500, gin.H{ - "message": "database exist error", - "error": err.Error(), - }) - return - } - - if isExist { - FileTracking := database.FileTracking{ - FolderHash: FolderHash, - } - _, err := database.Engine.Get(&FileTracking) - if err != nil { - c.JSON(500, gin.H{ - "message": "database get error", - "error": err.Error(), - }) - return - } - - // TODO: Add message to response - c.JSON(200, FileTracking) - return - } - - FileTracking := &database.FileTracking{ - FileCount: len(form.File["file"]), - FolderId: FolderHash[:5], - IsHidden: isHidden, - FolderHash: FolderHash, - UploadDate: time.Now(), - DownloadLimit: int64(downloadLimit), - ExpireTime: expireTimeDate, - } - - if CheckFileFolder(FileTracking.FolderId) != nil { - c.JSON(500, gin.H{ - "message": "file folder creation error", - "error": err.Error(), - }) - return - } - - for _, file := range form.File["file"] { - if err := c.SaveUploadedFile(file, fmt.Sprintf("tmp/%s/%s", FileTracking.FolderId, file.Filename)); err != nil { - c.JSON(500, gin.H{ - "message": "file save error", - "error": err.Error(), - }) - return - } - } - - _, err = database.Engine.Insert(FileTracking) - if err != nil { - c.JSON(500, gin.H{ - "message": "database insert error", - "error": err.Error(), - }) - return - } - - log.Printf("πŸ₯° Successfully uploaded %s, %d files\n", FileTracking.FolderId, FileTracking.FileCount) - - // TODO: Add message to response - c.JSON(200, FileTracking) -} diff --git a/go.mod b/go.mod index 22ceaf5..d2871b7 100644 --- a/go.mod +++ b/go.mod @@ -1,50 +1,55 @@ module github.com/tempfiles-Team/tempfiles-backend -go 1.19 +go 1.22.0 + +toolchain go1.22.1 require ( - github.com/gin-contrib/cors v1.4.0 - github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4 - github.com/gin-gonic/gin v1.9.1 + github.com/go-fuego/fuego v0.13.1 github.com/joho/godotenv v1.4.0 github.com/lib/pq v1.10.7 github.com/robfig/cron v1.2.0 + github.com/rs/cors v1.10.1 modernc.org/sqlite v1.20.2 xorm.io/xorm v1.3.2 ) require ( - github.com/bytedance/sonic v1.9.1 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/dustin/go-humanize v1.0.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/gin-contrib/sse v0.1.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/getkin/kin-openapi v0.123.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.14.0 // indirect + github.com/go-playground/validator/v10 v10.19.0 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/golang/snappy v0.0.4 // indirect + github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 // indirect github.com/google/uuid v1.3.1 // indirect + github.com/gorilla/schema v1.2.1 // indirect + github.com/invopop/yaml v0.2.0 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/cpuid/v2 v2.2.4 // indirect - github.com/leodido/go-urn v1.2.4 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/remyoudompheng/bigfft v0.0.0-20220927061507-ef77025ab5aa // indirect github.com/syndtr/goleveldb v1.0.0 // indirect - github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect - golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.9.0 // indirect - golang.org/x/mod v0.8.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/crypto v0.21.0 // indirect + golang.org/x/mod v0.9.0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.6.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect lukechampine.com/uint128 v1.2.0 // indirect modernc.org/cc/v3 v3.40.0 // indirect diff --git a/go.sum b/go.sum index 3292258..f6eab78 100644 --- a/go.sum +++ b/go.sum @@ -27,16 +27,10 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= -github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= @@ -49,7 +43,6 @@ github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7 github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -69,41 +62,38 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8= +github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/cors v1.4.0 h1:oJ6gwtUl3lqV0WEIwM/LxPF1QZ5qe2lGWdY2+bz7y0g= -github.com/gin-contrib/cors v1.4.0/go.mod h1:bs9pNM0x/UsmHPBWT2xZz9ROh8xYjYkiURUfmBoMlcs= -github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4 h1:Z9J0PVIt1PuibOShaOw1jH8hUYz+Ak8NLsR/GI0Hv5I= -github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4/go.mod h1:CEPcgZiz8998l9E8fDm16h8UfHRL7b+5oG0j/0koeVw= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-fuego/fuego v0.13.1 h1:VpzYaocwr/bGN9n6CDgAfmcyXFA5mbdeBjZisjfn0xg= +github.com/go-fuego/fuego v0.13.1/go.mod h1:Haw/N+HVuU0mMTjgpPXOWsQ8DsvBJDWSiJCblEh/7P4= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= -github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= -github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4= +github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= +github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/goccy/go-json v0.8.1/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -112,6 +102,8 @@ github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFG github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -120,21 +112,23 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47 h1:k4Tw0nt6lwro3Uin8eqoET7MDA4JnT8YgbCjc/g5E3k= +github.com/gomarkdown/markdown v0.0.0-20231222211730-1d6d20845b47/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -144,6 +138,8 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORR github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/schema v1.2.1 h1:tjDxcmdb+siIqkTNoV+qRH2mjYdr2hHe5MKXbp61ziM= +github.com/gorilla/schema v1.2.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= @@ -173,6 +169,8 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= +github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= @@ -224,6 +222,8 @@ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -235,24 +235,19 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -263,6 +258,8 @@ github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -274,12 +271,12 @@ github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15 h1:vfoHhTN1af61xCRSWzFIWzx2YskyMTwHLrExkBOjvxI= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -296,6 +293,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= @@ -324,13 +323,11 @@ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= +github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= @@ -361,9 +358,10 @@ github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo= +github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= @@ -391,27 +389,16 @@ github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5J github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -436,9 +423,6 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= -golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -454,9 +438,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -466,8 +449,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -486,8 +469,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -498,6 +481,7 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -523,14 +507,11 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -538,8 +519,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -585,10 +566,6 @@ google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -610,7 +587,7 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -675,6 +652,7 @@ modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.1/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v1.9.8/go.mod h1:U1eq8YWr/Kc1RWCMFUWEdkTg8OTcfLw2kY8EDwl039w= @@ -735,12 +713,13 @@ modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.8.13/go.mod h1:V+q/Ef0IJaNUSECieLU4o+8IScapxnMyFV6i/7uQlAY= modernc.org/tcl v1.15.0 h1:oY+JeD11qVVSgVvodMJsu7Edf8tr5E/7tuhF5cNYz34= +modernc.org/tcl v1.15.0/go.mod h1:xRoGotBZ6dU+Zo2tca+2EqVEeMmOUBzHnhIwq4YrVnE= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.2.19/go.mod h1:+ZpP0pc4zz97eukOzW3xagV/lS82IpPN9NGG5pNF9vY= modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +modernc.org/z v1.7.0/go.mod h1:hVdgNMh8ggTuRG1rGU8x+xGRFfiQUIAw0ZqlPy8+HyQ= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= diff --git a/main.go b/main.go index 185cb3b..1b8546c 100644 --- a/main.go +++ b/main.go @@ -1,31 +1,40 @@ package main import ( - "fmt" "log" - "math" + "net/http" "os" + "strconv" "time" - "github.com/gin-contrib/cors" - limits "github.com/gin-contrib/size" + "github.com/go-fuego/fuego" "github.com/robfig/cron" + "github.com/rs/cors" - "github.com/gin-gonic/gin" _ "github.com/joho/godotenv/autoload" + controller "github.com/tempfiles-Team/tempfiles-backend/controllers" "github.com/tempfiles-Team/tempfiles-backend/database" - "github.com/tempfiles-Team/tempfiles-backend/file" + "github.com/tempfiles-Team/tempfiles-backend/utils" ) func main() { - app := gin.Default() - app.Use(limits.RequestSizeLimiter(int64(math.Pow(1024, 3)))) // 1 == 1byte, = 1GB - config := cors.DefaultConfig() - config.AllowAllOrigins = true - config.AllowHeaders = []string{"Origin", "Content-Type", "Accept", "X-Download-Limit", "X-Time-Limit", "X-Hidden"} - config.AllowMethods = []string{"GET", "POST", "DELETE"} - app.Use(cors.New(config)) + if os.Getenv("BACKEND_PORT") == "" { + os.Setenv("BACKEND_PORT", "5000") + } + + port, _ := strconv.Atoi(os.Getenv("BACKEND_PORT")) + s := fuego.NewServer( + // string to int + fuego.WithPort(port), + fuego.WithCorsMiddleware(cors.New(cors.Options{ + AllowedOrigins: []string{"*"}, + AllowedMethods: []string{http.MethodGet, http.MethodPost, http.MethodDelete}, + AllowedHeaders: []string{"Origin", "Content-Type", "Accept", "X-Download-Limit", "X-Time-Limit", "X-Hidden"}, + }).Handler), + ) + + // app.Use(limits.RequestSizeLimiter(int64(math.Pow(1024, 3)))) // 1 == 1byte, = 1GB terminator := cron.New() @@ -65,7 +74,7 @@ func main() { var err error - if file.CheckTmpFolder() != nil { + if utils.CheckTmpFolder() != nil { log.Fatalf("tmp folder error: %v", err) } @@ -73,98 +82,87 @@ func main() { log.Fatalf("failed to create db engine: %v", err) } - app.GET("/", func(c *gin.Context) { - c.JSON(200, gin.H{ - "message": "api is working normally :)", - }) - }) - - app.GET("/info", func(c *gin.Context) { - apiName := c.Query("api") - - scheme := "http" - if c.Request.TLS != nil || c.Request.Header.Get("X-Forwarded-Proto") == "https" { - scheme = "https" - } - - baseUrl := scheme + "://" + c.Request.Host - - switch apiName { - case "upload": - c.JSON(200, gin.H{ - "apiName": "/upload", - "method": "POST", - "desc": "νŠΉμ • νŒŒμΌμ„ μ„œλ²„μ— μ—…λ‘œλ“œν•©λ‹ˆλ‹€.", - "command": "curl -LX POST -F 'file=@[filepath or filename]' " + baseUrl + "/upload", - }) - case "list": - c.JSON(200, gin.H{ - "apiName": "/list", - "method": "GET", - "desc": "μ„œλ²„μ— μ‘΄μž¬ν•˜λŠ” 파일 리슀트λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.", - "command": "curl -L " + baseUrl + "/list", - }) - case "file": - c.JSON(200, gin.H{ - "apiName": "/file/[file_id]", - "method": "GET", - "desc": "μ„œλ²„μ— μ‘΄μž¬ν•˜λŠ” νŠΉμ • νŒŒμΌμ— λŒ€ν•œ μ„ΈλΆ€ 정보λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.", - "command": "curl -L " + baseUrl + "/file/[file_id]", - }) - case "del": - c.JSON(200, gin.H{ - "apiName": "/del/[file_id]", - "method": "DELETE", - "desc": "μ„œλ²„μ— μ‘΄μž¬ν•˜λŠ” νŠΉμ • νŒŒμΌμ„ μ‚­μ œν•©λ‹ˆλ‹€.", - "command": "curl -LX DELETE " + baseUrl + "/del/[file_id]", - }) - case "dl": - c.JSON(200, gin.H{ - "apiName": "/dl/[file_id]", - "method": "GET", - "desc": "μ„œλ²„μ— μ‘΄μž¬ν•˜λŠ” νŠΉμ • νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œ ν•©λ‹ˆλ‹€.", - "command": "curl -LO " + baseUrl + "/dl/[file_id]", - }) - default: - c.JSON(200, []gin.H{ - { - "apiUrl": baseUrl + "/upload", - "apiHandler": "upload", - }, - { - - "apiUrl": baseUrl + "/list", - "apiHandler": "list", - }, - { - "apiUrl": baseUrl + "/file/[file_id]", - "apiHandler": "file", - }, - { - "apiUrl": baseUrl + "/del/[file_id]", - "apiHandler": "del", - }, - { - "apiUrl": baseUrl + "/dl/[file_id]", - "apiHandler": "dl", - }, - }) - } - }) - - app.GET("/list", file.ListHandler) - app.POST("/upload", file.UploadHandler) - - app.GET("/file/:id", file.FileHandler) - - app.GET("/dl/:id/:name", file.DownloadHandler) - app.DELETE("/del/:id", file.DeleteHandler) - - if os.Getenv("BACKEND_PORT") == "" { - os.Setenv("BACKEND_PORT", "5000") - } - - log.Fatal(app.Run(fmt.Sprintf(":%s", os.Getenv("BACKEND_PORT")))) - + // app.GET("/", func(c *gin.Context) { + // c.JSON(200, gin.H{ + // "message": "api is working normally :)", + // }) + // }) + + // app.GET("/info", func(c *gin.Context) { + // apiName := c.Query("api") + + // scheme := "http" + // if c.Request.TLS != nil || c.Request.Header.Get("X-Forwarded-Proto") == "https" { + // scheme = "https" + // } + + // baseUrl := scheme + "://" + c.Request.Host + + // switch apiName { + // case "upload": + // c.JSON(200, gin.H{ + // "apiName": "/upload", + // "method": "POST", + // "desc": "νŠΉμ • νŒŒμΌμ„ μ„œλ²„μ— μ—…λ‘œλ“œν•©λ‹ˆλ‹€.", + // "command": "curl -LX POST -F 'file=@[filepath or filename]' " + baseUrl + "/upload", + // }) + // case "list": + // c.JSON(200, gin.H{ + // "apiName": "/list", + // "method": "GET", + // "desc": "μ„œλ²„μ— μ‘΄μž¬ν•˜λŠ” 파일 리슀트λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.", + // "command": "curl -L " + baseUrl + "/list", + // }) + // case "file": + // c.JSON(200, gin.H{ + // "apiName": "/file/[file_id]", + // "method": "GET", + // "desc": "μ„œλ²„μ— μ‘΄μž¬ν•˜λŠ” νŠΉμ • νŒŒμΌμ— λŒ€ν•œ μ„ΈλΆ€ 정보λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.", + // "command": "curl -L " + baseUrl + "/file/[file_id]", + // }) + // case "del": + // c.JSON(200, gin.H{ + // "apiName": "/del/[file_id]", + // "method": "DELETE", + // "desc": "μ„œλ²„μ— μ‘΄μž¬ν•˜λŠ” νŠΉμ • νŒŒμΌμ„ μ‚­μ œν•©λ‹ˆλ‹€.", + // "command": "curl -LX DELETE " + baseUrl + "/del/[file_id]", + // }) + // case "dl": + // c.JSON(200, gin.H{ + // "apiName": "/dl/[file_id]", + // "method": "GET", + // "desc": "μ„œλ²„μ— μ‘΄μž¬ν•˜λŠ” νŠΉμ • νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œ ν•©λ‹ˆλ‹€.", + // "command": "curl -LO " + baseUrl + "/dl/[file_id]", + // }) + // default: + // c.JSON(200, []gin.H{ + // { + // "apiUrl": baseUrl + "/upload", + // "apiHandler": "upload", + // }, + // { + + // "apiUrl": baseUrl + "/list", + // "apiHandler": "list", + // }, + // { + // "apiUrl": baseUrl + "/file/[file_id]", + // "apiHandler": "file", + // }, + // { + // "apiUrl": baseUrl + "/del/[file_id]", + // "apiHandler": "del", + // }, + // { + // "apiUrl": baseUrl + "/dl/[file_id]", + // "apiHandler": "dl", + // }, + // }) + // } + // }) + + controller.FilesRessources{}.Routes(s) + + s.Run() terminator.Stop() } diff --git a/file/folder.go b/utils/file.go similarity index 57% rename from file/folder.go rename to utils/file.go index 694e884..e3e47af 100644 --- a/file/folder.go +++ b/utils/file.go @@ -1,12 +1,20 @@ -package file +package utils import ( + "io" + "mime/multipart" "net/url" "os" "path/filepath" "strings" ) +type FileListResponse struct { + FileName string `json:"fileName"` + FileSize int64 `json:"fileSize"` + DownloadUrl string `json:"downloadUrl"` +} + func CheckIsFileExist(folderId, fileName string) bool { if _, err := os.Stat("tmp/" + folderId + "/" + fileName); os.IsNotExist(err) { return false @@ -14,7 +22,7 @@ func CheckIsFileExist(folderId, fileName string) bool { return true } -func GetFiles(folderId, baseUrl string) ([]FileListResponse, error) { +func GetFiles(folderId string) ([]FileListResponse, error) { // return filenames, file sizes var files []FileListResponse @@ -23,7 +31,7 @@ func GetFiles(folderId, baseUrl string) ([]FileListResponse, error) { files = append(files, FileListResponse{ FileName: filepath.Base(path), FileSize: info.Size(), - DownloadUrl: baseUrl + "/dl/" + folderId + "/" + strings.ReplaceAll(url.PathEscape(filepath.Base(path)), "+", "%20"), + DownloadUrl: "/dl/" + folderId + "/" + strings.ReplaceAll(url.PathEscape(filepath.Base(path)), "+", "%20"), }) } return nil @@ -32,6 +40,26 @@ func GetFiles(folderId, baseUrl string) ([]FileListResponse, error) { } +func SaveFile(folderId, fileName string, file multipart.File) error { + // tmpf/debug/filename write + os.MkdirAll("tmp/"+folderId, os.ModePerm) + tmpf, err := os.Create("tmp/" + folderId + "/" + fileName) + + if err != nil { + return err + } + + defer tmpf.Close() + + _, err = io.Copy(tmpf, file) + if err != nil { + return err + } + + return nil + +} + func CheckTmpFolder() error { if _, err := os.Stat("tmp"); os.IsNotExist(err) { err := os.Mkdir("tmp", 0755) diff --git a/utils/multipart.go b/utils/multipart.go new file mode 100644 index 0000000..46aec01 --- /dev/null +++ b/utils/multipart.go @@ -0,0 +1,90 @@ +package utils + +import ( + "bytes" + "crypto/sha1" + "encoding/base64" + "errors" + "mime/multipart" + "net/http" + "sort" +) + +const ( + defaultMaxMemory = 32 << 20 // 32 MB +) + +var multipartByReader = &multipart.Form{ + Value: make(map[string][]string), + File: make(map[string][]*multipart.FileHeader), +} + +type MultiFileAndHeader struct { + File multipart.File + Header *multipart.FileHeader +} + +// An improved version of net/http.Request.FormFile() +func FormFiles(r *http.Request, key string) ([]MultiFileAndHeader, error) { + + if r.MultipartForm == multipartByReader { + return nil, errors.New("http: multipart handled by MultipartReader") + } + if r.MultipartForm == nil { + err := r.ParseMultipartForm(defaultMaxMemory) + if err != nil { + return nil, err + } + } + + if r.MultipartForm != nil && r.MultipartForm.File != nil { + + var files []MultiFileAndHeader + if fhs := r.MultipartForm.File[key]; len(fhs) > 0 { + + for _, fh := range fhs { + f, err := fh.Open() + if err != nil { + return nil, err + } + + files = append(files, MultiFileAndHeader{ + File: f, + Header: fh, + }) + } + } + + if len(files) > 0 { + return files, nil + } + } + return nil, http.ErrMissingFile +} + +func GenIdFormMulitpart(MFAH []MultiFileAndHeader) (string, error) { + + sort.Slice(MFAH, func(i, j int) bool { + return MFAH[i].Header.Filename < MFAH[j].Header.Filename + }) + + var hashes [][]byte + + for _, file := range MFAH { + + // defer file.File.Close() + + buf := new(bytes.Buffer) + buf.ReadFrom(file.File) + fileBytes := buf.Bytes() + + nameHash := sha1.Sum([]byte(file.Header.Filename)) + hashes = append(hashes, nameHash[:]) + fileHash := sha1.Sum(fileBytes) + hashes = append(hashes, fileHash[:]) + } + + combinedHash := sha1.Sum(bytes.Join(hashes, nil)) + + return base64.RawURLEncoding.EncodeToString(combinedHash[:]), nil +}