Skip to content

Commit 4af253c

Browse files
committed
feat: add cli_install_stats collection and implement StatsService for usage tracking
Introduced the `cli_install_stats` collection with full schema and snapshot updates to track CLI usage data. Added `StatsService` and new `/cli/stats` API endpoint for handling related functionality.
1 parent 9aa427c commit 4af253c

File tree

5 files changed

+739
-79
lines changed

5 files changed

+739
-79
lines changed

extensions/tsed-rest/src/index.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import { defineEndpoint } from "@directus/extensions-sdk";
2-
import { inject } from "@tsed/di";
2+
import { inject, logger } from "@tsed/di";
33
import { wrapEndpoint } from "@tsed-cms/infra/bootstrap/directus.js";
4+
import { validate } from "@tsed-cms/infra/validators/validate.js";
45
import { LegacyRestService } from "@tsed-cms/usecases/legacy/LegacyRestService.js";
56
import { SlackService } from "@tsed-cms/usecases/slack/SlackService.js";
7+
import { StatsService } from "@tsed-cms/usecases/stats/StatsService.js";
8+
9+
import { CliStatPayload } from "./schema/CliStatPayload.js";
610

711
function getCategory(name: string) {
812
if (name.startsWith("tsed-cli-") || name.startsWith("@tsed/cli")) {
@@ -121,5 +125,20 @@ export default defineEndpoint({
121125

122126
return res.redirect(302, url);
123127
});
128+
129+
router.post("/cli/stats", async (req, res) => {
130+
const value = await validate(req.body, CliStatPayload);
131+
132+
inject(StatsService)
133+
.create(value)
134+
.catch((err) => {
135+
logger().error({
136+
event: "ERROR_STATS",
137+
message: err.message
138+
});
139+
});
140+
141+
return res.status(201).send();
142+
});
124143
})
125144
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { s } from "@tsed/schema";
2+
3+
export const CliStatPayload = s.object({
4+
tsed_version: s.string().required(),
5+
platform: s.string().required(),
6+
convention: s.string().required(),
7+
package_manager: s.string().required(),
8+
runtime: s.string().required(),
9+
features: s.array(s.string()),
10+
channel: s.string().enum("cli", "mcp").required(),
11+
cli_version: s.string().required()
12+
});

packages/infra/directus/interfaces/DirectusSchema.d.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,21 @@
1+
export interface CliInstallStat {
2+
/** @primaryKey */
3+
id: number;
4+
user_created?: DirectusUser | string | null;
5+
date_created?: string | null;
6+
user_updated?: DirectusUser | string | null;
7+
date_updated?: string | null;
8+
tsed_version?: string | null;
9+
platform?: string | null;
10+
convention?: string | null;
11+
package_manager?: string | null;
12+
runtime?: string | null;
13+
features?: string[] | null;
14+
/** @required */
15+
channel: "cli" | "mcp";
16+
cli_version?: string | null;
17+
}
18+
119
export interface Maintainer {
220
/** @primaryKey */
321
id: string;
@@ -593,6 +611,7 @@ export interface DirectusExtension {
593611
}
594612

595613
export interface Schema {
614+
cli_install_stats: CliInstallStat[];
596615
maintainers: Maintainer[];
597616
packages: Package[];
598617
packages_maintainers: PackagesMaintainer[];
@@ -631,6 +650,7 @@ export interface Schema {
631650
}
632651

633652
export enum CollectionNames {
653+
cli_install_stats = "cli_install_stats",
634654
maintainers = "maintainers",
635655
packages = "packages",
636656
packages_maintainers = "packages_maintainers",
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { injectable } from "@tsed/di";
2+
import { DirectusItemsRepository } from "@tsed-cms/infra/directus/DirectusItemsRepository.js";
3+
import type { CliInstallStat, PackageSymbol } from "@tsed-cms/infra/directus/interfaces/DirectusSchema.d.js";
4+
5+
export class StatsService extends DirectusItemsRepository<CliInstallStat> {
6+
protected collection = "cli_install_stats" as const;
7+
}
8+
9+
injectable(StatsService);

0 commit comments

Comments
 (0)