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.
- package/lib/services/firestore.service.d.ts +1 -1
- package/lib/services/firestore.service.d.ts.map +1 -1
- package/lib/services/firestore.service.js +1 -1
- package/lib/services/gcp/gcp.service.d.ts +5 -0
- package/lib/services/gcp/gcp.service.d.ts.map +1 -0
- package/lib/services/gcp/gcp.service.js +17 -0
- package/lib/services/gcp/gsheet.service.d.ts +16 -0
- package/lib/services/gcp/gsheet.service.d.ts.map +1 -0
- package/lib/services/gcp/gsheet.service.js +103 -0
- package/lib/services/gcp/index.d.ts +3 -0
- package/lib/services/gcp/index.d.ts.map +1 -0
- package/lib/services/gcp/index.js +18 -0
- package/lib/services/gcp/types.d.ts +18 -0
- package/lib/services/gcp/types.d.ts.map +1 -0
- package/lib/services/gcp/types.js +2 -0
- package/lib/services/index.d.ts +1 -0
- package/lib/services/index.d.ts.map +1 -1
- package/lib/services/index.js +1 -0
- package/package.json +2 -1
|
@@ -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
|
|
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,+
|
|
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
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/lib/services/index.d.ts
CHANGED
|
@@ -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"}
|
package/lib/services/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vidspotai-shared",
|
|
3
|
-
"version": "1.0.
|
|
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",
|