134 lines
3.0 KiB
Go
134 lines
3.0 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"database/sql"
|
|
"encoding/gob"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/joho/godotenv"
|
|
_ "github.com/lib/pq"
|
|
|
|
"tibo/rss-feed/internal/database"
|
|
)
|
|
|
|
type createPayload struct {
|
|
Name string
|
|
}
|
|
|
|
type apiConfig struct {
|
|
DB *database.Queries
|
|
}
|
|
|
|
type authHandler func(http.ResponseWriter, *http.Request, database.User)
|
|
|
|
type responseHandler func(http.ResponseWriter, int, interface{}) http.HandlerFunc
|
|
|
|
func respondWithJSON(w http.ResponseWriter, code int, payload interface{}) http.HandlerFunc {
|
|
w.Header().Add("content-type", "application/json")
|
|
w.WriteHeader(code)
|
|
var buf bytes.Buffer
|
|
enc := gob.NewEncoder(&buf)
|
|
if err := enc.Encode(payload); err != nil {
|
|
respondWithError(w, 400, err.Error())
|
|
}
|
|
w.Write(buf.Bytes())
|
|
return http.HandlerFunc(w, _)
|
|
}
|
|
|
|
func respondWithError(w http.ResponseWriter, code int, msg interface{}) http.HandlerFunc {
|
|
return respondWithJSON(w, code, msg)
|
|
}
|
|
|
|
func (cfg *apiConfig) middlewareAuth(w http.ResponseWriter, r *http.Request, handler authHandler) http.HandlerFunc {
|
|
|
|
api_key := r.Header.Get("Api_key")
|
|
|
|
user, err := cfg.DB.GetUser(context.Background(), api_key)
|
|
if err != nil {
|
|
return respondWithError(w, 400, "invalid user")
|
|
}
|
|
|
|
handler(w, r, user)
|
|
|
|
if w != nil {
|
|
return respondWithError(w, 400, "it failed")
|
|
}
|
|
return respondWithJSON(w, 200, )
|
|
}
|
|
|
|
func (cfg *apiConfig) handlerUserCreate(w http.ResponseWriter, r *http.Request, db database.User) {
|
|
decoder := json.NewDecoder(r.Body)
|
|
var payload createPayload
|
|
err := decoder.Decode(&payload)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
currentTime := time.Now()
|
|
createUser := database.CreateUserParams{
|
|
ID: uuid.New(),
|
|
Name: payload.Name,
|
|
UpdatedAt: sql.NullTime{Time: currentTime},
|
|
CreatedAt: sql.NullTime{Time: currentTime},
|
|
}
|
|
|
|
usr, err := cfg.DB.CreateUser(context.Background(), createUser)
|
|
if err != nil {
|
|
fmt.Printf("Could not save user: %s", err)
|
|
}
|
|
|
|
if err := json.NewEncoder(w).Encode(usr); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func (cfg *apiConfig) handlerUserGet(w http.ResponseWriter, r *http.Request, user database.User) {
|
|
|
|
if err := json.NewEncoder(w).Encode(user); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
godotenv.Load()
|
|
|
|
port := os.Getenv("PORT")
|
|
|
|
dbURL := os.Getenv("CONN")
|
|
db, err := sql.Open("postgres", dbURL)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
dbQueries := database.New(db)
|
|
|
|
cfg := apiConfig{
|
|
DB: dbQueries,
|
|
}
|
|
|
|
mux := http.NewServeMux()
|
|
fmt.Println("Listeneing on port:", port)
|
|
fmt.Println("Sending request to db on:", dbURL)
|
|
|
|
mux.HandleFunc("/v1/user", cfg.middlewareAuth(cfg.handlerUserCreate))
|
|
|
|
mux.HandleFunc("/v1/user", cfg.middlewareAuth(cfg.handlerUsersGet))
|
|
mux.HandleFunc("/v1/healthz", func(w http.ResponseWriter, _ *http.Request) {
|
|
respondWithJSON(w, 200, "{\n\"status\": \"ok\"\n}")
|
|
|
|
})
|
|
|
|
mux.HandleFunc("/v1/err", func(w http.ResponseWriter, r *http.Request) {
|
|
respondWithError(w, 500, "{\n\"error\":\"Internal Server Error\"\n}")
|
|
})
|
|
http.ListenAndServe(fmt.Sprintf(":%s", port), mux)
|
|
|
|
}
|