moved the project to this repository

This commit is contained in:
Timmelmann
2026-08-08 14:38:42 +02:00
commit 33e8a53dc1
12 changed files with 678 additions and 0 deletions
+133
View File
@@ -0,0 +1,133 @@
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)
}