Add Super Admin login flag and expose web tenant onboarding
issuperadmin on app_users (schema change already applied to the DB) is now returned by AppLogin/TenantWebLogin's login response, gated server-side rather than via a client-supplied roleid. Fixes the login enrichment query (GetTenantUserById) to LEFT JOIN app_location instead of INNER JOIN — a tenantless super-admin row was previously silently dropped, so the login "succeeded" but returned an empty struct. Also exposes createtenantuser on the web route group (was mob-only). No repository changes were needed for location auto-provisioning: GORM was already inserting the nested tenantlocations association on tenant creation, it just wasn't reachable from the web. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -59,6 +59,7 @@ type User struct {
|
|||||||
Applocationid int `json:"applocationid"`
|
Applocationid int `json:"applocationid"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
Shiftid int `json:"shiftid"`
|
Shiftid int `json:"shiftid"`
|
||||||
|
Issuperadmin bool `json:"issuperadmin"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type TenantUserInfo struct {
|
type TenantUserInfo struct {
|
||||||
@@ -99,4 +100,5 @@ type TenantUserInfo struct {
|
|||||||
Categoryid int `json:"categoryid"`
|
Categoryid int `json:"categoryid"`
|
||||||
Categoryname string `json:"categoryname"`
|
Categoryname string `json:"categoryname"`
|
||||||
Subcategoryid int `json:"subcategoryid"`
|
Subcategoryid int `json:"subcategoryid"`
|
||||||
|
Issuperadmin bool `json:"issuperadmin"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -213,17 +213,22 @@ func (r *userRepository) UpdateFCMToken(userid int, token string) error {
|
|||||||
func (r *userRepository) GetTenantUserById(userid int) models.TenantUserInfo {
|
func (r *userRepository) GetTenantUserById(userid int) models.TenantUserInfo {
|
||||||
var info models.TenantUserInfo
|
var info models.TenantUserInfo
|
||||||
|
|
||||||
|
// app_location is LEFT JOINed (not INNER) so a user with no matching
|
||||||
|
// tenant/applocation row — e.g. a super admin, tenantid=0 — still comes
|
||||||
|
// back with their own fields (issuperadmin included) instead of the
|
||||||
|
// whole query silently returning zero rows.
|
||||||
query := `
|
query := `
|
||||||
SELECT a.userid,a.authname,a.email,a.configid,a.roleid,a.authmode,a.contactno,
|
SELECT a.userid,a.authname,a.email,a.configid,a.roleid,a.authmode,a.contactno,
|
||||||
a.firstname,a.lastname,concat(a.firstname,' ',a.lastname) as fullname,
|
a.firstname,a.lastname,concat(a.firstname,' ',a.lastname) as fullname,
|
||||||
a.userfcmtoken,a.pin,a.deviceid,a.devicetype,a.tenantid,a.locationid,a.applocationid,
|
a.userfcmtoken,a.pin,a.deviceid,a.devicetype,a.tenantid,a.locationid,a.applocationid,
|
||||||
|
a.issuperadmin,
|
||||||
b.partnerid,b.moduleid,b.categoryid as categoryid,b.subcategoryid as subcategoryid,
|
b.partnerid,b.moduleid,b.categoryid as categoryid,b.subcategoryid as subcategoryid,
|
||||||
b.applocationid,b.tenantname,b.address as tenantaddress,b.state as tenantstate,b.city as tenantcity,
|
b.applocationid,b.tenantname,b.address as tenantaddress,b.state as tenantstate,b.city as tenantcity,
|
||||||
b.postcode as tenantpostcode,b.latitude as tenantlat,b.longitude as tenantlong,c.locationname AS applocation,
|
b.postcode as tenantpostcode,b.latitude as tenantlat,b.longitude as tenantlong,c.locationname AS applocation,
|
||||||
c.latitude as applatitude,c.longitude as applongitude,c.radius as appradius, d.categoryname, e.locationname
|
c.latitude as applatitude,c.longitude as applongitude,c.radius as appradius, d.categoryname, e.locationname
|
||||||
from app_users a
|
from app_users a
|
||||||
LEFT JOIN tenants b ON a.tenantid=b.tenantid
|
LEFT JOIN tenants b ON a.tenantid=b.tenantid
|
||||||
INNER JOIN app_location c on c.applocationid=b.applocationid
|
LEFT JOIN app_location c on c.applocationid=b.applocationid
|
||||||
LEFT JOIN app_category d ON b.categoryid=d.categoryid
|
LEFT JOIN app_category d ON b.categoryid=d.categoryid
|
||||||
LEFT JOIN tenantlocations e ON a.locationid=e.locationid
|
LEFT JOIN tenantlocations e ON a.locationid=e.locationid
|
||||||
WHERE a.userid = ?
|
WHERE a.userid = ?
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ func RegisterTenantRoutes(api fiber.Router, f *facade.Facade) {
|
|||||||
tenant.Delete("/deletelocation", f.TenantController.DeleteLocation)
|
tenant.Delete("/deletelocation", f.TenantController.DeleteLocation)
|
||||||
tenant.Post("/createtenantlocation", f.TenantController.CreateTenantLocation)
|
tenant.Post("/createtenantlocation", f.TenantController.CreateTenantLocation)
|
||||||
tenant.Put("/updatetenantlocation", f.TenantController.UpdateTenantLocation)
|
tenant.Put("/updatetenantlocation", f.TenantController.UpdateTenantLocation)
|
||||||
|
tenant.Post("/createtenantuser", f.TenantController.CreateTenantUser)
|
||||||
|
|
||||||
tenant = api.Group("/v1/mob/tenants")
|
tenant = api.Group("/v1/mob/tenants")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user