gimmich

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

main.go (2199B)


      1 package main
      2 
      3 import (
      4 	"encoding/json"
      5 	"log"
      6 	"log/slog"
      7 	"net/http"
      8 
      9 	"github.com/google/uuid"
     10 )
     11 
     12 //go:generate curl -SsL -o immich-openapi-specs.json https://github.com/immich-app/immich/raw/refs/tags/v3.0.3/open-api/immich-openapi-specs.json
     13 //go:generate go tool oapi-codegen -config cfg.yaml immich-openapi-specs.json
     14 
     15 const address = "127.0.0.1:8080"
     16 
     17 func main() {
     18 	log.Printf("Starting gimmich on %s", address)
     19 	log.Fatal(http.ListenAndServe(address, Handler(&MyServer{})))
     20 }
     21 
     22 func doReadJsonRequestOrSendErr[k any](w http.ResponseWriter, r *http.Request, p *k) (*k, error) {
     23 	err := json.NewDecoder(r.Body).Decode(p)
     24 	if err != nil {
     25 		badRequest(w)
     26 		return nil, err
     27 	}
     28 	return p, nil
     29 }
     30 
     31 func doWriteJsonResponse(w http.ResponseWriter, o any) {
     32 	doWriteResponse(w, func(w http.ResponseWriter) error {
     33 		return json.NewEncoder(w).Encode(o)
     34 	})
     35 }
     36 
     37 func doWriteResponse(w http.ResponseWriter, f func(w http.ResponseWriter) error) {
     38 	err := f(w)
     39 	if err != nil {
     40 		slog.Error("error writing response", "err", err.Error())
     41 	}
     42 }
     43 
     44 func badRequest(w http.ResponseWriter) {
     45 	w.WriteHeader(400)
     46 	doWriteResponse(w, func(w http.ResponseWriter) error {
     47 		_, err := w.Write([]byte("bad request"))
     48 		return err
     49 	})
     50 }
     51 
     52 func must[E any](f func() (E, error)) E {
     53 	e, err := f()
     54 	if err != nil {
     55 		log.Fatal(err)
     56 	}
     57 	return e
     58 }
     59 
     60 type MyServer struct{}
     61 
     62 // Login implements [ServerInterface].
     63 func (m *MyServer) Login(w http.ResponseWriter, r *http.Request) {
     64 	lrb, err := doReadJsonRequestOrSendErr(w, r, &LoginJSONRequestBody{})
     65 	if err != nil {
     66 		return
     67 	}
     68 	if lrb.Email == "martin@mfashby.net" && lrb.Password == "P@55word" {
     69 		u := must(func() (uuid.UUID, error) { return uuid.Parse("8e251dd2-2d10-484b-bdc3-0128d855f204") })
     70 		doWriteJsonResponse(w, LoginResponseDto{
     71 			AccessToken:          "foobar",
     72 			IsAdmin:              true,
     73 			IsOnboarded:          true,
     74 			Name:                 "Martin Ashby",
     75 			ProfileImagePath:     "",
     76 			ShouldChangePassword: false,
     77 			UserEmail:            "martin@mfashby.net",
     78 			UserId:               u,
     79 		})
     80 	} else {
     81 		w.WriteHeader(401)
     82 		doWriteResponse(w, func(w http.ResponseWriter) error {
     83 			_, e := w.Write([]byte("unauthorized"))
     84 			return e
     85 		})
     86 	}
     87 }