- Create new @link-stack/logger package wrapping Pino for structured logging - Replace all console.log/error/warn statements across the monorepo - Configure environment-aware logging (pretty-print in dev, JSON in prod) - Add automatic redaction of sensitive fields (passwords, tokens, etc.) - Remove dead commented-out logger file from bridge-worker - Follow Pino's standard argument order (context object first, message second) - Support log levels via LOG_LEVEL environment variable - Export TypeScript types for better IDE support This provides consistent, structured logging across all applications and packages, making debugging easier and production logs more parseable.
70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
"use server";
|
|
|
|
import { executeREST } from "app/_lib/zammad";
|
|
import { createLogger } from "@link-stack/logger";
|
|
|
|
const logger = createLogger('link-users');
|
|
|
|
export const getAgentsAction = async (groupID: number) => {
|
|
try {
|
|
const group = await executeREST({
|
|
path: `/api/v1/groups/${groupID}`,
|
|
});
|
|
const { user_ids: groupUserIDs } = group;
|
|
const path = `/api/v1/users/search?query=role_ids:2&limit=1000`;
|
|
const users = await executeREST({ path });
|
|
const agents =
|
|
users?.filter((user: any) => groupUserIDs.includes(user.id)) ?? [];
|
|
const formattedAgents = agents
|
|
.map((agent: any) => ({
|
|
label: `${agent.firstname} ${agent.lastname}`,
|
|
value: `gid://zammad/User/${agent.id}`,
|
|
}))
|
|
.sort((a: any, b: any) => a.label.localeCompare(b.label));
|
|
|
|
return formattedAgents;
|
|
} catch (e) {
|
|
logger.error({ error: e }, "Error occurred");
|
|
return [];
|
|
}
|
|
};
|
|
|
|
export const getCustomersAction = async () => {
|
|
try {
|
|
const users = await executeREST({
|
|
path: "/api/v1/users",
|
|
});
|
|
const customers =
|
|
users?.filter((user: any) => user.role_ids.includes(3)) ?? [];
|
|
const formattedCustomers = customers
|
|
.map((customer: any) => ({
|
|
label: customer.login,
|
|
value: `gid://zammad/User/${customer.id}`,
|
|
}))
|
|
.sort((a: any, b: any) => a.label.localeCompare(b.label));
|
|
|
|
return formattedCustomers;
|
|
} catch (e) {
|
|
logger.error({ error: e }, "Error occurred");
|
|
return [];
|
|
}
|
|
};
|
|
|
|
export const getUsersAction = async () => {
|
|
try {
|
|
const users = await executeREST({
|
|
path: "/api/v1/users",
|
|
});
|
|
const formattedUsers = users
|
|
.map((customer: any) => ({
|
|
label: customer.login,
|
|
value: `gid://zammad/User/${customer.id}`,
|
|
}))
|
|
.sort((a: any, b: any) => a.label.localeCompare(b.label));
|
|
|
|
return formattedUsers;
|
|
} catch (e) {
|
|
logger.error({ error: e }, "Error occurred");
|
|
return [];
|
|
}
|
|
};
|