This commit is contained in:
Kasper Juul Hermansen 2021-12-21 00:17:09 +01:00
commit 1506a57231
Signed by: kjuulh
GPG Key ID: DCD9397082D97069
11 changed files with 187 additions and 0 deletions

8
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

9
.idea/downloader.iml Normal file
View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="Go" enabled="true" />
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/downloader.iml" filepath="$PROJECT_DIR$/.idea/downloader.iml" />
</modules>
</component>
</project>

9
api/cmd/api/main.go Normal file
View File

@ -0,0 +1,9 @@
package main
import router "downloader/internal/app/router"
func main() {
router.
NewRouter().
Run()
}

8
api/go.mod Normal file
View File

@ -0,0 +1,8 @@
module downloader
go 1.17
require (
github.com/go-chi/chi v1.5.4 // indirect
github.com/go-chi/render v1.0.1 // indirect
)

4
api/go.sum Normal file
View File

@ -0,0 +1,4 @@
github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs=
github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg=
github.com/go-chi/render v1.0.1 h1:4/5tis2cKaNdnv9zFLfXzcquC9HbeZgCnxGnKrltBS8=
github.com/go-chi/render v1.0.1/go.mod h1:pq4Rr7HbnsdaeHagklXub+p6Wd16Af5l9koip1OvJns=

View File

@ -0,0 +1,29 @@
package responses
import (
"github.com/go-chi/render"
"net/http"
)
type ErrResponse struct {
Err error `json:"-"` // low-level runtime error
HTTPStatusCode int `json:"-"` // http response status code
StatusText string `json:"status"` // user-level status message
AppCode int64 `json:"code,omitempty"` // application-specific error code
ErrorText string `json:"error,omitempty"` // application-level error message, for debugging
}
func (e ErrResponse) Render(w http.ResponseWriter, r *http.Request) error {
render.Status(r, e.HTTPStatusCode)
return nil
}
func ErrInvalidRequest(err error) render.Renderer {
return &ErrResponse{
Err: err,
HTTPStatusCode: 400,
StatusText: "Invalid request.",
ErrorText: err.Error(),
}
}

View File

@ -0,0 +1,42 @@
package download
import (
"downloader/internal/app/api/common/responses"
"errors"
"github.com/go-chi/chi"
"github.com/go-chi/render"
"net/http"
)
type api struct{}
func New() *api {
return &api{}
}
func (api *api) SetupDownloadApi(router *chi.Mux) {
router.Route("/downloads", func(r chi.Router) {
r.Post("/", api.requestDownload)
})
}
type requestDownloadRequest struct {
Provider string `json:"provider"`
Link string `json:"link"`
}
func (dr *requestDownloadRequest) Bind(r *http.Request) error {
if dr.Link == "" || dr.Provider == "" {
return errors.New("missing required download request field")
}
return nil
}
func (api *api) requestDownload(w http.ResponseWriter, r *http.Request) {
data := &requestDownloadRequest{}
if err := render.Bind(r, data); err != nil {
_ = render.Render(w, r, responses.ErrInvalidRequest(err))
return
}
}

View File

@ -0,0 +1,49 @@
package router
import (
"downloader/internal/app/api/download"
"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
"net/http"
"time"
)
type router struct {
internalRouter *chi.Mux
}
func NewRouter() *router {
router := &router{internalRouter: chi.NewRouter()}
router.
setupMiddleware().
setupRoutes()
return router
}
func (router *router) Run() {
http.ListenAndServe(":3333", router.internalRouter)
}
func (router *router) RegisterApi() *chi.Mux {
return router.internalRouter
}
func (router *router) setupMiddleware() *router {
router.internalRouter.Use(middleware.Logger)
router.internalRouter.Use(middleware.RequestID)
router.internalRouter.Use(middleware.RealIP)
router.internalRouter.Use(middleware.Recoverer)
router.internalRouter.Use(middleware.Timeout(time.Second * 60))
return router
}
func (router *router) setupRoutes() *router {
downloadApi := download.New()
downloadApi.SetupDownloadApi(router.internalRouter)
return router
}

View File

@ -0,0 +1,8 @@
package entities
type Download struct {
ID string `json:"id"`
Status string `json:"status"`
Link string `json:"link"`
Data string `json:"data"`
}

View File

@ -0,0 +1,13 @@
package download_request
import "downloader/internal/core/entities"
type Service interface {
Schedule(provider string, link string) (entities.Download, error)
Get(id string) (entities.Download, error)
}
type Repository interface {
Create(download entities.Download) (entities.Download, error)
GetById(id string) (entities.Download, error)
}