Skip to content

Commit 5e50cd2

Browse files
committed
Refactor codebase: update ESLint configuration to ignore test files, remove unused imports, enhance type definitions, and improve error handling in various services and controllers.
1 parent 451f655 commit 5e50cd2

File tree

14 files changed

+93
-67
lines changed

14 files changed

+93
-67
lines changed

backend/eslint.config.mjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ export default [
99
{languageOptions: { globals: globals.browser }},
1010
pluginJs.configs.recommended,
1111
...tseslint.configs.recommended,
12+
{
13+
ignores: ["src/__tests__/**"]
14+
}
1215
];

backend/src/controllers/survey.controller.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,10 @@ class SurveyController {
7575
async getAllSurveys(req: Request, res: Response): Promise<void> {
7676
const { org, team, reasonLength, since, until, status } = req.query as { [key: string]: string | undefined };;
7777
try {
78-
const dateFilter: any = {};
78+
const dateFilter: mongoose.FilterQuery<{
79+
$gte: Date;
80+
$lte: Date;
81+
}> = {};
7982
if (since) {
8083
dateFilter.$gte = new Date(since);
8184
}

backend/src/controllers/usage.controller.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { Request, Response } from 'express';
2+
import { UsageType } from 'models/usage.model.js';
23
import mongoose from 'mongoose';
34

45
class UsageController {
56
async getUsage(req: Request, res: Response): Promise<void> {
67
const Usage = mongoose.model('Usage');
78
try {
8-
const query: any = {};
9+
const query: mongoose.FilterQuery<UsageType> = {};
910
if (req.query.org) {
1011
query.org = req.query.org as string;
1112
}

backend/src/controllers/webhook.controller.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { App } from 'octokit';
1+
import { App, RequestError } from 'octokit';
22
import logger from '../services/logger.js';
33
import surveyService from '../services/survey.service.js';
44
import app from '../index.js';
@@ -51,7 +51,7 @@ export const setupWebhookListeners = (github: App) => {
5151
});
5252
} catch (error) {
5353
logger.debug(error);
54-
if ((error as any)?.status === 422) {
54+
if (error instanceof RequestError && error.status === 422) {
5555
logger.info('Survey comment created. (422)');
5656
} else {
5757
logger.error('Error creating survey comment');

backend/src/github.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ class GitHub {
7070
oauth: {
7171
clientId: null,
7272
clientSecret: null
73-
} as any
73+
} as {
74+
clientId: never;
75+
clientSecret: never;
76+
}
7477
});
7578

7679
await updateDotenv({ GITHUB_APP_ID: this.input.appId })
@@ -91,7 +94,7 @@ class GitHub {
9194
});
9295
logger.info('Webhook config updated for app', this.smee.options.url, this.input.webhooks?.secret?.replace(/\S/, '*'));
9396
} catch (error) {
94-
logger.error('Failed to update webhook config for app');
97+
logger.error('Failed to update webhook config for app', error);
9598
}
9699
app.settingsService.updateSetting('webhookProxyUrl', this.smee.options.url, false);
97100
}

backend/src/models/usage.model.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type UsageBreakdownType = {
2727
activeUsers: number;
2828
}
2929

30-
async function insertUsage(org: string, data: Endpoints["GET /orgs/{org}/copilot/usage"]["response"]["data"], team?: string) {
30+
async function insertUsage(org: string, data: Endpoints["GET /orgs/{org}/copilot/usage"]["response"]["data"]) {
3131
for (const metrics of data) {
3232
const Usage = mongoose.model('Usage');
3333

backend/src/services/adoption.service.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,22 @@
22
import mongoose from 'mongoose';
33
import logger from './logger.js';
44
import { SeatEntry } from './seats.service.js';
5+
import { SeatType } from 'models/seats.model.js';
56

6-
type AdoptionType = any;
7+
type AdoptionType = {
8+
_id?: string;
9+
enterprise: string | null;
10+
org: string | null;
11+
team: string | null;
12+
date: Date;
13+
totalSeats: number;
14+
totalActive: number;
15+
totalInactive: number;
16+
seats: Partial<SeatType>[];
17+
createdAt?: Date;
18+
updatedAt?: Date;
19+
__v?: number;
20+
};
721

822
export interface GetAdoptionsParams {
923
enterprise?: string;
@@ -20,12 +34,12 @@ export class AdoptionService {
2034
constructor() {
2135
}
2236

23-
async createAdoption(adoptionData: any): Promise<AdoptionType> {
37+
async createAdoption(adoptionData: AdoptionType): Promise<AdoptionType> {
2438
const adoptionModel = mongoose.model('Adoption');
2539
try {
2640
const result = await adoptionModel.create(adoptionData);
2741
return result;
28-
} catch (error: any) {
42+
} catch (error) {
2943
logger.error('Error creating adoption:', error);
3044
throw error; // Rethrow other errors
3145
}
@@ -79,7 +93,10 @@ export class AdoptionService {
7993
}
8094
}
8195

82-
async getAllAdoptions2(params: any): Promise<AdoptionType[]> {
96+
async getAllAdoptions2(params: {
97+
filter: mongoose.RootFilterQuery<AdoptionType>;
98+
projection: mongoose.ProjectionType<AdoptionType>;
99+
}): Promise<AdoptionType[]> {
83100
const adoptionModel = mongoose.model<AdoptionType>('Adoption');
84101

85102
try {

backend/src/services/metrics.service.ts

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,61 +13,59 @@ export interface MetricsQueryParams {
1313

1414
class MetricsService {
1515
async getMetrics(params: MetricsQueryParams) {
16-
const { org, type, since, until, editor, language, model } = params;
17-
16+
const { org, since, until, editor, language, model } = params; // type
17+
1818
const dateFilter = {
1919
...(since && { $gte: new Date(since) }),
2020
...(until && { $lte: new Date(until) })
2121
};
2222

23-
const query: any = {
23+
const query: mongoose.FilterQuery<MetricDailyResponseType> = {
2424
...(org && { org }),
2525
...(Object.keys(dateFilter).length && { date: dateFilter })
2626
};
2727

28-
const types = type ? type.split(/[ ,]+/) : [];
29-
30-
const metrics = await mongoose.model('Metrics').find(query).sort({date:1}).lean();
28+
const metrics = await mongoose.model<MetricDailyResponseType>('Metrics').find(query).sort({ date: 1 }).lean();
3129

3230
if (editor || language || model) {
3331
metrics.forEach(metric => {
34-
if (metric.copilot_ide_code_completions) {
35-
metric.copilot_ide_code_completions.editors = metric.copilot_ide_code_completions.editors.filter((editorItem: any) => {
32+
if (metric.copilot_ide_code_completions?.editors) {
33+
metric.copilot_ide_code_completions.editors = metric.copilot_ide_code_completions.editors.filter((editorItem) => {
3634
if (editor && editorItem.name !== editor) return false;
37-
if (model) {
38-
editorItem.models = editorItem.models.filter((modelItem: any) => {
35+
if (editorItem.models) {
36+
editorItem.models = editorItem.models.filter((modelItem) => {
3937
if (modelItem.name !== model) return false;
40-
if (language) {
41-
modelItem.languages = modelItem.languages.filter((languageItem: any) => languageItem.name === language);
38+
if (modelItem.languages) {
39+
modelItem.languages = modelItem.languages.filter((languageItem) => languageItem.name === language);
4240
}
4341
return true;
4442
});
4543
}
4644
return true;
4745
});
4846
}
49-
if (metric.copilot_ide_chat) {
50-
metric.copilot_ide_chat.editors = metric.copilot_ide_chat.editors.filter((editorItem: any) => {
47+
if (metric.copilot_ide_chat?.editors) {
48+
metric.copilot_ide_chat.editors = metric.copilot_ide_chat.editors.filter((editorItem) => {
5149
if (editor && editorItem.name !== editor) return false;
52-
if (model) {
53-
editorItem.models = editorItem.models.filter((modelItem: any) => {
50+
if (editorItem.models) {
51+
editorItem.models = editorItem.models.filter((modelItem) => {
5452
if (modelItem.name !== model) return false;
5553
return true;
5654
});
5755
}
5856
return true;
5957
});
6058
}
61-
if (metric.copilot_dotcom_chat) {
62-
metric.copilot_dotcom_chat.models = metric.copilot_dotcom_chat.models.filter((modelItem: any) => {
59+
if (metric.copilot_dotcom_chat?.models) {
60+
metric.copilot_dotcom_chat.models = metric.copilot_dotcom_chat.models.filter((modelItem) => {
6361
if (modelItem.name !== model) return false;
6462
return true;
6563
});
6664
}
67-
if (metric.copilot_dotcom_pull_requests) {
68-
metric.copilot_dotcom_pull_requests.repositories = metric.copilot_dotcom_pull_requests.repositories.filter((repositoryItem: any) => {
69-
if (model) {
70-
repositoryItem.models = repositoryItem.models.filter((modelItem: any) => {
65+
if (metric.copilot_dotcom_pull_requests?.repositories) {
66+
metric.copilot_dotcom_pull_requests.repositories = metric.copilot_dotcom_pull_requests.repositories.filter((repositoryItem) => {
67+
if (repositoryItem.models) {
68+
repositoryItem.models = repositoryItem.models.filter((modelItem) => {
7169
if (modelItem.name !== model) return false;
7270
return true;
7371
});
@@ -152,13 +150,13 @@ class MetricsService {
152150
}
153151
};
154152

155-
metrics.forEach((daily: any) => {
153+
metrics.forEach((daily) => {
156154
if (daily.copilot_ide_code_completions) {
157155
periodMetrics.copilot_ide_code_completions.total_code_acceptances += daily.copilot_ide_code_completions.total_code_acceptances || 0;
158156
periodMetrics.copilot_ide_code_completions.total_code_suggestions += daily.copilot_ide_code_completions.total_code_suggestions || 0;
159157
periodMetrics.copilot_ide_code_completions.total_code_lines_accepted += daily.copilot_ide_code_completions.total_code_lines_accepted || 0;
160158
periodMetrics.copilot_ide_code_completions.total_code_lines_suggested += daily.copilot_ide_code_completions.total_code_lines_suggested || 0;
161-
daily.copilot_ide_code_completions.editors?.forEach((editor: any) => {
159+
daily.copilot_ide_code_completions.editors?.forEach((editor) => {
162160
let editorTotals = periodMetrics.copilot_ide_code_completions.editors.find(e => e.name === editor.name);
163161
if (editorTotals) {
164162
editorTotals.total_code_acceptances += editor.total_code_acceptances || 0;
@@ -176,7 +174,7 @@ class MetricsService {
176174
}
177175
periodMetrics.copilot_ide_code_completions.editors.push(editorTotals);
178176
}
179-
editor.models?.forEach((model: any) => {
177+
editor.models?.forEach((model) => {
180178
let editorModelTotals = editorTotals?.models.find(m => m.name === model.name);
181179
if (editorModelTotals) {
182180
editorModelTotals.total_code_acceptances += model.total_code_acceptances || 0;
@@ -194,7 +192,7 @@ class MetricsService {
194192
}
195193
editorTotals?.models.push(editorModelTotals);
196194
}
197-
model.languages?.forEach((language: any) => {
195+
model.languages?.forEach((language) => {
198196
let modelLanguageTotals = editorModelTotals?.languages.find(l => l.name === language.name);
199197
if (modelLanguageTotals) {
200198
modelLanguageTotals.total_code_acceptances += language.total_code_acceptances || 0;
@@ -220,7 +218,7 @@ class MetricsService {
220218
periodMetrics.copilot_ide_chat.total_chats += daily.copilot_ide_chat.total_chats || 0;
221219
periodMetrics.copilot_ide_chat.total_chat_copy_events += daily.copilot_ide_chat.total_chat_copy_events || 0;
222220
periodMetrics.copilot_ide_chat.total_chat_insertion_events += daily.copilot_ide_chat.total_chat_insertion_events || 0;
223-
daily.copilot_ide_chat.editors?.forEach((editor: any) => {
221+
daily.copilot_ide_chat.editors?.forEach((editor) => {
224222
let editorTotals = periodMetrics.copilot_ide_chat.editors.find(e => e.name === editor.name);
225223
if (editorTotals) {
226224
editorTotals.total_chats += editor.total_chats || 0;
@@ -236,7 +234,7 @@ class MetricsService {
236234
}
237235
periodMetrics.copilot_ide_chat.editors.push(editorTotals);
238236
}
239-
editor.models?.forEach((model: any) => {
237+
editor.models?.forEach((model) => {
240238
let editorModelTotals = editorTotals?.models.find(m => m.name === model.name);
241239
if (editorModelTotals) {
242240
editorModelTotals.total_chats += model.total_chats || 0;
@@ -257,7 +255,7 @@ class MetricsService {
257255

258256
if (daily.copilot_dotcom_chat) {
259257
periodMetrics.copilot_dotcom_chat.total_chats += daily.copilot_dotcom_chat.total_chats || 0;
260-
daily.copilot_dotcom_chat.models?.forEach((model: any) => {
258+
daily.copilot_dotcom_chat.models?.forEach((model) => {
261259
let modelTotals = periodMetrics.copilot_dotcom_chat.models.find(m => m.name === model.name);
262260
if (modelTotals) {
263261
modelTotals.total_chats += model.total_chats || 0;
@@ -273,7 +271,7 @@ class MetricsService {
273271

274272
if (daily.copilot_dotcom_pull_requests) {
275273
periodMetrics.copilot_dotcom_pull_requests.total_pr_summaries_created += daily.copilot_dotcom_pull_requests.total_pr_summaries_created || 0;
276-
daily.copilot_dotcom_pull_requests.repositories?.forEach((repository: any) => {
274+
daily.copilot_dotcom_pull_requests.repositories?.forEach((repository) => {
277275
let repositoryTotals = periodMetrics.copilot_dotcom_pull_requests.repositories.find(r => r.name === repository.name);
278276
if (repositoryTotals) {
279277
repositoryTotals.total_pr_summaries_created += repository.total_pr_summaries_created || 0;
@@ -285,7 +283,7 @@ class MetricsService {
285283
}
286284
periodMetrics.copilot_dotcom_pull_requests.repositories.push(repositoryTotals);
287285
}
288-
repository.models?.forEach((model: any) => {
286+
repository.models?.forEach((model) => {
289287
const repositoryModelTotals = repositoryTotals?.models.find(m => m.name === model.name);
290288
if (repositoryModelTotals) {
291289
repositoryModelTotals.total_pr_summaries_created += model.total_pr_summaries_created || 0;

backend/src/services/seats.service.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { MemberActivityType, MemberType } from 'models/teams.model.js';
66
import fs from 'fs';
77
import adoptionService from './adoption.service.js';
88

9-
type _Seat = any;// NonNullable<Endpoints["GET /orgs/{org}/copilot"]["response"]["data"]["seats"]>[0];
9+
type _Seat = NonNullable<Endpoints["GET /orgs/{org}/copilot/billing/seats"]["response"]["data"]["seats"]>[0];
1010
export interface SeatEntry extends _Seat {
1111
plan_type: "business" | "enterprise" | "unknown";
1212
assignee: components['schemas']['simple-user'];
@@ -237,7 +237,7 @@ class SeatsService {
237237
precision?: 'hour' | 'day' | 'minute';
238238
since?: string;
239239
until?: string;
240-
} = {}): Promise<any> { // Promise<MemberDailyActivity> {
240+
} = {}): Promise<MemberDailyActivity> {
241241
const Seats = mongoose.model('Seats');
242242
// const seats = await Seats.find({})
243243
// return seats.length;
@@ -296,7 +296,6 @@ class SeatsService {
296296
dateIndex.setUTCHours(0, 0, 0, 0);
297297
} else if (precision === 'hour') {
298298
dateIndex.setUTCMinutes(0, 0, 0);
299-
} else if (precision === 'minute') {
300299
}
301300
const dateIndexStr = new Date(dateIndex).toISOString();
302301
if (!activityDays[dateIndexStr]) {
@@ -342,8 +341,18 @@ class SeatsService {
342341
const { org, since, until } = params;
343342
const Member = mongoose.model('Member');
344343

344+
const match: mongoose.FilterQuery<SeatEntry> = {};
345+
if (org) match.org = org;
346+
if (since || until) {
347+
match.createdAt = {
348+
...(since && { $gte: new Date(since) }),
349+
...(until && { $lte: new Date(until) })
350+
};
351+
}
352+
345353
const assignees: MemberType[] = await Member
346354
.aggregate([
355+
{ $match: match },
347356
{
348357
$lookup: {
349358
from: 'seats', // MongoDB collection name (lowercase)
@@ -374,7 +383,7 @@ class SeatsService {
374383
return totals;
375384
}, {} as { [assignee: string]: number });
376385

377-
return Object.entries(activityTotals).sort((a: any, b: any) => b[1] - a[1]);
386+
return Object.entries(activityTotals).sort((a: [string, number], b: [string, number]) => b[1] - a[1]);
378387
}
379388

380389
async getMembersActivityTotals2(params: {
@@ -385,7 +394,7 @@ class SeatsService {
385394
const ActivityTotals = mongoose.model('ActivityTotals');
386395
const { org, since, until } = params;
387396

388-
const match: any = {};
397+
const match: mongoose.FilterQuery<MemberActivityType> = {};
389398
if (org) match.org = org;
390399
if (since || until) {
391400
match.date = {
@@ -395,9 +404,7 @@ class SeatsService {
395404
}
396405

397406
const totals = await ActivityTotals.aggregate([
398-
// Match documents within date range and org
399407
{ $match: match },
400-
// First group by date AND assignee_login
401408
{
402409
$group: {
403410
_id: {
@@ -407,16 +414,13 @@ class SeatsService {
407414
daily_time: { $sum: "$total_active_time_ms" }
408415
}
409416
},
410-
// Then group by just assignee_login to sum across days
411417
{
412418
$group: {
413419
_id: "$_id.login",
414420
total_time: { $sum: "$daily_time" }
415421
}
416422
},
417-
// Sort by total time descending
418423
{ $sort: { total_time: -1 } },
419-
// Project final fields
420424
{
421425
$project: {
422426
_id: 0,

backend/src/services/settings.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ class SettingsService {
4747
value: string;
4848
}>({});
4949
return settingsArray.reduce((acc, setting) => {
50-
acc[setting.name] = setting.value;
50+
acc[setting.name as keyof SettingsType] = setting.value;
5151
return acc;
52-
}, {} as any);
52+
}, {} as SettingsType);
5353
} catch (error) {
5454
console.error('Failed to get all settings:', error);
5555
throw error;

0 commit comments

Comments
 (0)