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 }