gimmich

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

commit 1272ddcbd18b36f73d7a57cf1d5bbf9ca03d7d41
parent 396ef7bcf271ceceec91f435e4b625225dbe55ff
Author: Martin Ashby <martin@ashbysoft.com>
Date:   Mon, 28 Sep 2026 20:31:53 +0100

wip

Diffstat:
M.gitignore | 4++--
Dgimmich | 0
Mmain.go | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
3 files changed, 66 insertions(+), 6 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,2 +1,3 @@ gen.go -immich-openapi-specs.json -\ No newline at end of file +immich-openapi-specs.jsongimmich +immich-openapi-specs.json diff --git a/gimmich b/gimmich Binary files differ. diff --git a/main.go b/main.go @@ -1,18 +1,53 @@ package main import ( + "encoding/json" "log" + "log/slog" "net/http" + "github.com/google/uuid" "github.com/oapi-codegen/runtime/types" ) //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 //go:generate go tool oapi-codegen -config cfg.yaml immich-openapi-specs.json +const address = "0.0.0.0:8080" + func main() { - println("Hello, World") - log.Fatal(http.ListenAndServe("0.0.0.0:8080", Handler(&MyServer{}))) + log.Printf("Starting gimmich on %s", address) + log.Fatal(http.ListenAndServe(address, Handler(&MyServer{}))) +} + +func doReadJsonRequestOrSendErr[k any](w http.ResponseWriter, r *http.Request, p *k) (*k, error) { + err := json.NewDecoder(r.Body).Decode(p) + if err != nil { + badRequest(w) + return nil, err + } + return p, nil +} + +func doWriteJsonResponse(w http.ResponseWriter, o any) { + doWriteResponse(w, func(w http.ResponseWriter) error { + return json.NewEncoder(w).Encode(o) + }) +} + +func doWriteResponse(w http.ResponseWriter, f func (w http.ResponseWriter) error) { + err := f(w) + if err != nil { + slog.Error("error writing response", "err", err.Error()) + } +} + +func badRequest(w http.ResponseWriter) { + w.WriteHeader(400) + doWriteResponse(w, func (w http.ResponseWriter) error { + _, err := w.Write([]byte("bad request")) + return err + }) } type MyServer struct{} @@ -574,7 +609,10 @@ func (m *MyServer) GetMySharedLink(w http.ResponseWriter, r *http.Request, param // GetMyUser implements [ServerInterface]. func (m *MyServer) GetMyUser(w http.ResponseWriter, r *http.Request) { - panic("unimplemented") + res := UserAdminResponseDto{} + doWriteResponse(w, func(w http.ResponseWriter) error { + return json.NewEncoder(w).Encode(res) + }) } // GetNotification implements [ServerInterface]. @@ -834,7 +872,29 @@ func (m *MyServer) LockSession(w http.ResponseWriter, r *http.Request, id types. // Login implements [ServerInterface]. func (m *MyServer) Login(w http.ResponseWriter, r *http.Request) { - panic("unimplemented") + lrb, err := doReadJsonRequestOrSendErr(w, r, &LoginJSONRequestBody{}) + if err != nil { + return + } + if lrb.Email == "martin@mfashby.net" && lrb.Password == "P@55word" { + u, _ := uuid.Parse("8e251dd2-2d10-484b-bdc3-0128d855f204") + doWriteJsonResponse(w, LoginResponseDto{ + AccessToken: "foobar", + IsAdmin: true, + IsOnboarded: true, + Name: "Martin Ashby", + ProfileImagePath: "", + ShouldChangePassword: false, + UserEmail: "martin@mfashby.net", + UserId: u, + }) + } else { + w.WriteHeader(401) + doWriteResponse(w, func(w http.ResponseWriter) error { + _, e := w.Write([]byte("unauthorized")) + return e + }) + } } // Logout implements [ServerInterface].