feat(gps): фильтры heartbeat-эхо/valid=false/spike; доступ к GPS и Финансам — матрица на /users (пользователи+роли)

This commit is contained in:
2026-08-26 17:13:49 +03:00
parent 2fb7ad6606
commit ac4f89d42e
16 changed files with 431 additions and 227 deletions

View File

@@ -9,8 +9,6 @@ import {
gpsGroupAssets,
gpsAssetSubscribers,
gpsSettings,
roles,
roleMembers,
type GpsAsset,
type GpsPosition,
type GpsGeozone,
@@ -471,8 +469,6 @@ export class GpsStorage {
defaultLat: number | null;
defaultLng: number | null;
defaultZoom: number | null;
allowedUserIds: number[] | null;
allowedRoleIds: number[] | null;
}> {
const [row] = await db
.select()
@@ -485,8 +481,6 @@ export class GpsStorage {
defaultLat: row?.defaultLat ?? null,
defaultLng: row?.defaultLng ?? null,
defaultZoom: row?.defaultZoom ?? null,
allowedUserIds: row?.allowedUserIds ?? null,
allowedRoleIds: row?.allowedRoleIds ?? null,
};
}
@@ -499,8 +493,6 @@ export class GpsStorage {
defaultLat: number | null;
defaultLng: number | null;
defaultZoom: number | null;
allowedUserIds: number[] | null;
allowedRoleIds: number[] | null;
}
): Promise<GpsSettings> {
const [row] = await db
@@ -513,16 +505,6 @@ export class GpsStorage {
.returning();
return row;
}
/** Организационные роли пользователя (через role_members) в рамках организации */
async getUserRoleIds(userId: number, organizationId: number): Promise<number[]> {
const rows = await db
.select({ roleId: roleMembers.roleId })
.from(roleMembers)
.innerJoin(roles, eq(roleMembers.roleId, roles.id))
.where(and(eq(roleMembers.userId, userId), eq(roles.organizationId, organizationId)));
return rows.map((r) => r.roleId);
}
}
export const gpsStorage = new GpsStorage();