package router import ( "github.com/labstack/echo/v5" "github.com/pocketbase/pocketbase/apis" "github.com/pocketbase/pocketbase/core" "github.com/pocketbase/pocketbase/daos" "github.com/pocketbase/pocketbase/forms" "github.com/pocketbase/pocketbase/models" ) func (r *RouterContainer) bootstrapRegistrationRoute() { r.PB.OnBeforeServe().Add(func(e *core.ServeEvent) error { e.Router.POST("/registration", func(c echo.Context) error { requestData := struct { Name string `json:"name"` Phone string `json:"phone"` Gender string `json:"gender"` AgeGroup string `json:"age_group"` ParticipantType string `json:"participant_type"` }{} if err := c.Bind(&requestData); err != nil { return apis.NewBadRequestError("Failed to read request data", err) } if err := r.PB.Dao().RunInTransaction(func(txDao *daos.Dao) error { address, err := r.ussd.GetAddress(c.Request().Context(), requestData.Phone) if err != nil { return err } if address == "" { return apis.NewNotFoundError("Phone # not registered on Sarafu Network", nil) } usersCollection, err := r.PB.Dao().FindCollectionByNameOrId("users") if err != nil { return err } userRecord := models.NewRecord(usersCollection) userForm := forms.NewRecordUpsert(r.PB, userRecord) userForm.SetDao(txDao) userForm.LoadData(map[string]any{ "name": requestData.Name, "phone": requestData.Phone, "gender": requestData.Gender, "age_group": requestData.AgeGroup, "participant_type": requestData.ParticipantType, "blockchain_address": address, "activated": true, }) if err := userForm.Submit(); err != nil { return apis.NewBadRequestError("Failed to submit user details", err) } return nil }); err != nil { c.JSON(400, map[string]any{"ok": "false", "error": err.Error()}) return nil } c.JSON(200, map[string]any{"ok": "true"}) return nil }) return nil }) }