Files
framework_project_web/api/service/tenant_scope.js
张成 dee3a336ce init
2026-04-29 13:34:39 +08:00

90 lines
2.5 KiB
JavaScript

/**
* 管理端多租户:从当前登录 sys_user 解析 tenant_id
*/
const { sys_user } = require("../../middleware/baseModel");
/**
* @param {import('koa').Context} ctx
* @returns {Promise<{ tenantId: number|null, userId: number|null }>}
*/
async function getAdminTenantContext(ctx) {
let uid_raw = null;
try {
uid_raw = ctx.getAdminUserId && ctx.getAdminUserId();
} catch (e) {
uid_raw = null;
}
if (uid_raw === null || uid_raw === undefined || uid_raw === "") {
return { tenantId: null, userId: null };
}
const user_id = Number(uid_raw);
if (!Number.isFinite(user_id) || user_id <= 0) {
return { tenantId: null, userId: null };
}
if (!sys_user) {
return { tenantId: null, userId: user_id };
}
const row = await sys_user.findByPk(user_id, {
attributes: ["id", "tenant_id"],
raw: true,
});
const tid_raw = row && row.tenant_id;
const tenant_id = tid_raw != null && tid_raw !== "" ? Number(tid_raw) : null;
const tenant_ok = tenant_id != null && Number.isFinite(tenant_id) && tenant_id > 0;
return { tenantId: tenant_ok ? tenant_id : null, userId: user_id };
}
/**
* @param {import('sequelize').Model} model
* @param {object} where
* @param {number} tenant_id
*/
function mergeTenantWhere(model, where, tenant_id) {
if (tenant_id == null || tenant_id === "" || !model || !model.rawAttributes || !model.rawAttributes.tenant_id) {
return where || {};
}
const w = where && typeof where === "object" ? { ...where } : {};
w.tenant_id = tenant_id;
return w;
}
function mergeTenantWhereById(model, id, tenant_id) {
return mergeTenantWhere(model, { id }, tenant_id);
}
/**
* @param {import('koa').Context} ctx
* @returns {Promise<{ tenantId: number, userId: number }|null>}
*/
async function requireTenantContext(ctx) {
const { tenantId, userId } = await getAdminTenantContext(ctx);
if (!tenantId) {
ctx.fail("当前用户未绑定租户,无法操作业务数据");
return null;
}
if (!userId) {
ctx.fail("未登录或登录已失效");
return null;
}
return { tenantId, userId };
}
function stampTenantCreate(body, tenant_id, user_id, opts = {}) {
const out = body && typeof body === "object" ? { ...body } : {};
if (tenant_id != null) {
out.tenant_id = tenant_id;
}
if (opts.setCreateUser !== false && user_id != null) {
out.create_user_id = user_id;
}
return out;
}
module.exports = {
getAdminTenantContext,
requireTenantContext,
stampTenantCreate,
mergeTenantWhere,
mergeTenantWhereById,
};