init
This commit is contained in:
89
api/service/tenant_scope.js
Normal file
89
api/service/tenant_scope.js
Normal file
@@ -0,0 +1,89 @@
|
||||
/**
|
||||
* 管理端多租户:从当前登录 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,
|
||||
};
|
||||
Reference in New Issue
Block a user