diff --git a/core/.env.example b/core/.env.example index fee59c1..1af2e7b 100644 --- a/core/.env.example +++ b/core/.env.example @@ -1,5 +1,5 @@ DRIVERNAME=pgx MIGRATE=true -DATASOURCE=postgresql://developer:secret@localhost:5432/rating?sslmode=disable +DATASOURCE=postgresql://developer:secret@localhost:5432/db?sslmode=disable ASYMMETRICKEY= -DURATION= +DURATION= \ No newline at end of file diff --git a/core/Makefile b/core/Makefile index cd961c3..2cb4ade 100644 --- a/core/Makefile +++ b/core/Makefile @@ -63,7 +63,7 @@ tidy: build-linux: make tidy make remove-debug - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./tmp/rating ./cmd/. + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./tmp/arena ./cmd/. .PHONY: pack-docker # Run docker build for pack binary and assets to Docker container. diff --git a/core/cmd/main.go b/core/cmd/main.go index da51329..570613c 100644 --- a/core/cmd/main.go +++ b/core/cmd/main.go @@ -4,42 +4,39 @@ import ( "embed" "encoding/gob" "gopher-toolbox/app" + "gopher-toolbox/db" "log/slog" - "ron" - _ "github.com/golang-migrate/migrate/v4/database/postgres" - _ "github.com/golang-migrate/migrate/v4/source/file" + "github.com/gofiber/fiber/v2" "github.com/zepyrshut/rating-orama/internal/handlers" "github.com/zepyrshut/rating-orama/internal/repository" - "gopher-toolbox/db" ) +//go:embed database/migrations +var database embed.FS + const version = "0.2.0-beta.20241116-4" +const appName = "rating-orama" func init() { gob.Register(map[string]string{}) } -//go:embed database/migrations -var database embed.FS - func main() { app := app.New(version) - app.Migrate(database) - r := ron.New(func(e *ron.Engine) { - e.Config.LogLevel = slog.LevelDebug + r := fiber.New(fiber.Config{ + AppName: appName, }) - + dbPool := db.NewPGXPool(app.Database.DataSource) defer dbPool.Close() q := repository.NewPGXRepo(dbPool) - h := handlers.New(q, app) + h := handlers.New(app, q) router(h, r) slog.Info("server started", "port", "8080", "version", version) - err := r.Run(":8080") - if err != nil { + if err := r.Listen(":8080"); err != nil { slog.Error("cannot start server", "error", err) } } diff --git a/core/cmd/routes.go b/core/cmd/routes.go index ad12d78..6ab3f7b 100644 --- a/core/cmd/routes.go +++ b/core/cmd/routes.go @@ -1,14 +1,12 @@ package main import ( + "github.com/gofiber/fiber/v2" "github.com/zepyrshut/rating-orama/internal/handlers" - "ron" ) -func router(h *handlers.Handlers, r *ron.Engine) { +func router(h *handlers.Handlers, r *fiber.App) { - r.GET("/ping", h.Ping) - r.GET("/error", h.Error) - r.GET("/tvshow", h.GetTVShow) + r.Get("/tvshow", h.GetTVShow) } diff --git a/core/go.mod b/core/go.mod index 464d8eb..ebdfffa 100644 --- a/core/go.mod +++ b/core/go.mod @@ -4,37 +4,48 @@ go 1.23.2 require ( github.com/PuerkitoBio/goquery v1.10.0 + github.com/gofiber/fiber/v2 v2.52.5 github.com/jackc/pgx/v5 v5.7.1 - ron v0.0.0-00010101000000-000000000000 ) require ( aidanwoods.dev/go-paseto v1.5.2 // indirect aidanwoods.dev/go-result v0.1.0 // indirect + github.com/andybalholm/brotli v1.0.5 // indirect github.com/andybalholm/cascadia v1.3.2 // indirect github.com/antchfx/htmlquery v1.3.3 // indirect github.com/antchfx/xmlquery v1.4.2 // indirect github.com/antchfx/xpath v1.3.2 // indirect + github.com/go-sql-driver/mysql v1.5.0 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/go-cmp v0.6.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/jackc/pgconn v1.14.3 // indirect github.com/kennygrant/sanitize v1.2.4 // indirect + github.com/klauspost/compress v1.17.0 // indirect github.com/lib/pq v1.10.9 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/rivo/uniseg v0.2.0 // indirect github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect github.com/temoto/robotstxt v1.1.2 // indirect - go.uber.org/atomic v1.11.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + go.uber.org/atomic v1.7.0 // indirect golang.org/x/net v0.30.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/protobuf v1.35.1 // indirect + google.golang.org/protobuf v1.34.2 // indirect ) require ( github.com/gocolly/colly v1.2.0 - github.com/golang-migrate/migrate/v4 v4.18.1 + github.com/golang-migrate/migrate/v4 v4.18.1 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect @@ -48,6 +59,4 @@ require ( gopher-toolbox v0.0.0-00010101000000-000000000000 ) -replace ron => ./../../ron-gola - replace gopher-toolbox => ./../../gopher-toolbox diff --git a/core/go.sum b/core/go.sum index ef063f0..68c59db 100644 --- a/core/go.sum +++ b/core/go.sum @@ -8,6 +8,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/PuerkitoBio/goquery v1.10.0 h1:6fiXdLuUvYs2OJSvNRqlNPoBm6YABE226xrbavY5Wv4= github.com/PuerkitoBio/goquery v1.10.0/go.mod h1:TjZZl68Q3eGHNBA8CWaxAN7rOU1EbDz3CWuolcO5Yu4= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= github.com/antchfx/htmlquery v1.3.3 h1:x6tVzrRhVNfECDaVxnZi1mEGrQg3mjE/rxbH2Pe6dNE= @@ -35,10 +37,14 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gocolly/colly v1.2.0 h1:qRz9YAn8FIH0qzgNUw+HT9UN7wm1oF9OBAilwEWpyrI= github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA= +github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= +github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-migrate/migrate/v4 v4.18.1 h1:JML/k+t4tpHCpQTCAD62Nu43NUFzHY4CV3uAuvHGC+Y= @@ -52,6 +58,8 @@ github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -78,8 +86,17 @@ github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o= github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak= +github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= @@ -94,6 +111,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA= github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -104,6 +123,12 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/temoto/robotstxt v1.1.2 h1:W2pOjSJ6SWvldyEuiFXNxz3xZ8aiWX5LbfDiOFd7Fxg= github.com/temoto/robotstxt v1.1.2/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= @@ -113,8 +138,8 @@ go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2 go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= @@ -139,7 +164,9 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -165,8 +192,8 @@ google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAs google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/core/internal/handlers/handlers.go b/core/internal/handlers/handlers.go index 28a6348..fc9c3a8 100644 --- a/core/internal/handlers/handlers.go +++ b/core/internal/handlers/handlers.go @@ -1,44 +1,30 @@ package handlers import ( - "context" - "gopher-toolbox/app" - "log/slog" "net/http" - "ron" + "gopher-toolbox/app" + + "github.com/gofiber/fiber/v2" "github.com/zepyrshut/rating-orama/internal/repository" ) type Handlers struct { - App *app.App - Queries repository.ExtendedQuerier + app *app.App + queries repository.ExtendedQuerier } -func New(q repository.ExtendedQuerier, app *app.App) *Handlers { +func New(app *app.App, q repository.ExtendedQuerier) *Handlers { return &Handlers{ - Queries: q, - App: app, + app: app, + queries: q, } } -func (hq *Handlers) ToBeImplemented(c *ron.CTX, ctx context.Context) { - c.JSON(http.StatusOK, ron.Data{ - "message": "Not implemented yet", - }) +func (hq *Handlers) ToBeImplemented(c *fiber.Ctx) error { + return c.Status(http.StatusNotImplemented).JSON("not implemented") } -func (hq *Handlers) Ping(c *ron.CTX, ctx context.Context) { - slog.Info("ping", ron.RequestID, ctx.Value(ron.RequestID)) - c.JSON(http.StatusOK, ron.Data{ - "message": "pong", - }) -} - -func (hq *Handlers) Error(c *ron.CTX, ctx context.Context) { - slog.Error("error", ron.RequestID, ctx.Value(ron.RequestID)) - c.JSON(http.StatusInternalServerError, ron.Data{ - "req": ctx.Value(ron.RequestID), - "message": "error", - }) +func (hq *Handlers) Ping(c *fiber.Ctx) error { + return c.JSON("pong") } diff --git a/core/internal/handlers/tvshow.go b/core/internal/handlers/tvshow.go index d79ea32..9ca7123 100644 --- a/core/internal/handlers/tvshow.go +++ b/core/internal/handlers/tvshow.go @@ -1,65 +1,63 @@ package handlers import ( - "context" - "gopher-toolbox/app" "log/slog" "net/http" - "ron" + + "github.com/gofiber/fiber/v2" "github.com/zepyrshut/rating-orama/internal/scraper" "github.com/zepyrshut/rating-orama/internal/sqlc" ) -func (hq *Handlers) GetTVShow(c *ron.CTX, ctx context.Context) { +func (hq *Handlers) GetTVShow(c *fiber.Ctx) error { ttShowID := c.Query("ttid") - slog.Info("", "ttid", ttShowID, ron.RequestID, ctx.Value(ron.RequestID)) var title string var scraperEpisodes []scraper.Episode var sqlcEpisodes []sqlc.Episode - tvShow, err := hq.Queries.CheckTVShowExists(ctx, ttShowID) + tvShow, err := hq.queries.CheckTVShowExists(c.Context(), ttShowID) if err != nil { title, scraperEpisodes = scraper.ScrapeEpisodes(ttShowID) - - sqlcEpisodes, err = hq.Queries.CreateTvShowWithEpisodes(ctx, sqlc.CreateTVShowParams{ + // TODO: make transactional + ttShow, err := hq.queries.CreateTVShow(c.Context(), sqlc.CreateTVShowParams{ TtImdb: ttShowID, Name: title, - }, scraperEpisodes) + }) if err != nil { - slog.Error("failed to create tv show with episodes", "ttid", ttShowID, "error", err) - c.JSON(http.StatusInternalServerError, ron.Data{"error": app.ErrorCreating}) - return + slog.Error("failed to create tv show", "ttid", ttShowID, "error", err) + return c.SendStatus(http.StatusInternalServerError) + } + + slog.Info("ttshowid", "id", ttShow.ID) + for _, episode := range scraperEpisodes { + sqlcEpisodesParams := episode.ToEpisodeParams(ttShow.ID) + sqlcEpisode, err := hq.queries.CreateEpisodes(c.Context(), sqlcEpisodesParams) + if err != nil { + slog.Error("failed to create episodes", "ttid", ttShowID, "error", err) + return c.SendStatus(http.StatusInternalServerError) + } + + sqlcEpisodes = append(sqlcEpisodes, sqlcEpisode) } slog.Info("scraped seasons", "ttid", ttShowID, "title", title) } else { title = tvShow.Name - sqlcEpisodes, err = hq.Queries.GetEpisodes(ctx, tvShow.ID) + sqlcEpisodes, err = hq.queries.GetEpisodes(c.Context(), tvShow.ID) if err != nil { slog.Error("failed to get episodes", "ttid", ttShowID, "error", err) - c.JSON(http.StatusInternalServerError, ron.Data{"error": app.ErrorGetting}) - return - } - - if err := hq.Queries.IncreasePopularity(ctx, ttShowID); err != nil { - slog.Error("failed to increase popularity", "ttid", ttShowID, "error", err) - c.JSON(http.StatusInternalServerError, ron.Data{"error": app.ErrorUpdating}) - return + return c.SendStatus(http.StatusInternalServerError) } + hq.queries.IncreasePopularity(c.Context(), ttShowID) slog.Info("tv show exists", "ttid", ttShowID, "title", tvShow.Name) } - tvShowMedian, _ := hq.Queries.TvShowMedianRating(ctx, sqlcEpisodes[0].TvShowID) - tvShowAverage, _ := hq.Queries.TvShowAverageRating(ctx, sqlcEpisodes[0].TvShowID) - - c.JSON(http.StatusOK, ron.Data{ - "popularity": tvShow.Popularity, - "title": title, - "seasons": sqlcEpisodes, - "tvShowMedian": tvShowMedian, - "tvShowAverage": tvShowAverage, + return c.JSON(fiber.Map{ + "popularity": tvShow.Popularity, + "title": title, + "seasons": sqlcEpisodes, }) } diff --git a/core/internal/scraper/tvshow.go b/core/internal/scraper/tvshow.go index 5654060..133a426 100644 --- a/core/internal/scraper/tvshow.go +++ b/core/internal/scraper/tvshow.go @@ -2,7 +2,6 @@ package scraper import ( "fmt" - "github.com/PuerkitoBio/goquery" "log/slog" "regexp" "sort" @@ -10,6 +9,8 @@ import ( "strings" "time" + "github.com/PuerkitoBio/goquery" + "github.com/gocolly/colly" "github.com/jackc/pgx/v5/pgtype" "github.com/zepyrshut/rating-orama/internal/sqlc" @@ -47,14 +48,15 @@ const ( seasonsSelector = "ul.ipc-tabs a[data-testid='tab-season-entry']" episodeCardSelector = "article.sc-f8507e90-1.cHtpvn.episode-item-wrapper" seasonEpisodeAndTitleSelector = "div.ipc-title__text" - releasedDateSelector = "span.sc-ccd6e31b-10.dYquTu" - plotSelector = "div.sc-ccd6e31b-11.cVKeME" + releasedDateSelector = "span.sc-f2169d65-10.bYaARM" + plotSelector = "div.ipc-html-content-inner-div" starRatingSelector = "span.ipc-rating-star--rating" voteCountSelector = "span.ipc-rating-star--voteCount" imdbEpisodesURL = "https://www.imdb.com/title/%s/episodes/?season=%d" visitURL = "https://www.imdb.com/title/%s/episodes" ) + func ScrapeEpisodes(ttImdb string) (string, []Episode) { c := colly.NewCollector( colly.AllowedDomains("imdb.com", "www.imdb.com"),