@umituz/react-native-firebase 1.13.49 → 1.13.50
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/dist/scripts/cli-handlers.d.ts +27 -0
- package/dist/scripts/cli-handlers.d.ts.map +1 -0
- package/dist/scripts/cli-handlers.js +125 -0
- package/dist/scripts/cli-handlers.js.map +1 -0
- package/dist/scripts/cli-parser.d.ts +25 -0
- package/dist/scripts/cli-parser.d.ts.map +1 -0
- package/dist/scripts/cli-parser.js +101 -0
- package/dist/scripts/cli-parser.js.map +1 -0
- package/dist/scripts/cli.js +20 -155
- package/dist/scripts/cli.js.map +1 -1
- package/dist/scripts/firestore-operations.d.ts +18 -0
- package/dist/scripts/firestore-operations.d.ts.map +1 -0
- package/dist/scripts/firestore-operations.js +88 -0
- package/dist/scripts/firestore-operations.js.map +1 -0
- package/dist/scripts/firestore-queries.d.ts +27 -0
- package/dist/scripts/firestore-queries.d.ts.map +1 -0
- package/dist/scripts/firestore-queries.js +77 -0
- package/dist/scripts/firestore-queries.js.map +1 -0
- package/dist/scripts/firestore-seeding.d.ts +21 -0
- package/dist/scripts/firestore-seeding.d.ts.map +1 -0
- package/dist/scripts/firestore-seeding.js +67 -0
- package/dist/scripts/firestore-seeding.js.map +1 -0
- package/dist/scripts/firestore.d.ts +3 -48
- package/dist/scripts/firestore.d.ts.map +1 -1
- package/dist/scripts/firestore.js +16 -210
- package/dist/scripts/firestore.js.map +1 -1
- package/dist/scripts/user-commands.d.ts +33 -0
- package/dist/scripts/user-commands.d.ts.map +1 -0
- package/dist/scripts/user-commands.js +113 -0
- package/dist/scripts/user-commands.js.map +1 -0
- package/dist/scripts/user-formatters.d.ts +10 -0
- package/dist/scripts/user-formatters.d.ts.map +1 -0
- package/dist/scripts/user-formatters.js +55 -0
- package/dist/scripts/user-formatters.js.map +1 -0
- package/dist/scripts/user-queries.d.ts +42 -0
- package/dist/scripts/user-queries.d.ts.map +1 -0
- package/dist/scripts/user-queries.js +125 -0
- package/dist/scripts/user-queries.js.map +1 -0
- package/dist/scripts/user.d.ts +3 -67
- package/dist/scripts/user.d.ts.map +1 -1
- package/dist/scripts/user.js +15 -272
- package/dist/scripts/user.js.map +1 -1
- package/package.json +1 -1
- package/scripts/cli-handlers.ts +170 -0
- package/scripts/cli-parser.ts +82 -0
- package/scripts/cli.ts +27 -193
- package/scripts/firestore-operations.ts +111 -0
- package/scripts/firestore-queries.ts +97 -0
- package/scripts/firestore-seeding.ts +87 -0
- package/scripts/firestore.ts +20 -275
- package/scripts/user-commands.ts +104 -0
- package/scripts/user-formatters.ts +55 -0
- package/scripts/user-queries.ts +185 -0
- package/scripts/user.ts +19 -326
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Admin User Commands
|
|
4
|
+
* Command functions for modifying user data
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.initializeUserCredits = initializeUserCredits;
|
|
41
|
+
exports.addUserCredits = addUserCredits;
|
|
42
|
+
exports.setUserCredits = setUserCredits;
|
|
43
|
+
exports.deleteUserCredits = deleteUserCredits;
|
|
44
|
+
const admin = __importStar(require("firebase-admin"));
|
|
45
|
+
/**
|
|
46
|
+
* Initialize credits for a user
|
|
47
|
+
*/
|
|
48
|
+
async function initializeUserCredits(db, userId, config) {
|
|
49
|
+
const { collectionName = "user_credits", textLimit = 0, imageLimit = 0 } = config;
|
|
50
|
+
const now = admin.firestore.FieldValue.serverTimestamp();
|
|
51
|
+
const credits = {
|
|
52
|
+
text: textLimit,
|
|
53
|
+
image: imageLimit,
|
|
54
|
+
video: 0,
|
|
55
|
+
audio: 0,
|
|
56
|
+
createdAt: now,
|
|
57
|
+
updatedAt: now,
|
|
58
|
+
};
|
|
59
|
+
await db.collection(collectionName).doc(userId).set(credits, { merge: true });
|
|
60
|
+
return {
|
|
61
|
+
text: textLimit,
|
|
62
|
+
image: imageLimit,
|
|
63
|
+
video: 0,
|
|
64
|
+
audio: 0,
|
|
65
|
+
createdAt: new Date(),
|
|
66
|
+
updatedAt: new Date(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Add credits to a user
|
|
71
|
+
*/
|
|
72
|
+
async function addUserCredits(db, userId, credits, collectionName = "user_credits") {
|
|
73
|
+
const updates = {
|
|
74
|
+
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
|
75
|
+
};
|
|
76
|
+
if (credits.text) {
|
|
77
|
+
updates.text = admin.firestore.FieldValue.increment(credits.text);
|
|
78
|
+
}
|
|
79
|
+
if (credits.image) {
|
|
80
|
+
updates.image = admin.firestore.FieldValue.increment(credits.image);
|
|
81
|
+
}
|
|
82
|
+
if (credits.video) {
|
|
83
|
+
updates.video = admin.firestore.FieldValue.increment(credits.video);
|
|
84
|
+
}
|
|
85
|
+
if (credits.audio) {
|
|
86
|
+
updates.audio = admin.firestore.FieldValue.increment(credits.audio);
|
|
87
|
+
}
|
|
88
|
+
await db.collection(collectionName).doc(userId).update(updates);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Set credits for a user (overwrite)
|
|
92
|
+
*/
|
|
93
|
+
async function setUserCredits(db, userId, credits, collectionName = "user_credits") {
|
|
94
|
+
const updates = {
|
|
95
|
+
updatedAt: admin.firestore.FieldValue.serverTimestamp(),
|
|
96
|
+
};
|
|
97
|
+
if (credits.text !== undefined)
|
|
98
|
+
updates.text = credits.text;
|
|
99
|
+
if (credits.image !== undefined)
|
|
100
|
+
updates.image = credits.image;
|
|
101
|
+
if (credits.video !== undefined)
|
|
102
|
+
updates.video = credits.video;
|
|
103
|
+
if (credits.audio !== undefined)
|
|
104
|
+
updates.audio = credits.audio;
|
|
105
|
+
await db.collection(collectionName).doc(userId).set(updates, { merge: true });
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Delete user credits document
|
|
109
|
+
*/
|
|
110
|
+
async function deleteUserCredits(db, userId, collectionName = "user_credits") {
|
|
111
|
+
await db.collection(collectionName).doc(userId).delete();
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=user-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-commands.js","sourceRoot":"","sources":["../../scripts/user-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Admin User Formatters
|
|
3
|
+
* Format functions for displaying user data
|
|
4
|
+
*/
|
|
5
|
+
import type { UserData } from "./types";
|
|
6
|
+
/**
|
|
7
|
+
* Print user data in formatted way
|
|
8
|
+
*/
|
|
9
|
+
export declare function printUserData(data: UserData): void;
|
|
10
|
+
//# sourceMappingURL=user-formatters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-formatters.d.ts","sourceRoot":"","sources":["../../scripts/user-formatters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CA4ClD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Admin User Formatters
|
|
4
|
+
* Format functions for displaying user data
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.printUserData = printUserData;
|
|
8
|
+
/**
|
|
9
|
+
* Print user data in formatted way
|
|
10
|
+
*/
|
|
11
|
+
function printUserData(data) {
|
|
12
|
+
console.log("\n" + "═".repeat(60));
|
|
13
|
+
console.log(`👤 USER: ${data.userId}`);
|
|
14
|
+
console.log("═".repeat(60));
|
|
15
|
+
console.log("\n📋 PROFILE:");
|
|
16
|
+
if (data.profile) {
|
|
17
|
+
console.log(JSON.stringify(data.profile, null, 2));
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
console.log(" ❌ Not found");
|
|
21
|
+
}
|
|
22
|
+
console.log("\n💰 CREDITS:");
|
|
23
|
+
if (data.credits) {
|
|
24
|
+
console.log(` Text: ${data.credits.text || 0}`);
|
|
25
|
+
console.log(` Image: ${data.credits.image || 0}`);
|
|
26
|
+
console.log(` Video: ${data.credits.video || 0}`);
|
|
27
|
+
console.log(` Audio: ${data.credits.audio || 0}`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.log(" ❌ Not found");
|
|
31
|
+
}
|
|
32
|
+
console.log("\n🔔 SUBSCRIPTIONS:");
|
|
33
|
+
if (data.subscriptions.length > 0) {
|
|
34
|
+
data.subscriptions.forEach((sub) => {
|
|
35
|
+
console.log(` - ${sub.id}: ${JSON.stringify(sub)}`);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.log(" ❌ None");
|
|
40
|
+
}
|
|
41
|
+
console.log("\n🧾 TRANSACTIONS:");
|
|
42
|
+
if (data.transactions.length > 0) {
|
|
43
|
+
data.transactions.slice(0, 5).forEach((tx) => {
|
|
44
|
+
console.log(` - ${tx.id}: ${JSON.stringify(tx)}`);
|
|
45
|
+
});
|
|
46
|
+
if (data.transactions.length > 5) {
|
|
47
|
+
console.log(` ... and ${data.transactions.length - 5} more`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.log(" ❌ None");
|
|
52
|
+
}
|
|
53
|
+
console.log("\n" + "═".repeat(60) + "\n");
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=user-formatters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-formatters.js","sourceRoot":"","sources":["../../scripts/user-formatters.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAOH,sCA4CC;AA/CD;;GAEG;AACH,SAAgB,aAAa,CAAC,IAAc;IAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACjC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Firebase Admin User Queries
|
|
3
|
+
* Query functions for reading user data
|
|
4
|
+
*/
|
|
5
|
+
import * as admin from "firebase-admin";
|
|
6
|
+
import type { UserData, UserCredits } from "./types";
|
|
7
|
+
/**
|
|
8
|
+
* Get complete user data including profile and all related collections
|
|
9
|
+
*/
|
|
10
|
+
export declare function getUserData(db: admin.firestore.Firestore, userId: string, options?: {
|
|
11
|
+
includeCredits?: boolean;
|
|
12
|
+
includeSubscriptions?: boolean;
|
|
13
|
+
includeTransactions?: boolean;
|
|
14
|
+
creditsCollection?: string;
|
|
15
|
+
}): Promise<UserData>;
|
|
16
|
+
/**
|
|
17
|
+
* List all users with their credit balances
|
|
18
|
+
*/
|
|
19
|
+
export declare function listUsersWithCredits(db: admin.firestore.Firestore, options?: {
|
|
20
|
+
creditsCollection?: string;
|
|
21
|
+
limit?: number;
|
|
22
|
+
onlyWithCredits?: boolean;
|
|
23
|
+
}): Promise<Array<{
|
|
24
|
+
userId: string;
|
|
25
|
+
displayName?: string;
|
|
26
|
+
email?: string;
|
|
27
|
+
isAnonymous: boolean;
|
|
28
|
+
credits: UserCredits | null;
|
|
29
|
+
}>>;
|
|
30
|
+
/**
|
|
31
|
+
* Get credits summary across all users
|
|
32
|
+
*/
|
|
33
|
+
export declare function getCreditsSummary(db: admin.firestore.Firestore, collectionName?: string): Promise<{
|
|
34
|
+
totalUsers: number;
|
|
35
|
+
totalText: number;
|
|
36
|
+
totalImage: number;
|
|
37
|
+
totalVideo: number;
|
|
38
|
+
totalAudio: number;
|
|
39
|
+
usersWithCredits: number;
|
|
40
|
+
usersWithZeroCredits: number;
|
|
41
|
+
}>;
|
|
42
|
+
//# sourceMappingURL=user-queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-queries.d.ts","sourceRoot":"","sources":["../../scripts/user-queries.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAErD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAC7B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IACR,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GACA,OAAO,CAAC,QAAQ,CAAC,CA6DnB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAC7B,OAAO,CAAC,EAAE;IACR,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GACA,OAAO,CACR,KAAK,CAAC;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B,CAAC,CACH,CA6BA;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAC7B,cAAc,SAAiB,GAC9B,OAAO,CAAC;IACT,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CAAC,CAsCD"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Firebase Admin User Queries
|
|
4
|
+
* Query functions for reading user data
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getUserData = getUserData;
|
|
8
|
+
exports.listUsersWithCredits = listUsersWithCredits;
|
|
9
|
+
exports.getCreditsSummary = getCreditsSummary;
|
|
10
|
+
/**
|
|
11
|
+
* Get complete user data including profile and all related collections
|
|
12
|
+
*/
|
|
13
|
+
async function getUserData(db, userId, options) {
|
|
14
|
+
const { includeCredits = true, includeSubscriptions = true, includeTransactions = true, creditsCollection = "user_credits", } = options || {};
|
|
15
|
+
const result = {
|
|
16
|
+
userId,
|
|
17
|
+
exists: false,
|
|
18
|
+
profile: null,
|
|
19
|
+
credits: null,
|
|
20
|
+
subscriptions: [],
|
|
21
|
+
transactions: [],
|
|
22
|
+
};
|
|
23
|
+
// Get user profile
|
|
24
|
+
const userDoc = await db.collection("users").doc(userId).get();
|
|
25
|
+
if (userDoc.exists) {
|
|
26
|
+
result.exists = true;
|
|
27
|
+
result.profile = userDoc.data();
|
|
28
|
+
}
|
|
29
|
+
// Get credits from root-level collection
|
|
30
|
+
if (includeCredits) {
|
|
31
|
+
const creditsDoc = await db.collection(creditsCollection).doc(userId).get();
|
|
32
|
+
if (creditsDoc.exists) {
|
|
33
|
+
result.credits = creditsDoc.data();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Get subscriptions subcollection
|
|
37
|
+
if (includeSubscriptions) {
|
|
38
|
+
const subsSnapshot = await db
|
|
39
|
+
.collection("users")
|
|
40
|
+
.doc(userId)
|
|
41
|
+
.collection("subscriptions")
|
|
42
|
+
.get();
|
|
43
|
+
result.subscriptions = subsSnapshot.docs.map((doc) => ({
|
|
44
|
+
id: doc.id,
|
|
45
|
+
...doc.data(),
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
// Get transactions subcollection
|
|
49
|
+
if (includeTransactions) {
|
|
50
|
+
const txSnapshot = await db
|
|
51
|
+
.collection("users")
|
|
52
|
+
.doc(userId)
|
|
53
|
+
.collection("transactions")
|
|
54
|
+
.orderBy("createdAt", "desc")
|
|
55
|
+
.limit(50)
|
|
56
|
+
.get();
|
|
57
|
+
result.transactions = txSnapshot.docs.map((doc) => ({
|
|
58
|
+
id: doc.id,
|
|
59
|
+
...doc.data(),
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* List all users with their credit balances
|
|
66
|
+
*/
|
|
67
|
+
async function listUsersWithCredits(db, options) {
|
|
68
|
+
const { creditsCollection = "user_credits", limit = 100, onlyWithCredits = false } = options || {};
|
|
69
|
+
const usersSnapshot = await db.collection("users").limit(limit).get();
|
|
70
|
+
const result = [];
|
|
71
|
+
for (const userDoc of usersSnapshot.docs) {
|
|
72
|
+
const userData = userDoc.data();
|
|
73
|
+
const creditsDoc = await db.collection(creditsCollection).doc(userDoc.id).get();
|
|
74
|
+
const credits = creditsDoc.exists ? creditsDoc.data() : null;
|
|
75
|
+
if (onlyWithCredits && !credits)
|
|
76
|
+
continue;
|
|
77
|
+
result.push({
|
|
78
|
+
userId: userDoc.id,
|
|
79
|
+
displayName: userData.displayName,
|
|
80
|
+
email: userData.email,
|
|
81
|
+
isAnonymous: userData.isAnonymous || false,
|
|
82
|
+
credits,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get credits summary across all users
|
|
89
|
+
*/
|
|
90
|
+
async function getCreditsSummary(db, collectionName = "user_credits") {
|
|
91
|
+
const snapshot = await db.collection(collectionName).get();
|
|
92
|
+
let totalText = 0;
|
|
93
|
+
let totalImage = 0;
|
|
94
|
+
let totalVideo = 0;
|
|
95
|
+
let totalAudio = 0;
|
|
96
|
+
let usersWithCredits = 0;
|
|
97
|
+
let usersWithZeroCredits = 0;
|
|
98
|
+
snapshot.docs.forEach((doc) => {
|
|
99
|
+
const data = doc.data();
|
|
100
|
+
const text = data.text || 0;
|
|
101
|
+
const image = data.image || 0;
|
|
102
|
+
const video = data.video || 0;
|
|
103
|
+
const audio = data.audio || 0;
|
|
104
|
+
totalText += text;
|
|
105
|
+
totalImage += image;
|
|
106
|
+
totalVideo += video;
|
|
107
|
+
totalAudio += audio;
|
|
108
|
+
if (text > 0 || image > 0 || video > 0 || audio > 0) {
|
|
109
|
+
usersWithCredits++;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
usersWithZeroCredits++;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
totalUsers: snapshot.docs.length,
|
|
117
|
+
totalText,
|
|
118
|
+
totalImage,
|
|
119
|
+
totalVideo,
|
|
120
|
+
totalAudio,
|
|
121
|
+
usersWithCredits,
|
|
122
|
+
usersWithZeroCredits,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=user-queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-queries.js","sourceRoot":"","sources":["../../scripts/user-queries.ts"],"names":[],"mappings":"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"}
|
package/dist/scripts/user.d.ts
CHANGED
|
@@ -2,71 +2,7 @@
|
|
|
2
2
|
* Firebase Admin User Utilities
|
|
3
3
|
* Read and manage user data including credits, subscriptions, transactions
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
* Get complete user data including profile and all related collections
|
|
9
|
-
*/
|
|
10
|
-
export declare function getUserData(db: admin.firestore.Firestore, userId: string, options?: {
|
|
11
|
-
includeCredits?: boolean;
|
|
12
|
-
includeSubscriptions?: boolean;
|
|
13
|
-
includeTransactions?: boolean;
|
|
14
|
-
creditsCollection?: string;
|
|
15
|
-
}): Promise<UserData>;
|
|
16
|
-
/**
|
|
17
|
-
* Initialize credits for a user
|
|
18
|
-
*/
|
|
19
|
-
export declare function initializeUserCredits(db: admin.firestore.Firestore, userId: string, config: CreditsConfig): Promise<UserCredits>;
|
|
20
|
-
/**
|
|
21
|
-
* Add credits to a user
|
|
22
|
-
*/
|
|
23
|
-
export declare function addUserCredits(db: admin.firestore.Firestore, userId: string, credits: {
|
|
24
|
-
text?: number;
|
|
25
|
-
image?: number;
|
|
26
|
-
video?: number;
|
|
27
|
-
audio?: number;
|
|
28
|
-
}, collectionName?: string): Promise<void>;
|
|
29
|
-
/**
|
|
30
|
-
* Set credits for a user (overwrite)
|
|
31
|
-
*/
|
|
32
|
-
export declare function setUserCredits(db: admin.firestore.Firestore, userId: string, credits: {
|
|
33
|
-
text?: number;
|
|
34
|
-
image?: number;
|
|
35
|
-
video?: number;
|
|
36
|
-
audio?: number;
|
|
37
|
-
}, collectionName?: string): Promise<void>;
|
|
38
|
-
/**
|
|
39
|
-
* List all users with their credit balances
|
|
40
|
-
*/
|
|
41
|
-
export declare function listUsersWithCredits(db: admin.firestore.Firestore, options?: {
|
|
42
|
-
creditsCollection?: string;
|
|
43
|
-
limit?: number;
|
|
44
|
-
onlyWithCredits?: boolean;
|
|
45
|
-
}): Promise<Array<{
|
|
46
|
-
userId: string;
|
|
47
|
-
displayName?: string;
|
|
48
|
-
email?: string;
|
|
49
|
-
isAnonymous: boolean;
|
|
50
|
-
credits: UserCredits | null;
|
|
51
|
-
}>>;
|
|
52
|
-
/**
|
|
53
|
-
* Delete user credits document
|
|
54
|
-
*/
|
|
55
|
-
export declare function deleteUserCredits(db: admin.firestore.Firestore, userId: string, collectionName?: string): Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
* Get credits summary across all users
|
|
58
|
-
*/
|
|
59
|
-
export declare function getCreditsSummary(db: admin.firestore.Firestore, collectionName?: string): Promise<{
|
|
60
|
-
totalUsers: number;
|
|
61
|
-
totalText: number;
|
|
62
|
-
totalImage: number;
|
|
63
|
-
totalVideo: number;
|
|
64
|
-
totalAudio: number;
|
|
65
|
-
usersWithCredits: number;
|
|
66
|
-
usersWithZeroCredits: number;
|
|
67
|
-
}>;
|
|
68
|
-
/**
|
|
69
|
-
* Print user data in formatted way
|
|
70
|
-
*/
|
|
71
|
-
export declare function printUserData(data: UserData): void;
|
|
5
|
+
export { getUserData, listUsersWithCredits, getCreditsSummary, } from "./user-queries";
|
|
6
|
+
export { initializeUserCredits, addUserCredits, setUserCredits, deleteUserCredits, } from "./user-commands";
|
|
7
|
+
export { printUserData, } from "./user-formatters";
|
|
72
8
|
//# sourceMappingURL=user.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../scripts/user.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../scripts/user.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,aAAa,GACd,MAAM,mBAAmB,CAAC"}
|