11package routes
22
33import (
4+ "context"
45 "fmt"
56 "log"
67 "net/http"
78 "strconv"
89
9- "github.com/simondanielsson/recite/cmd/internal/db"
10+ "github.com/jackc/pgx/v5/pgxpool"
11+ constants "github.com/simondanielsson/recite/cmd/internal"
1012 "github.com/simondanielsson/recite/cmd/internal/marshal"
1113 "github.com/simondanielsson/recite/cmd/internal/queries"
1214 "github.com/simondanielsson/recite/cmd/internal/services"
@@ -28,6 +30,7 @@ func rootGetHandler(logger *log.Logger) http.Handler {
2830 func (w http.ResponseWriter , r * http.Request ) {
2931 w .WriteHeader (http .StatusOK )
3032 if _ , err := w .Write ([]byte ("ok\n " )); err != nil {
33+ logger .Println (err )
3134 w .WriteHeader (http .StatusInternalServerError )
3235 }
3336 },
@@ -49,7 +52,7 @@ func recitalPostHandler(logger *log.Logger) http.Handler {
4952 res := messageResponse {
5053 Message : fmt .Sprintf ("bad request, should contain url. Got %s" , req .Url ),
5154 }
52- if err := marshal .Encode (w , r , http .StatusBadRequest , res ); err != nil {
55+ if err := marshal .Encode (r . Context (), w , r , http .StatusBadRequest , res ); err != nil {
5356 writeErrHeader (w , err , logger )
5457 }
5558 return
@@ -62,71 +65,69 @@ func recitalPostHandler(logger *log.Logger) http.Handler {
6265 // 4. Build a simple voice streamer in a basic htmx web page
6366
6467 ctx := r .Context ()
65- repository , ok := ctx .Value (db .RepositoryKey ).(* queries.Queries )
68+ repository , ok := ctx .Value (constants .RepositoryKey ).(* queries.Queries )
6669 if ! ok {
67- res := messageResponse {Message : "Something went wrong." }
68- logger .Print (err )
69- if err := marshal .Encode (w , r , int (http .StatusInternalServerError ), res ); err != nil {
70- writeErrHeader (w , err , logger )
71- return
72- }
70+ logGenericInternalServiceError (ctx , w , r , fmt .Errorf ("failed loading repository" ), logger )
71+ return
72+ }
73+ pool , ok := ctx .Value (constants .DBConnPool ).(* pgxpool.Pool )
74+ if ! ok {
75+ logGenericInternalServiceError (ctx , w , r , fmt .Errorf ("failed loading db connection pool" ), logger )
76+ return
7377 }
7478
75- id , err := services .CreateRecital (ctx , req .Url , repository , logger )
79+ id , err := services .CreateRecital (ctx , req .Url , repository , pool , logger )
7680 if err != nil {
77- res := messageResponse {Message : "Something went wrong." }
78- logger .Print (err )
79- if err := marshal .Encode (w , r , int (http .StatusInternalServerError ), res ); err != nil {
80- writeErrHeader (w , err , logger )
81- return
82- }
81+ logGenericInternalServiceError (ctx , w , r , err , logger )
82+ return
8383 }
8484
8585 res := response {
8686 Id : id ,
8787 }
88- if err := marshal .Encode (w , r , http .StatusCreated , res ); err != nil {
88+ if err := marshal .Encode (ctx , w , r , http .StatusCreated , res ); err != nil {
8989 writeErrHeader (w , err , logger )
9090 return
9191 }
9292 },
9393 )
9494}
9595
96- // TODO: move
97- type GenerationStatus string
98-
99- const (
100- InProgress GenerationStatus = "in progress"
101- Completed GenerationStatus = "completed"
102- Failed GenerationStatus = "failed"
103- )
104-
10596func recitalGetHandler (logger * log.Logger ) http.Handler {
10697 type response struct {
107- Status GenerationStatus
98+ queries. Recital
10899 }
109100 return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
110101 id , err := strconv .Atoi (r .PathValue ("id" ))
111102 if err != nil {
112103 res := messageResponse {Message : "invalid id" }
113- if err := marshal .Encode (w , r , http .StatusBadRequest , res ); err != nil {
104+ if err := marshal .Encode (r . Context (), w , r , http .StatusBadRequest , res ); err != nil {
114105 writeErrHeader (w , err , logger )
115- return
116106 }
107+ return
117108 }
118109
119- _ = id
120- // TODO: unmock
121- res := response {Status : Completed }
122- if err := marshal .Encode (w , r , http .StatusOK , res ); err != nil {
123- res := messageResponse {"failed to encode response" }
124- if err := marshal .Encode (w , r , http .StatusInternalServerError , res ); err != nil {
125- writeErrHeader (w , err , logger )
110+ ctx := r .Context ()
111+ repository , ok := ctx .Value (constants .RepositoryKey ).(* queries.Queries )
112+ if ! ok {
113+ logGenericInternalServiceError (ctx , w , r , fmt .Errorf ("failed loading repository" ), logger )
114+ }
115+
116+ recital , err := services .GetRecital (ctx , int32 (id ), repository , logger )
117+ if err != nil {
118+ res := messageResponse {Message : fmt .Sprintf ("Could not find recital with id %d" , id )}
119+ if err := marshal .Encode (ctx , w , r , http .StatusNotFound , res ); err != nil {
120+ logFailedEncodingResponse (ctx , w , r , err , logger )
126121 }
122+ return
127123 }
128124
129- return
125+ res := response {
126+ Recital : recital ,
127+ }
128+ if err := marshal .Encode (ctx , w , r , http .StatusOK , res ); err != nil {
129+ logFailedEncodingResponse (ctx , w , r , err , logger )
130+ }
130131 })
131132}
132133
@@ -136,3 +137,20 @@ func writeErrHeader(w http.ResponseWriter, err error, logger *log.Logger) {
136137 logger .Print ("failed writing error" )
137138 }
138139}
140+
141+ func logGenericInternalServiceError (ctx context.Context , w http.ResponseWriter , r * http.Request , err error , logger * log.Logger ) {
142+ res := messageResponse {Message : "Something went wrong." }
143+ logger .Print (err )
144+ if err := marshal .Encode (ctx , w , r , int (http .StatusInternalServerError ), res ); err != nil {
145+ writeErrHeader (w , err , logger )
146+ return
147+ }
148+ }
149+
150+ func logFailedEncodingResponse (ctx context.Context , w http.ResponseWriter , r * http.Request , err error , logger * log.Logger ) {
151+ logger .Println (err )
152+ res := messageResponse {"failed to encode response" }
153+ if err := marshal .Encode (ctx , w , r , http .StatusInternalServerError , res ); err != nil {
154+ writeErrHeader (w , err , logger )
155+ }
156+ }
0 commit comments