style: clean up code formatting and remove trailing whitespace
refactor: reorganize imports and fix type imports
This commit is contained in:
1 parent
d3704602fd
commit
47c04de6fe
232 files changed
+7140
-4798
No files matched your search
+45
-45
@@ -96,7 +96,7 @@ export interface MarketplaceStats {
|
||||
* Registra um evento de telemetria
|
||||
*/
|
||||
export async function trackEvent(
|
||||
data: TrackEventData
|
||||
data: TrackEventData,
|
||||
): Promise<TelemetryEvent> {
|
||||
const result = await query<TelemetryEvent>(
|
||||
`
|
||||
@@ -112,7 +112,7 @@ export async function trackEvent(
|
||||
data.user_id || null,
|
||||
data.session_id || null,
|
||||
JSON.stringify(data.metadata || {}),
|
||||
]
|
||||
],
|
||||
);
|
||||
|
||||
return result.rows[0];
|
||||
@@ -122,7 +122,7 @@ export async function trackEvent(
|
||||
* Registra múltiplos eventos em batch
|
||||
*/
|
||||
export async function trackEventsBatch(
|
||||
events: TrackEventData[]
|
||||
events: TrackEventData[],
|
||||
): Promise<TelemetryEvent[]> {
|
||||
if (events.length === 0) return [];
|
||||
|
||||
@@ -132,14 +132,14 @@ export async function trackEventsBatch(
|
||||
|
||||
for (const event of events) {
|
||||
placeholders.push(
|
||||
`($${paramIndex}, $${paramIndex + 1}, $${paramIndex + 2}, $${paramIndex + 3}, $${paramIndex + 4})`
|
||||
`($${paramIndex}, $${paramIndex + 1}, $${paramIndex + 2}, $${paramIndex + 3}, $${paramIndex + 4})`,
|
||||
);
|
||||
values.push(
|
||||
event.event_type,
|
||||
event.ad_id || null,
|
||||
event.user_id || null,
|
||||
event.session_id || null,
|
||||
JSON.stringify(event.metadata || {})
|
||||
JSON.stringify(event.metadata || {}),
|
||||
);
|
||||
paramIndex += 5;
|
||||
}
|
||||
@@ -152,7 +152,7 @@ export async function trackEventsBatch(
|
||||
VALUES ${placeholders.join(", ")}
|
||||
RETURNING *
|
||||
`,
|
||||
values
|
||||
values,
|
||||
);
|
||||
|
||||
return result.rows;
|
||||
@@ -161,13 +161,15 @@ export async function trackEventsBatch(
|
||||
/**
|
||||
* Busca analytics de um anúncio específico
|
||||
*/
|
||||
export async function getAdAnalytics(adId: number): Promise<AdAnalytics | null> {
|
||||
export async function getAdAnalytics(
|
||||
adId: number,
|
||||
): Promise<AdAnalytics | null> {
|
||||
const result = await query<AdAnalytics>(
|
||||
`
|
||||
SELECT * FROM ad_analytics
|
||||
WHERE ad_id = $1
|
||||
`,
|
||||
[adId]
|
||||
[adId],
|
||||
);
|
||||
|
||||
return result.rows[0] || null;
|
||||
@@ -179,21 +181,20 @@ export async function getAdAnalytics(adId: number): Promise<AdAnalytics | null>
|
||||
export async function getUserBehavior(
|
||||
userId: number,
|
||||
startDate?: Date,
|
||||
endDate?: Date
|
||||
endDate?: Date,
|
||||
): Promise<UserBehavior | null> {
|
||||
// Verificar se usuário existe
|
||||
const userCheck = await query<{ user_id: number }>(
|
||||
"SELECT user_id FROM users WHERE user_id = $1",
|
||||
[userId]
|
||||
[userId],
|
||||
);
|
||||
|
||||
if (userCheck.rows.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const dateFilter = startDate && endDate
|
||||
? "AND timestamp BETWEEN $2 AND $3"
|
||||
: "";
|
||||
const dateFilter =
|
||||
startDate && endDate ? "AND timestamp BETWEEN $2 AND $3" : "";
|
||||
|
||||
const params: any[] = [userId];
|
||||
if (startDate && endDate) {
|
||||
@@ -207,7 +208,7 @@ export async function getUserBehavior(
|
||||
FROM telemetry_events
|
||||
WHERE user_id = $1 AND event_type = 'search' ${dateFilter}
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
// Buscar filtros aplicados
|
||||
@@ -217,7 +218,7 @@ export async function getUserBehavior(
|
||||
FROM telemetry_events
|
||||
WHERE user_id = $1 AND event_type = 'filter' ${dateFilter}
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
// Buscar itens visualizados
|
||||
@@ -232,7 +233,7 @@ export async function getUserBehavior(
|
||||
WHERE user_id = $1 AND event_type = 'ad_view' AND ad_id IS NOT NULL ${dateFilter}
|
||||
ORDER BY timestamp DESC
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
// Buscar favoritos
|
||||
@@ -242,7 +243,7 @@ export async function getUserBehavior(
|
||||
FROM telemetry_events
|
||||
WHERE user_id = $1 AND event_type = 'favorite' AND ad_id IS NOT NULL ${dateFilter}
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
// Buscar compras
|
||||
@@ -257,7 +258,7 @@ export async function getUserBehavior(
|
||||
WHERE user_id = $1 AND event_type = 'purchase' AND ad_id IS NOT NULL ${dateFilter}
|
||||
ORDER BY timestamp DESC
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
// Buscar horas ativas
|
||||
@@ -272,18 +273,18 @@ export async function getUserBehavior(
|
||||
GROUP BY hour
|
||||
ORDER BY hour
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
// Buscar item_id dos anúncios visualizados
|
||||
const itemIds = await query<{ item_id: number }>(
|
||||
const _itemIds = await query<{ item_id: number }>(
|
||||
`
|
||||
SELECT DISTINCT l.item_id
|
||||
FROM telemetry_events te
|
||||
JOIN listings l ON l.listing_id = te.ad_id
|
||||
WHERE te.user_id = $1 AND te.event_type = 'ad_view' AND te.ad_id IS NOT NULL ${dateFilter}
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
return {
|
||||
@@ -317,11 +318,10 @@ export async function getUserBehavior(
|
||||
*/
|
||||
export async function getMarketplaceStats(
|
||||
startDate?: Date,
|
||||
endDate?: Date
|
||||
endDate?: Date,
|
||||
): Promise<MarketplaceStats> {
|
||||
const dateFilter = startDate && endDate
|
||||
? "WHERE timestamp BETWEEN $1 AND $2"
|
||||
: "";
|
||||
const dateFilter =
|
||||
startDate && endDate ? "WHERE timestamp BETWEEN $1 AND $2" : "";
|
||||
const params = startDate && endDate ? [startDate, endDate] : [];
|
||||
|
||||
// Total de transações
|
||||
@@ -331,7 +331,7 @@ export async function getMarketplaceStats(
|
||||
FROM telemetry_events
|
||||
WHERE event_type = 'purchase' ${dateFilter.replace("timestamp", "timestamp")}
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
// Preço médio por categoria (requer join com listings)
|
||||
@@ -349,7 +349,7 @@ export async function getMarketplaceStats(
|
||||
GROUP BY l.item_name
|
||||
LIMIT 10
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
// Taxa de conversão
|
||||
@@ -359,7 +359,7 @@ export async function getMarketplaceStats(
|
||||
FROM telemetry_events
|
||||
WHERE event_type = 'ad_view' ${dateFilter}
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
const purchases = await query<{ count: string }>(
|
||||
@@ -368,12 +368,13 @@ export async function getMarketplaceStats(
|
||||
FROM telemetry_events
|
||||
WHERE event_type = 'purchase' ${dateFilter}
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
const viewsCount = parseInt(views.rows[0]?.count || "0", 10);
|
||||
const purchasesCount = parseInt(purchases.rows[0]?.count || "0", 10);
|
||||
const conversionRate = viewsCount > 0 ? (purchasesCount / viewsCount) * 100 : 0;
|
||||
const conversionRate =
|
||||
viewsCount > 0 ? (purchasesCount / viewsCount) * 100 : 0;
|
||||
|
||||
// Itens mais procurados
|
||||
const mostSearched = await query<{
|
||||
@@ -390,7 +391,7 @@ export async function getMarketplaceStats(
|
||||
ORDER BY COUNT(*) DESC
|
||||
LIMIT 10
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
// Itens mais vendidos
|
||||
@@ -411,7 +412,7 @@ export async function getMarketplaceStats(
|
||||
ORDER BY COUNT(*) DESC
|
||||
LIMIT 10
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
// Horários de pico
|
||||
@@ -429,7 +430,7 @@ export async function getMarketplaceStats(
|
||||
ORDER BY COUNT(*) DESC
|
||||
LIMIT 10
|
||||
`,
|
||||
params
|
||||
params,
|
||||
);
|
||||
|
||||
// Tempo médio para venda
|
||||
@@ -441,7 +442,7 @@ export async function getMarketplaceStats(
|
||||
FROM ad_analytics aa
|
||||
WHERE aa.time_to_sell IS NOT NULL
|
||||
`,
|
||||
[]
|
||||
[],
|
||||
);
|
||||
|
||||
return {
|
||||
@@ -451,7 +452,7 @@ export async function getMarketplaceStats(
|
||||
acc[r.category] = parseFloat(r.avg_price);
|
||||
return acc;
|
||||
},
|
||||
{} as Record<string, number>
|
||||
{} as Record<string, number>,
|
||||
),
|
||||
conversion_rate: conversionRate,
|
||||
most_searched_items: mostSearched.rows.map((r) => ({
|
||||
@@ -493,7 +494,7 @@ export async function aggregateHourlyMetrics(): Promise<void> {
|
||||
ON CONFLICT (ad_id) DO UPDATE SET
|
||||
impressions = ad_analytics.impressions + EXCLUDED.impressions,
|
||||
last_updated = CURRENT_TIMESTAMP
|
||||
`
|
||||
`,
|
||||
);
|
||||
|
||||
// Agregar cliques
|
||||
@@ -511,7 +512,7 @@ export async function aggregateHourlyMetrics(): Promise<void> {
|
||||
GROUP BY ad_id
|
||||
) sub
|
||||
WHERE aa.ad_id = sub.ad_id
|
||||
`
|
||||
`,
|
||||
);
|
||||
|
||||
// Atualizar CTR (Click-Through Rate)
|
||||
@@ -524,7 +525,7 @@ export async function aggregateHourlyMetrics(): Promise<void> {
|
||||
END,
|
||||
last_updated = CURRENT_TIMESTAMP
|
||||
WHERE impressions > 0
|
||||
`
|
||||
`,
|
||||
);
|
||||
|
||||
// Agregar duração média de visualização
|
||||
@@ -550,7 +551,7 @@ export async function aggregateHourlyMetrics(): Promise<void> {
|
||||
AND ad_id = aa.ad_id
|
||||
AND timestamp >= NOW() - INTERVAL '1 hour'
|
||||
)
|
||||
`
|
||||
`,
|
||||
);
|
||||
|
||||
// Calcular bounce rate (views com duração < 3 segundos)
|
||||
@@ -572,7 +573,7 @@ export async function aggregateHourlyMetrics(): Promise<void> {
|
||||
END,
|
||||
last_updated = CURRENT_TIMESTAMP
|
||||
WHERE aa.impressions > 0
|
||||
`
|
||||
`,
|
||||
);
|
||||
|
||||
// Agregar inquiries
|
||||
@@ -590,7 +591,7 @@ export async function aggregateHourlyMetrics(): Promise<void> {
|
||||
GROUP BY ad_id
|
||||
) sub
|
||||
WHERE aa.ad_id = sub.ad_id
|
||||
`
|
||||
`,
|
||||
);
|
||||
|
||||
// Agregar favoritos
|
||||
@@ -608,7 +609,7 @@ export async function aggregateHourlyMetrics(): Promise<void> {
|
||||
GROUP BY ad_id
|
||||
) sub
|
||||
WHERE aa.ad_id = sub.ad_id
|
||||
`
|
||||
`,
|
||||
);
|
||||
|
||||
// Calcular taxa de conversão
|
||||
@@ -634,7 +635,7 @@ export async function aggregateHourlyMetrics(): Promise<void> {
|
||||
AND ad_id = aa.ad_id
|
||||
AND timestamp >= NOW() - INTERVAL '1 hour'
|
||||
)
|
||||
`
|
||||
`,
|
||||
);
|
||||
|
||||
// Calcular time_to_sell para anúncios vendidos
|
||||
@@ -650,7 +651,6 @@ export async function aggregateHourlyMetrics(): Promise<void> {
|
||||
AND l.sold_at IS NOT NULL
|
||||
AND aa.time_to_sell IS NULL
|
||||
AND l.sold_at >= NOW() - INTERVAL '1 hour'
|
||||
`
|
||||
`,
|
||||
);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user