commit 1272ddcbd18b36f73d7a57cf1d5bbf9ca03d7d41
parent 396ef7bcf271ceceec91f435e4b625225dbe55ff
Author: Martin Ashby <martin@ashbysoft.com>
Date: Mon, 28 Sep 2026 20:31:53 +0100
wip
Diffstat:
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].