Compare commits

...

2 Commits

Author SHA1 Message Date
d196d56929 user login 2026-07-22 17:42:09 +05:30
58c42d9013 Fix app_users.configid mismatch blocking Staff/Rider first login
UsersPanel.tsx was sending configid: 15 (Staff) / 6 (Rider) when creating
users, copied from an unrelated Hasura "role config" convention. Every
login call (auth.ts) queries app_users with configid: 1, so any account
created with 15/6 could never be found on login and was stuck before it
even reached the password-setup step. Both create paths and the
CreateUserInput default now consistently use configid: 1.

Also fixes getRiderLogs() calling riders/getriderlogs, which 404s since
the backend only registers this route under /partners.
2026-07-22 17:35:07 +05:30
7 changed files with 31 additions and 18 deletions

3
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"css.lint.unknownAtRules": "ignore"
}

View File

@@ -1,3 +1,4 @@
go 1.21
go 1.24
use ..\fiesta-backend\backend_fiesta

View File

@@ -270,8 +270,8 @@ export default function App() {
// Define secondary sections (Stores, Logistics, Staffing, Settings) within main body
const renderStoresSection = () => {
const isSoleStore = !selectedStore && storesList.length === 1;
const activeStore = selectedStore ?? (isSoleStore ? storesList[0] : null);
const isSoleStore = storesList.length === 1;
const activeStore = selectedStore;
if (activeStore) {
return (
@@ -290,7 +290,7 @@ export default function App() {
)}
<StoreDetailView
store={activeStore}
onBack={selectedStore ? () => setSelectedStore(null) : undefined}
onBack={() => setSelectedStore(null)}
tenantId={tenantId}
/>
</div>

View File

@@ -110,7 +110,7 @@ export default function AdminConsole({ activeTab: propActiveTab, showHeader = tr
lastname: '',
email: '',
contactno: '',
password: 'Rider@123',
password: '',
locationid: 0,
shiftid: 0,
vehiclename: '',
@@ -192,15 +192,16 @@ export default function AdminConsole({ activeTab: propActiveTab, showHeader = tr
return;
}
try {
// Create base user with roleid = 3 and configid = 6 (Rider config)
// Create base user with roleid = 5 (Rider) and configid = 1, matching the
// convention login (auth.ts) queries against.
const res = await createUserMut.mutateAsync({
firstname: riderForm.firstname,
lastname: riderForm.lastname,
email: riderForm.email,
contactno: riderForm.contactno,
password: riderForm.password,
roleid: 3,
configid: 6,
roleid: 5,
configid: 1,
tenantid: FIESTA_TENANT_ID,
locationid: Number(riderForm.locationid),
applocationid: 1,
@@ -781,7 +782,7 @@ VALUES (${newUserId}, 1, 'Active', NOW());
lastname: '',
email: '',
contactno: '',
password: 'Rider@123',
password: '',
locationid: 0,
shiftid: 0,
vehiclename: '',
@@ -1456,7 +1457,7 @@ VALUES (${newUserId}, 1, 'Active', NOW());
lastname: '',
email: '',
contactno: '',
password: 'Rider@123',
password: '',
locationid: 0,
shiftid: 0,
vehiclename: '',

View File

@@ -100,7 +100,7 @@ export default function Header({
{/* Dynamic Store Name Context */}
{storeContext && (
<div className="flex flex-col ml-0.5 sm:ml-1 border-l border-white/20 pl-2 sm:pl-3 py-0.5 select-none min-w-0">
<div className="flex flex-col ml-0.5 sm:ml-1 pl-2 sm:pl-3 py-0.5 select-none min-w-0">
<span className="flex items-center gap-1.5 sm:gap-2 text-xs sm:text-base md:text-lg font-bold tracking-tight text-white leading-tight truncate max-w-[110px] xs:max-w-[150px] sm:max-w-none">
{storeContext.icon && <storeContext.icon size={16} className="text-purple-300 shrink-0 hidden xs:inline" />}
<span className="truncate">{storeContext.storeName}</span>

View File

@@ -105,8 +105,12 @@ export default function UsersPanel({ tenantId = FIESTA_TENANT_ID, defaultNewUser
// Selectable roles for the Add User modal - limited to Staff and Rider.
const roleChoices = React.useMemo(() => {
return [
{ id: 4, label: 'Staff', desc: 'Standard store staff duties', icon: User, configid: 15 },
{ id: 5, label: 'Rider', desc: 'Delivery fleet rider', icon: Bike, configid: 6 },
// configid must be 1 here — it's the same app_users.configid column the
// login endpoints filter on (auth.ts hardcodes configid: 1 for every
// login attempt), not the unrelated Hasura "role config" id. Any other
// value means the account can never be found on login.
{ id: 4, label: 'Staff', desc: 'Standard store staff duties', icon: User, configid: 1 },
{ id: 5, label: 'Rider', desc: 'Delivery fleet rider', icon: Bike, configid: 1 },
];
}, []);
@@ -247,7 +251,7 @@ export default function UsersPanel({ tenantId = FIESTA_TENANT_ID, defaultNewUser
email: newUser.email,
contactno: newUser.contactno,
roleid: Number(newUser.roleid),
configid: selectedRole?.configid ?? 15,
configid: selectedRole?.configid ?? 1,
// Store binding — sent exactly as the backend expects so the user is tied
// to the chosen branch (tenantid + locationid + applocationid).
tenantid: tenantId,

View File

@@ -943,7 +943,11 @@ export interface CreateUserInput {
/** Optional — merchant_web's create form doesn't collect one. */
password?: string;
roleid: number;
/** Role config (the selected role's configid) — matches merchant_web's create payload. */
/**
* app_users.configid — the same column every login call filters on
* (auth.ts hardcodes configid: 1). Must stay 1 or the account can never
* be found on login; this is NOT the unrelated Hasura "role config" id.
*/
configid?: number;
/** Business module id (merchant_web sends the logged-in user's; 0 when absent). */
moduleid?: number;
@@ -975,7 +979,7 @@ export async function createUser(input: CreateUserInput): Promise<Row> {
dialcode: input.dialcode ?? '+91',
contactno: input.contactno,
roleid: input.roleid,
configid: input.configid ?? 15,
configid: input.configid ?? 1,
moduleid: input.moduleid ?? 0,
pin: input.pin ?? 0,
address: input.address ?? '',
@@ -1138,7 +1142,7 @@ export async function getRiderPeriodicLogs(opts: {
);
}
/** /riders/getriderlogs?userid=&riderid=&fromdate=&todate=&tenantid=&applocationid= —
/** /partners/getriderlogs?userid=&riderid=&fromdate=&todate=&tenantid=&applocationid= —
* full telemetry logs (GPS traces, events, etc.) for a rider. */
export async function getRiderLogs(opts: {
userid?: number;
@@ -1151,7 +1155,7 @@ export async function getRiderLogs(opts: {
pagesize?: number;
}): Promise<Row[]> {
return toRows(
await fiestaGet('riders/getriderlogs', {
await fiestaGet('partners/getriderlogs', {
userid: opts.userid,
riderid: opts.riderid,
fromdate: opts.fromdate,