vidspotai-shared 1.0.19 → 1.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -45,7 +45,7 @@ export declare class FirestoreService {
45
45
  }) | undefined>;
46
46
  /** Get a user by ID (typed) */
47
47
  static getUserById(id: string): Promise<IUserModel | undefined>;
48
- /** Get a user by ID (typed) */
48
+ /** Get a user by email (typed, first match) */
49
49
  static getUserByEmail(email: string): Promise<IUserModel | undefined>;
50
50
  /** Query collection by field */
51
51
  static getDataByKeyField<T extends DocumentData>(collectionRef: CollectionReference<T>, fieldName: string, operator: WhereFilterOp, value: any, options?: {
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.service.d.ts","sourceRoot":"","sources":["../../src/services/firestore.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAEZ,gBAAgB,EAEhB,aAAa,EACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAevD;;;;GAIG;AACH,qBAAa,gBAAgB;IAE3B,MAAM,CAAC,YAAY,oDAEqC;IAExD,MAAM,CAAC,QAAQ,gDAEqC;IAEpD,MAAM,CAAC,UAAU;;;;;;;;;;;;;;;;;;;qBAEqC;IAItD,yCAAyC;WAC5B,eAAe,CAAC,CAAC,EAC5B,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACrC,IAAI,EAAE,CAAC,GACN,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAMhC,qDAAqD;WACxC,OAAO,CAAC,CAAC,EACpB,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACrC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,CAAC,GACN,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAMhC,0CAA0C;WAC7B,UAAU,CAAC,CAAC,EACvB,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAKlC,kCAAkC;WACrB,WAAW,CAAC,CAAC,EACxB,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACrC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;IAO5C,+BAA+B;WAClB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAIrE,+BAA+B;WAClB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAS3E,gCAAgC;WACnB,iBAAiB,CAAC,CAAC,SAAS,YAAY,EACnD,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,GAAG,EACV,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;QAChC,cAAc,CAAC,EAAE,gBAAgB,CAAC;QAClC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GACA,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAsBlC,8CAA8C;WACjC,UAAU,CAAC,CAAC,EACvB,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACrC,EAAE,EAAE,MAAM,EACV,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,EAC9B,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAwB,GACrD,OAAO,CAAC,IAAI,CAAC;IAWhB,OAAO,CAAC,MAAM,CAAC,aAAa;IAmB5B,0CAA0C;WAC7B,cAAc,CACzB,EAAE,EAAE,MAAM,EACV,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC;IAIhB,sBAAsB;WACT,UAAU,CAAC,CAAC,EACvB,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACrC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,IAAI,CAAC;CAIjB"}
1
+ {"version":3,"file":"firestore.service.d.ts","sourceRoot":"","sources":["../../src/services/firestore.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAEZ,gBAAgB,EAEhB,aAAa,EACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAevD;;;;GAIG;AACH,qBAAa,gBAAgB;IAE3B,MAAM,CAAC,YAAY,oDAEqC;IAExD,MAAM,CAAC,QAAQ,gDAEqC;IAEpD,MAAM,CAAC,UAAU;;;;;;;;;;;;;;;;;;;qBAEqC;IAItD,yCAAyC;WAC5B,eAAe,CAAC,CAAC,EAC5B,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACrC,IAAI,EAAE,CAAC,GACN,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAMhC,qDAAqD;WACxC,OAAO,CAAC,CAAC,EACpB,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACrC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,CAAC,GACN,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAMhC,0CAA0C;WAC7B,UAAU,CAAC,CAAC,EACvB,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,GACpC,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAKlC,kCAAkC;WACrB,WAAW,CAAC,CAAC,EACxB,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACrC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;IAO5C,+BAA+B;WAClB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAIrE,+CAA+C;WAClC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAS3E,gCAAgC;WACnB,iBAAiB,CAAC,CAAC,SAAS,YAAY,EACnD,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,GAAG,EACV,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;QAChC,cAAc,CAAC,EAAE,gBAAgB,CAAC;QAClC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GACA,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IAsBlC,8CAA8C;WACjC,UAAU,CAAC,CAAC,EACvB,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACrC,EAAE,EAAE,MAAM,EACV,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,EAC9B,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAwB,GACrD,OAAO,CAAC,IAAI,CAAC;IAWhB,OAAO,CAAC,MAAM,CAAC,aAAa;IAmB5B,0CAA0C;WAC7B,cAAc,CACzB,EAAE,EAAE,MAAM,EACV,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC;IAIhB,sBAAsB;WACT,UAAU,CAAC,CAAC,EACvB,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACrC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,IAAI,CAAC;CAIjB"}
@@ -50,7 +50,7 @@ class FirestoreService {
50
50
  static async getUserById(id) {
51
51
  return this.getDataById(this.usersCol, id);
52
52
  }
53
- /** Get a user by ID (typed) */
53
+ /** Get a user by email (typed, first match) */
54
54
  static async getUserByEmail(email) {
55
55
  return this.getDataByKeyField(this.usersCol, "email", "==", email).then((users) => users[0]);
56
56
  }
@@ -0,0 +1,5 @@
1
+ export declare abstract class GCPService {
2
+ protected auth: any;
3
+ constructor();
4
+ }
5
+ //# sourceMappingURL=gcp.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gcp.service.d.ts","sourceRoot":"","sources":["../../../src/services/gcp/gcp.service.ts"],"names":[],"mappings":"AAEA,8BAAsB,UAAU;IAC9B,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC;;CAarB"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GCPService = void 0;
4
+ const googleapis_1 = require("googleapis");
5
+ class GCPService {
6
+ constructor() {
7
+ if (!process.env.GOOGLE_CLIENT_EMAIL || !process.env.GOOGLE_PRIVATE_KEY) {
8
+ throw new Error("Missing GCP credentials");
9
+ }
10
+ this.auth = new googleapis_1.google.auth.JWT({
11
+ email: process.env.GOOGLE_CLIENT_EMAIL,
12
+ key: process.env.GOOGLE_PRIVATE_KEY.replace(/\\n/g, "\n"),
13
+ scopes: ["https://www.googleapis.com/auth/spreadsheets"],
14
+ });
15
+ }
16
+ }
17
+ exports.GCPService = GCPService;
@@ -0,0 +1,16 @@
1
+ import { GCPService } from "./gcp.service";
2
+ import { GSheetAppendWithSchemaParams } from "./types";
3
+ export declare class GSheetService extends GCPService {
4
+ private sheets;
5
+ constructor();
6
+ /**
7
+ * Append rows with automatic header + schema evolution support
8
+ */
9
+ appendRowsWithSchema<T extends Record<string, any>>(params: GSheetAppendWithSchemaParams<T>): Promise<void>;
10
+ private getHeader;
11
+ private writeHeader;
12
+ private mergeHeaders;
13
+ private ensureSheetExists;
14
+ private columnLetter;
15
+ }
16
+ //# sourceMappingURL=gsheet.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gsheet.service.d.ts","sourceRoot":"","sources":["../../../src/services/gcp/gsheet.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAEvD,qBAAa,aAAc,SAAQ,UAAU;IAC3C,OAAO,CAAC,MAAM,CAAmB;;IAWjC;;OAEG;IACG,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtD,MAAM,EAAE,4BAA4B,CAAC,CAAC,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;YAsDF,SAAS;YAYT,WAAW;IAezB,OAAO,CAAC,YAAY;YAMN,iBAAiB;IA4B/B,OAAO,CAAC,YAAY;CASrB"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GSheetService = void 0;
4
+ const googleapis_1 = require("googleapis");
5
+ const gcp_service_1 = require("./gcp.service");
6
+ class GSheetService extends gcp_service_1.GCPService {
7
+ constructor() {
8
+ super();
9
+ this.sheets = googleapis_1.google.sheets({
10
+ version: "v4",
11
+ auth: this.auth,
12
+ });
13
+ }
14
+ /**
15
+ * Append rows with automatic header + schema evolution support
16
+ */
17
+ async appendRowsWithSchema(params) {
18
+ const { spreadsheetId, sheetName, header, rows, valueInputOption = "USER_ENTERED", } = params;
19
+ if (!rows || rows.length === 0) {
20
+ return;
21
+ }
22
+ // 1. Ensure sheet exists
23
+ await this.ensureSheetExists(spreadsheetId, sheetName);
24
+ // 2. Read existing header (row 1)
25
+ const existingHeader = await this.getHeader(spreadsheetId, sheetName);
26
+ // 3. Derive incoming header from rows if not explicitly provided
27
+ const incomingHeader = header
28
+ ? header.map(String)
29
+ : Array.from(new Set(rows.flatMap((row) => Object.keys(row))));
30
+ // 4. Merge headers (schema evolution)
31
+ const finalHeader = this.mergeHeaders(existingHeader, incomingHeader);
32
+ // 5. Write header if needed
33
+ if (existingHeader.length === 0 ||
34
+ finalHeader.length !== existingHeader.length) {
35
+ await this.writeHeader(spreadsheetId, sheetName, finalHeader);
36
+ }
37
+ // 6. Align rows to final header
38
+ const values = rows.map((row) => finalHeader.map((col) => (row[col] !== undefined ? row[col] : "")));
39
+ // 7. Append rows
40
+ await this.sheets.spreadsheets.values.append({
41
+ spreadsheetId,
42
+ range: `${sheetName}!A:${this.columnLetter(finalHeader.length)}`,
43
+ valueInputOption,
44
+ insertDataOption: "INSERT_ROWS",
45
+ requestBody: { values },
46
+ });
47
+ }
48
+ // ----------------------
49
+ // Helper Methods
50
+ // ----------------------
51
+ async getHeader(spreadsheetId, sheetName) {
52
+ const res = await this.sheets.spreadsheets.values.get({
53
+ spreadsheetId,
54
+ range: `${sheetName}!1:1`,
55
+ });
56
+ return res.data.values?.[0] ?? [];
57
+ }
58
+ async writeHeader(spreadsheetId, sheetName, header) {
59
+ await this.sheets.spreadsheets.values.update({
60
+ spreadsheetId,
61
+ range: `${sheetName}!1:1`,
62
+ valueInputOption: "RAW",
63
+ requestBody: {
64
+ values: [header],
65
+ },
66
+ });
67
+ }
68
+ mergeHeaders(existing, incoming) {
69
+ const set = new Set(existing);
70
+ incoming.forEach((col) => set.add(col));
71
+ return Array.from(set);
72
+ }
73
+ async ensureSheetExists(spreadsheetId, sheetName) {
74
+ const meta = await this.sheets.spreadsheets.get({
75
+ spreadsheetId,
76
+ });
77
+ const exists = meta.data.sheets?.some((s) => s.properties?.title === sheetName);
78
+ if (exists)
79
+ return;
80
+ await this.sheets.spreadsheets.batchUpdate({
81
+ spreadsheetId,
82
+ requestBody: {
83
+ requests: [
84
+ {
85
+ addSheet: {
86
+ properties: { title: sheetName },
87
+ },
88
+ },
89
+ ],
90
+ },
91
+ });
92
+ }
93
+ columnLetter(colCount) {
94
+ let letter = "";
95
+ while (colCount > 0) {
96
+ const mod = (colCount - 1) % 26;
97
+ letter = String.fromCharCode(65 + mod) + letter;
98
+ colCount = Math.floor((colCount - 1) / 26);
99
+ }
100
+ return letter;
101
+ }
102
+ }
103
+ exports.GSheetService = GSheetService;
@@ -0,0 +1,3 @@
1
+ export * from "./gcp.service";
2
+ export * from "./gsheet.service";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/gcp/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./gcp.service"), exports);
18
+ __exportStar(require("./gsheet.service"), exports);
@@ -0,0 +1,18 @@
1
+ export type GSheetAppendWithSchemaParams<T extends Record<string, any>> = {
2
+ spreadsheetId: string;
3
+ sheetName: string;
4
+ /**
5
+ * Optional header definition (schema)
6
+ * Order matters for display, not for compatibility
7
+ */
8
+ header?: (keyof T)[];
9
+ /**
10
+ * Rows as objects (schema-aware)
11
+ */
12
+ rows: T[];
13
+ /**
14
+ * Defaults to USER_ENTERED
15
+ */
16
+ valueInputOption?: "RAW" | "USER_ENTERED";
17
+ };
18
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/gcp/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,4BAA4B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;IACxE,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;IAErB;;OAEG;IACH,IAAI,EAAE,CAAC,EAAE,CAAC;IAEV;;OAEG;IACH,gBAAgB,CAAC,EAAE,KAAK,GAAG,cAAc,CAAC;CAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -2,4 +2,5 @@ export * from "./redis.service";
2
2
  export * from "./firestore.service";
3
3
  export * from "./aiGen";
4
4
  export * from "./bullmq.service";
5
+ export * from "./gcp";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,OAAO,CAAC"}
@@ -18,3 +18,4 @@ __exportStar(require("./redis.service"), exports);
18
18
  __exportStar(require("./firestore.service"), exports);
19
19
  __exportStar(require("./aiGen"), exports);
20
20
  __exportStar(require("./bullmq.service"), exports);
21
+ __exportStar(require("./gcp"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vidspotai-shared",
3
- "version": "1.0.19",
3
+ "version": "1.0.22",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "exports": {
@@ -21,6 +21,7 @@
21
21
  "bullmq": "^5.61.0",
22
22
  "firebase-admin": "^13.5.0",
23
23
  "fs-extra": "^11.3.2",
24
+ "googleapis": "^170.0.0",
24
25
  "ioredis": "^5.8.0",
25
26
  "jsonwebtoken": "^9.0.2",
26
27
  "openai": "^6.1.0",