package main import ( "encoding/json" "net/http" "time" "inou/lib" ) type DossierResponse struct { ID string `json:"id"` Name string `json:"name"` DOB string `json:"dob"` Found bool `json:"found"` WeightUnit string `json:"weight_unit,omitempty"` HeightUnit string `json:"height_unit,omitempty"` IsProvider bool `json:"is_provider,omitempty"` ProviderName string `json:"provider_name,omitempty"` AwayEnabled bool `json:"away_enabled,omitempty"` AwayMessage string `json:"away_message,omitempty"` } type DossierCreateRequest struct { Email string `json:"email"` InvitedBy string `json:"invited_by"` } func handleDossier(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") if r.Method == "POST" { handleDossierCreate(w, r) return } dossierHex := r.URL.Query().Get("dossier") email := r.URL.Query().Get("email") var d *lib.Dossier var err error // Note: This is the login/registration endpoint if dossierHex != "" { d, err = lib.DossierGet("", dossierHex) } else if email != "" { if id, ok := lib.DossierExists(email); ok { d, err = lib.DossierGet("", id) } } else { http.Error(w, "dossier or email parameter required", http.StatusBadRequest) return } if err != nil || d == nil { json.NewEncoder(w).Encode(DossierResponse{Found: false}) return } json.NewEncoder(w).Encode(DossierResponse{ ID: d.DossierID, Name: d.Name, DOB: d.DateOfBirth, Found: true, WeightUnit: d.Preferences.WeightUnit, HeightUnit: d.Preferences.HeightUnit, IsProvider: d.Preferences.IsProvider, ProviderName: d.Preferences.ProviderName, AwayEnabled: d.Preferences.AwayEnabled, AwayMessage: d.Preferences.AwayMessage, }) } func handleDossierCreate(w http.ResponseWriter, r *http.Request) { var req DossierCreateRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { http.Error(w, "invalid request", http.StatusBadRequest) return } if req.Email == "" { http.Error(w, "email required", http.StatusBadRequest) return } // Check if already exists if existingID, ok := lib.DossierExists(req.Email); ok { json.NewEncoder(w).Encode(map[string]interface{}{ "id": existingID, "exists": true, }) return } // Create new dossier d := &lib.Dossier{ Email: req.Email, CreatedAt: time.Now().Unix(), } if req.InvitedBy != "" { d.InvitedByDossierID = req.InvitedBy } if err := lib.DossierWrite("", d); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } json.NewEncoder(w).Encode(map[string]interface{}{ "id": d.DossierID, "exists": false, }) }