58 lines
1.9 KiB
TypeScript
58 lines
1.9 KiB
TypeScript
/* eslint-disable */
|
|
// [TSM.ID].[11031972] -- All Rights Reserved. Proprietary & Confidential.
|
|
import { NextResponse } from 'next/server';
|
|
import { Pool } from 'pg';
|
|
import jwt from 'jsonwebtoken';
|
|
import { cookies } from 'next/headers';
|
|
|
|
const pool = new Pool({
|
|
connectionString: process.env.DATABASE_URL || 'postgresql://jumpa_admin:JumpaS3cur3%21%40%23@127.0.0.1:5432/jumpadb',
|
|
});
|
|
|
|
export async function GET(req: Request) {
|
|
try {
|
|
const cookieStore = await cookies();
|
|
const token = cookieStore.get('jumpa_token')?.value;
|
|
|
|
if (!token) {
|
|
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
|
|
}
|
|
|
|
let decoded: any;
|
|
try {
|
|
decoded = jwt.verify(token, process.env.JWT_SECRET as string);
|
|
} catch (e) {
|
|
return NextResponse.json({ error: 'Invalid Token' }, { status: 401 });
|
|
}
|
|
|
|
const currentUserEmail = decoded.email;
|
|
const currentTenantId = decoded.tenantId;
|
|
const allowCrossGroup = decoded.allowCrossGroup === true;
|
|
|
|
// ALGORITMA ISOLASI MULTI-TENANT (CLOSED GROUP)
|
|
let result;
|
|
if (allowCrossGroup) {
|
|
// Cross Group Aktif: Bisa lihat sesama tenant + tenant lain yang juga open
|
|
result = await pool.query(`
|
|
SELECT u.email, u.role, u.tenant_id
|
|
FROM users u
|
|
JOIN tenants t ON u.tenant_id = t.id
|
|
WHERE u.email != $1 AND (u.tenant_id = $2 OR t.allow_cross_group = true)
|
|
`, [currentUserEmail, currentTenantId]);
|
|
} else {
|
|
// Closed Group Aktif (Default Enterprise): HANYA bisa lihat orang di perusahaan yang sama
|
|
result = await pool.query(`
|
|
SELECT email, role, tenant_id
|
|
FROM users
|
|
WHERE email != $1 AND tenant_id = $2
|
|
`, [currentUserEmail, currentTenantId]);
|
|
}
|
|
|
|
return NextResponse.json({ users: result.rows }, { status: 200 });
|
|
} catch (error) {
|
|
console.error('[API USERS ERROR]', error);
|
|
return NextResponse.json({ error: 'Internal Server Error' }, { status: 500 });
|
|
}
|
|
}
|
|
|