@cravery/core 0.0.2 → 0.0.4
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/config/ai.d.ts +3 -0
- package/dist/config/ai.d.ts.map +1 -0
- package/dist/config/ai.js +36 -0
- package/dist/config/ai.js.map +1 -0
- package/dist/config/collections.d.ts +1 -0
- package/dist/config/collections.d.ts.map +1 -1
- package/dist/config/collections.js +1 -0
- package/dist/config/collections.js.map +1 -1
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -0
- package/dist/config/index.js.map +1 -1
- package/dist/enums/cuisine.d.ts +1 -1
- package/dist/enums/difficulty.d.ts +1 -1
- package/dist/enums/moderation_status.d.ts +1 -1
- package/dist/enums/priority.d.ts +1 -1
- package/dist/enums/profile_status.d.ts +2 -2
- package/dist/enums/recipe_source.d.ts +2 -2
- package/dist/enums/recipe_status.d.ts +2 -2
- package/dist/enums/role.d.ts +1 -1
- package/dist/enums/severity.d.ts +1 -1
- package/dist/enums/spiciness.d.ts +1 -1
- package/dist/enums/status.d.ts +2 -2
- package/dist/enums/unit.d.ts +5 -5
- package/dist/enums/user_status.d.ts +2 -2
- package/dist/lib/ai/cost.d.ts +22 -0
- package/dist/lib/ai/cost.d.ts.map +1 -0
- package/dist/lib/ai/cost.js +45 -0
- package/dist/lib/ai/cost.js.map +1 -0
- package/dist/lib/ai/embedding.d.ts +4 -0
- package/dist/lib/ai/embedding.d.ts.map +1 -0
- package/dist/lib/ai/embedding.js +48 -0
- package/dist/lib/ai/embedding.js.map +1 -0
- package/dist/lib/ai/errors.d.ts +14 -0
- package/dist/lib/ai/errors.d.ts.map +1 -0
- package/dist/lib/ai/errors.js +40 -0
- package/dist/lib/ai/errors.js.map +1 -0
- package/dist/lib/ai/flow.d.ts +53 -0
- package/dist/lib/ai/flow.d.ts.map +1 -0
- package/dist/lib/ai/flow.js +60 -0
- package/dist/lib/ai/flow.js.map +1 -0
- package/dist/lib/ai/genkit.d.ts +4 -0
- package/dist/lib/ai/genkit.d.ts.map +1 -0
- package/dist/lib/ai/genkit.js +16 -0
- package/dist/lib/ai/genkit.js.map +1 -0
- package/dist/lib/ai/image.d.ts +7 -0
- package/dist/lib/ai/image.d.ts.map +1 -0
- package/dist/lib/ai/image.js +23 -0
- package/dist/lib/ai/image.js.map +1 -0
- package/dist/lib/ai/index.d.ts +7 -0
- package/dist/lib/ai/index.d.ts.map +1 -0
- package/dist/lib/ai/index.js +23 -0
- package/dist/lib/ai/index.js.map +1 -0
- package/dist/lib/api.d.ts +18 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +69 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/cost.d.ts +22 -0
- package/dist/lib/cost.d.ts.map +1 -0
- package/dist/lib/cost.js +45 -0
- package/dist/lib/cost.js.map +1 -0
- package/dist/lib/embedding.d.ts +4 -0
- package/dist/lib/embedding.d.ts.map +1 -0
- package/dist/lib/embedding.js +48 -0
- package/dist/lib/embedding.js.map +1 -0
- package/dist/lib/firebase.d.ts +3 -0
- package/dist/lib/firebase.d.ts.map +1 -0
- package/dist/lib/firebase.js +8 -0
- package/dist/lib/firebase.js.map +1 -0
- package/dist/lib/flow.d.ts +53 -0
- package/dist/lib/flow.d.ts.map +1 -0
- package/dist/lib/flow.js +60 -0
- package/dist/lib/flow.js.map +1 -0
- package/dist/lib/genkit.d.ts +4 -0
- package/dist/lib/genkit.d.ts.map +1 -0
- package/dist/lib/genkit.js +16 -0
- package/dist/lib/genkit.js.map +1 -0
- package/dist/lib/iam.d.ts +3 -0
- package/dist/lib/iam.d.ts.map +1 -0
- package/dist/lib/iam.js +57 -0
- package/dist/lib/iam.js.map +1 -0
- package/dist/lib/image.d.ts +7 -0
- package/dist/lib/image.d.ts.map +1 -0
- package/dist/lib/image.js +24 -0
- package/dist/lib/image.js.map +1 -0
- package/dist/lib/index.d.ts +6 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +20 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/repository/errors.d.ts +20 -0
- package/dist/lib/repository/errors.d.ts.map +1 -0
- package/dist/lib/repository/errors.js +33 -0
- package/dist/lib/repository/errors.js.map +1 -0
- package/dist/lib/repository/firestore.repository.d.ts +50 -0
- package/dist/lib/repository/firestore.repository.d.ts.map +1 -0
- package/dist/lib/repository/firestore.repository.js +407 -0
- package/dist/lib/repository/firestore.repository.js.map +1 -0
- package/dist/lib/repository/index.d.ts +7 -0
- package/dist/lib/repository/index.d.ts.map +1 -0
- package/dist/lib/repository/index.js +23 -0
- package/dist/lib/repository/index.js.map +1 -0
- package/dist/lib/repository/profile.repository.d.ts +12 -0
- package/dist/lib/repository/profile.repository.d.ts.map +1 -0
- package/dist/lib/repository/profile.repository.js +39 -0
- package/dist/lib/repository/profile.repository.js.map +1 -0
- package/dist/lib/repository/rtdb.repository.d.ts +21 -0
- package/dist/lib/repository/rtdb.repository.d.ts.map +1 -0
- package/dist/lib/repository/rtdb.repository.js +55 -0
- package/dist/lib/repository/rtdb.repository.js.map +1 -0
- package/dist/lib/repository/settings.repository.d.ts +10 -0
- package/dist/lib/repository/settings.repository.d.ts.map +1 -0
- package/dist/lib/repository/settings.repository.js +30 -0
- package/dist/lib/repository/settings.repository.js.map +1 -0
- package/dist/lib/repository/user.repository.d.ts +11 -0
- package/dist/lib/repository/user.repository.d.ts.map +1 -0
- package/dist/lib/repository/user.repository.js +36 -0
- package/dist/lib/repository/user.repository.js.map +1 -0
- package/dist/lib/storage.d.ts +6 -0
- package/dist/lib/storage.d.ts.map +1 -0
- package/dist/lib/storage.js +34 -0
- package/dist/lib/storage.js.map +1 -0
- package/dist/types/ai/config.d.ts +2 -2
- package/dist/types/ai/config.d.ts.map +1 -1
- package/dist/types/ai/filters.d.ts +3 -3
- package/dist/types/ai/recipe.d.ts +10 -10
- package/dist/types/equipment.d.ts +2 -2
- package/dist/types/equipment.js +1 -1
- package/dist/types/error.d.ts +14 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +40 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/ingredient.d.ts +24 -24
- package/dist/types/ingredient.js +1 -1
- package/dist/types/ingredient.js.map +1 -1
- package/dist/types/moderation.d.ts +5 -6
- package/dist/types/moderation.d.ts.map +1 -1
- package/dist/types/profile.d.ts +3 -3
- package/dist/types/profile.d.ts.map +1 -1
- package/dist/types/profile.js.map +1 -1
- package/dist/types/recipe.d.ts +28 -29
- package/dist/types/recipe.d.ts.map +1 -1
- package/dist/types/repository.d.ts +83 -0
- package/dist/types/repository.d.ts.map +1 -0
- package/dist/types/repository.js +6 -0
- package/dist/types/repository.js.map +1 -0
- package/dist/types/settings.d.ts +141 -0
- package/dist/types/settings.d.ts.map +1 -0
- package/dist/types/settings.js +70 -0
- package/dist/types/settings.js.map +1 -0
- package/dist/types/subscription.d.ts +0 -1
- package/dist/types/subscription.d.ts.map +1 -1
- package/dist/types/user.d.ts +4 -4
- package/dist/types/user.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/config/ai.ts +34 -0
- package/src/config/collections.ts +1 -0
- package/src/config/index.ts +1 -0
- package/src/lib/ai/cost.ts +72 -0
- package/src/lib/ai/embedding.ts +53 -0
- package/src/lib/ai/errors.ts +43 -0
- package/src/lib/ai/flow.ts +88 -0
- package/src/lib/ai/genkit.ts +18 -0
- package/src/lib/ai/image.ts +27 -0
- package/src/lib/ai/index.ts +6 -0
- package/src/lib/api.ts +90 -0
- package/src/lib/firebase.ts +5 -0
- package/src/lib/iam.ts +22 -0
- package/src/lib/index.ts +6 -0
- package/src/lib/repository/errors.ts +37 -0
- package/src/lib/repository/firestore.repository.ts +607 -0
- package/src/lib/repository/index.ts +6 -0
- package/src/lib/repository/profile.repository.ts +51 -0
- package/src/lib/repository/rtdb.repository.ts +68 -0
- package/src/lib/repository/settings.repository.ts +38 -0
- package/src/lib/repository/user.repository.ts +44 -0
- package/src/lib/storage.ts +42 -0
- package/src/types/ai/config.ts +3 -2
- package/src/types/equipment.ts +1 -1
- package/src/types/index.ts +2 -0
- package/src/types/ingredient.ts +1 -1
- package/src/types/profile.ts +2 -0
- package/src/types/repository.ts +115 -0
- package/src/types/settings.ts +85 -0
- package/src/types/user.ts +2 -0
package/src/lib/api.ts
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import {
|
|
2
|
+
onCall,
|
|
3
|
+
HttpsError,
|
|
4
|
+
CallableRequest,
|
|
5
|
+
CallableOptions,
|
|
6
|
+
} from "firebase-functions/v2/https";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { isAdmin, isModerator } from "./iam";
|
|
9
|
+
|
|
10
|
+
const DEFAULT_OPTIONS: CallableOptions = { cors: true, enforceAppCheck: true };
|
|
11
|
+
|
|
12
|
+
const handleError = (error: unknown): never => {
|
|
13
|
+
if (error instanceof z.ZodError) {
|
|
14
|
+
throw new HttpsError(
|
|
15
|
+
"invalid-argument",
|
|
16
|
+
`Validation failed: ${error.message}`,
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
if (error instanceof HttpsError) {
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
throw new HttpsError(
|
|
23
|
+
"internal",
|
|
24
|
+
error instanceof Error ? error.message : "Unknown error",
|
|
25
|
+
);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
class CallableBuilder<T> {
|
|
29
|
+
private requiresAuth = false;
|
|
30
|
+
private requiresAdmin = false;
|
|
31
|
+
private requiresModerator = false;
|
|
32
|
+
private options: CallableOptions = DEFAULT_OPTIONS;
|
|
33
|
+
|
|
34
|
+
constructor(private schema: z.ZodSchema<T>) {}
|
|
35
|
+
|
|
36
|
+
withOptions(options: CallableOptions) {
|
|
37
|
+
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
requireUser() {
|
|
42
|
+
this.requiresAuth = true;
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
requireAdmin() {
|
|
47
|
+
this.requiresAuth = true;
|
|
48
|
+
this.requiresAdmin = true;
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
requireModerator() {
|
|
53
|
+
this.requiresAuth = true;
|
|
54
|
+
this.requiresModerator = true;
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
handle<R>(handler: (data: T, request: CallableRequest) => Promise<R>) {
|
|
59
|
+
return onCall(this.options, async (request) => {
|
|
60
|
+
if (this.requiresAuth && !request.auth) {
|
|
61
|
+
throw new HttpsError("unauthenticated", "Authentication required");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (request.auth) {
|
|
65
|
+
const uid = request.auth.uid;
|
|
66
|
+
|
|
67
|
+
if (this.requiresAdmin && !(await isAdmin(uid))) {
|
|
68
|
+
throw new HttpsError("permission-denied", "Admin access required");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (this.requiresModerator && !(await isModerator(uid))) {
|
|
72
|
+
throw new HttpsError(
|
|
73
|
+
"permission-denied",
|
|
74
|
+
"Moderator access required",
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
const data = this.schema.parse(request.data);
|
|
81
|
+
return await handler(data, request);
|
|
82
|
+
} catch (error) {
|
|
83
|
+
throw handleError(error);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const callable = <T>(schema: z.ZodSchema<T>) =>
|
|
90
|
+
new CallableBuilder(schema);
|
package/src/lib/iam.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as admin from "firebase-admin";
|
|
2
|
+
import { Role } from "../enums";
|
|
3
|
+
|
|
4
|
+
const getUserRole = async (uid: string): Promise<Role> => {
|
|
5
|
+
let role: Role = "guest";
|
|
6
|
+
const userDoc = await admin.firestore().collection("users").doc(uid).get();
|
|
7
|
+
if (userDoc.exists) {
|
|
8
|
+
const userData = userDoc.data();
|
|
9
|
+
role = userData?.role || "user";
|
|
10
|
+
}
|
|
11
|
+
return role;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export const isAdmin = async (uid: string): Promise<boolean> => {
|
|
15
|
+
const role = await getUserRole(uid);
|
|
16
|
+
return role === "admin";
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const isModerator = async (uid: string): Promise<boolean> => {
|
|
20
|
+
const role = await getUserRole(uid);
|
|
21
|
+
return role === "admin" || role === "moderator";
|
|
22
|
+
};
|
package/src/lib/index.ts
CHANGED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export enum RepositoryErrorCode {
|
|
2
|
+
NOT_FOUND = "NOT_FOUND",
|
|
3
|
+
ALREADY_EXISTS = "ALREADY_EXISTS",
|
|
4
|
+
VALIDATION_ERROR = "VALIDATION_ERROR",
|
|
5
|
+
QUERY_LIMIT_EXCEEDED = "QUERY_LIMIT_EXCEEDED",
|
|
6
|
+
TRANSACTION_FAILED = "TRANSACTION_FAILED",
|
|
7
|
+
PERMISSION_DENIED = "PERMISSION_DENIED",
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class RepositoryError extends Error {
|
|
11
|
+
public readonly code: RepositoryErrorCode;
|
|
12
|
+
public readonly context?: Record<string, unknown>;
|
|
13
|
+
|
|
14
|
+
constructor(
|
|
15
|
+
code: RepositoryErrorCode,
|
|
16
|
+
message: string,
|
|
17
|
+
context?: Record<string, unknown>,
|
|
18
|
+
) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.name = "RepositoryError";
|
|
21
|
+
this.code = code;
|
|
22
|
+
this.context = context;
|
|
23
|
+
|
|
24
|
+
if (Error.captureStackTrace) {
|
|
25
|
+
Error.captureStackTrace(this, RepositoryError);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
toJSON() {
|
|
30
|
+
return {
|
|
31
|
+
name: this.name,
|
|
32
|
+
code: this.code,
|
|
33
|
+
message: this.message,
|
|
34
|
+
context: this.context,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|