I have a method to create a row in a database its created successfuly but the problem in returning value I need to join another table in dynamic way using slonik
Notice: normal join cause some trouble as I have column in both table with the same name
here is a sample of my code
function createTicketAgent(connection: DatabaseTransactionConnectionType) {
return async (options: CreateTicketAgentOptions) => {
const id = (await connection.oneFirst(
sql`SELECT nextval('ticket_agent_sequence')`
)) as number;
const converted = convertTicketAgentDataIn(
{ ...options.data, id },
options.adminId
);
const data = dataToInsertSql(converted);
const selection = ticketAgentSelectionSql(options.selection);
const query = sql`
INSERT INTO ticket_agent ${data}
RETURNING ${selection}
`;
const result = await connection.maybeOne(query);
return convertTicketAgentDataOut(result);
};
}
export function dataToInsertSql<T extends object>(data: T): SqlSqlTokenType {
var firstItem = Array.isArray(data) ? data[0] : data;
const entries = Object.entries(firstItem).sort();
const columns = entries.map(([key, value]) => key);
const values = entries.map(([key, value]) => value);
return sql`(${listToIdentifiersSql(columns)}) VALUES (${listToValuesSql(
values
)})`;
}
export function listToIdentifiersSql(values: string[]) {
const columns = values.map((column) => sql.identifier(column.split(".")));
return sql`${sql.join(columns, sql`, `)}`;
}
const ticketAgentSelectionSql = (selection: string[] | undefined) =>
selectionToSql(mapSelection(reverseMapping(mapping), selection));
export function selectionToSql<S extends SelectionSet<any>>(selection?: S) {
if (selection === undefined || selection.length === 0) {
return sql`*`;
}
const identifiers = selection.map((column) =>
sql.identifier(column.split("."))
);
const selectList = sql.join(identifiers, sql`, `);
return sql`${selectList}`;
}
export function listToValuesSql(values: any[], unique: boolean = false) {
let converted = values.map((value) =>
Array.isArray(value)
? `{${value}}`
: value instanceof DateTime
? value.toSQL()
: value
);
if (unique) {
const uniqueSet = new Set<any>();
converted.forEach((value) => {
uniqueSet.add(value);
});
return sql`${sql.join([...uniqueSet], sql`, `)}`;
} else {
return sql`${sql.join(converted, sql`, `)}`;
}
}