90dc-core 1.12.0 → 1.12.2

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.
Files changed (34) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/lib/classes/Database.d.ts +0 -16
  3. package/dist/lib/classes/Database.d.ts.map +1 -1
  4. package/dist/lib/classes/Database.js +9 -18
  5. package/dist/lib/classes/Database.js.map +1 -1
  6. package/dist/lib/dbmodels/diet/Ingredient.d.ts +30 -0
  7. package/dist/lib/dbmodels/diet/Ingredient.d.ts.map +1 -0
  8. package/dist/lib/dbmodels/diet/Ingredient.js +88 -0
  9. package/dist/lib/dbmodels/diet/Ingredient.js.map +1 -0
  10. package/dist/lib/dbmodels/diet/IngredientTag.d.ts +22 -0
  11. package/dist/lib/dbmodels/diet/IngredientTag.d.ts.map +1 -0
  12. package/dist/lib/dbmodels/diet/IngredientTag.js +64 -0
  13. package/dist/lib/dbmodels/diet/IngredientTag.js.map +1 -0
  14. package/dist/lib/dbmodels/diet/IngredientTags.d.ts +6 -0
  15. package/dist/lib/dbmodels/diet/IngredientTags.d.ts.map +1 -0
  16. package/dist/lib/dbmodels/diet/IngredientTags.js +29 -0
  17. package/dist/lib/dbmodels/diet/IngredientTags.js.map +1 -0
  18. package/dist/lib/dbmodels/diet/Recipe.d.ts +3 -0
  19. package/dist/lib/dbmodels/diet/Recipe.d.ts.map +1 -1
  20. package/dist/lib/dbmodels/diet/Recipe.js +15 -0
  21. package/dist/lib/dbmodels/diet/Recipe.js.map +1 -1
  22. package/dist/lib/dbmodels/diet/RecipeIngredient.d.ts +24 -0
  23. package/dist/lib/dbmodels/diet/RecipeIngredient.d.ts.map +1 -0
  24. package/dist/lib/dbmodels/diet/RecipeIngredient.js +66 -0
  25. package/dist/lib/dbmodels/diet/RecipeIngredient.js.map +1 -0
  26. package/dist/lib/dbmodels/index.d.ts +10 -2
  27. package/dist/lib/dbmodels/index.d.ts.map +1 -1
  28. package/dist/lib/dbmodels/index.js +13 -1
  29. package/dist/lib/dbmodels/index.js.map +1 -1
  30. package/dist/lib/utils/AuthenticationUtil.d.ts +1 -0
  31. package/dist/lib/utils/AuthenticationUtil.d.ts.map +1 -1
  32. package/dist/lib/utils/AuthenticationUtil.js +30 -0
  33. package/dist/lib/utils/AuthenticationUtil.js.map +1 -1
  34. package/package.json +3 -2
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ export * from "./lib/models/WorkoutInterfaces.js";
5
5
  export * from "./lib/models/UserInterfaces.js";
6
6
  export * from "./lib/models/NotificationInterfaces.js";
7
7
  //DB Models - Export all models and model arrays
8
- export * from "./lib/dbmodels";
8
+ export * from "./lib/dbmodels/index.js";
9
9
  //Utils
10
10
  export { AuthenticationUtil } from "./lib/utils/AuthenticationUtil.js";
11
11
  export { NotificationsUtil } from "./lib/utils/NotificationsUtil.js";
@@ -11,29 +11,13 @@ export declare class DatabaseClient {
11
11
  private static instance;
12
12
  private static isConnected;
13
13
  static getInstance(config?: DatabaseConfig, models?: ModelCtor[]): Sequelize;
14
- /**
15
- * Test database connection
16
- */
17
14
  static authenticate(): Promise<void>;
18
- /**
19
- * Close database connection
20
- */
21
15
  static close(): Promise<void>;
22
- /**
23
- * Sync all models with database
24
- * WARNING: Use with caution in production
25
- */
26
16
  static sync(options?: {
27
17
  force?: boolean;
28
18
  alter?: boolean;
29
19
  }): Promise<void>;
30
- /**
31
- * Check if database is connected
32
- */
33
20
  static isConnectedToDatabase(): boolean;
34
- /**
35
- * Get raw Sequelize instance (use with caution)
36
- */
37
21
  static getSequelizeInstance(): Sequelize;
38
22
  }
39
23
  //# sourceMappingURL=Database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/lib/classes/Database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKxF,MAAM,WAAW,cAAc;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAkB;IAE5C,MAAM,CAAC,WAAW,CACd,MAAM,CAAC,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,SAAS,EAAE,GACrB,SAAS;IAkCZ;;OAEG;WACU,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB1C;;OAEG;WACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IASnC;;;OAGG;WACU,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBhF;;OAEG;IACH,MAAM,CAAC,qBAAqB,IAAI,OAAO;IAIvC;;OAEG;IACH,MAAM,CAAC,oBAAoB,IAAI,SAAS;CAQ3C"}
1
+ {"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/lib/classes/Database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAKxF,MAAM,WAAW,cAAc;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA0B;IACjD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAkB;IAE5C,MAAM,CAAC,WAAW,CACd,MAAM,CAAC,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,SAAS,EAAE,GACrB,SAAS;WAoCC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;WAmB7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;WAStB,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBhF,MAAM,CAAC,qBAAqB,IAAI,OAAO;IAKvC,MAAM,CAAC,oBAAoB,IAAI,SAAS;CAQ3C"}
@@ -21,20 +21,20 @@ export class DatabaseClient {
21
21
  idle: config.DB_IDLE_TIMEOUT || 10000
22
22
  },
23
23
  logging: config.logging !== false ? (msg)=>logger.debug(msg) : false,
24
- models: models || []
24
+ models: models || [],
25
+ define: {
26
+ timestamps: false
27
+ }
25
28
  };
26
29
  DatabaseClient.instance = new Sequelize(config.DATABASE_URL, options);
27
30
  logger.info("DatabaseClient: Sequelize instance created");
28
31
  } else if (models && models.length > 0) {
29
- // Add additional models to existing instance
30
32
  DatabaseClient.instance.addModels(models);
31
33
  logger.info(`DatabaseClient: Added ${models.length} additional models`);
32
34
  }
33
35
  return DatabaseClient.instance;
34
36
  }
35
- /**
36
- * Test database connection
37
- */ static async authenticate() {
37
+ static async authenticate() {
38
38
  if (!DatabaseClient.instance) {
39
39
  throw new Error("DatabaseClient: getInstance() must be called before authenticate()");
40
40
  }
@@ -48,9 +48,7 @@ export class DatabaseClient {
48
48
  throw error;
49
49
  }
50
50
  }
51
- /**
52
- * Close database connection
53
- */ static async close() {
51
+ static async close() {
54
52
  if (DatabaseClient.instance) {
55
53
  await DatabaseClient.instance.close();
56
54
  DatabaseClient.instance = null;
@@ -58,10 +56,7 @@ export class DatabaseClient {
58
56
  logger.info("DatabaseClient: Connection closed");
59
57
  }
60
58
  }
61
- /**
62
- * Sync all models with database
63
- * WARNING: Use with caution in production
64
- */ static async sync(options) {
59
+ static async sync(options) {
65
60
  if (!DatabaseClient.instance) {
66
61
  throw new Error("DatabaseClient: getInstance() must be called before sync()");
67
62
  }
@@ -73,14 +68,10 @@ export class DatabaseClient {
73
68
  throw error;
74
69
  }
75
70
  }
76
- /**
77
- * Check if database is connected
78
- */ static isConnectedToDatabase() {
71
+ static isConnectedToDatabase() {
79
72
  return DatabaseClient.isConnected;
80
73
  }
81
- /**
82
- * Get raw Sequelize instance (use with caution)
83
- */ static getSequelizeInstance() {
74
+ static getSequelizeInstance() {
84
75
  if (!DatabaseClient.instance) {
85
76
  throw new Error("DatabaseClient: getInstance() must be called before getSequelizeInstance()");
86
77
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/classes/Database.ts"],"sourcesContent":["import { Sequelize, type SequelizeOptions, type ModelCtor } from \"sequelize-typescript\";\nimport { Log } from \"../utils/Logger.js\";\n\nconst logger = Log.getInstance();\n\nexport interface DatabaseConfig {\n DATABASE_URL: string;\n DB_POOL_MAX?: number;\n DB_POOL_MIN?: number;\n DB_ACQUIRE_TIMEOUT?: number;\n DB_IDLE_TIMEOUT?: number;\n logging?: boolean;\n}\n\nexport class DatabaseClient {\n private static instance: Sequelize | null = null;\n private static isConnected: boolean = false;\n\n static getInstance(\n config?: DatabaseConfig,\n models?: ModelCtor[],\n ): Sequelize {\n if (!DatabaseClient.instance) {\n if (!config) {\n throw new Error(\n \"DatabaseClient: config is required for first initialization\",\n );\n }\n\n const options: SequelizeOptions = {\n dialect: \"postgres\",\n dialectOptions: {\n socketPath: new URL(config.DATABASE_URL).hostname,\n },\n pool: {\n max: config.DB_POOL_MAX || 10,\n min: config.DB_POOL_MIN || 0,\n acquire: config.DB_ACQUIRE_TIMEOUT || 60000,\n idle: config.DB_IDLE_TIMEOUT || 10000,\n },\n logging: config.logging !== false ? (msg: string) => logger.debug(msg) : false,\n models: models || [],\n };\n\n DatabaseClient.instance = new Sequelize(config.DATABASE_URL, options);\n logger.info(\"DatabaseClient: Sequelize instance created\");\n } else if (models && models.length > 0) {\n // Add additional models to existing instance\n DatabaseClient.instance.addModels(models);\n logger.info(`DatabaseClient: Added ${models.length} additional models`);\n }\n\n return DatabaseClient.instance;\n }\n\n /**\n * Test database connection\n */\n static async authenticate(): Promise<void> {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before authenticate()\",\n );\n }\n\n try {\n await DatabaseClient.instance.authenticate();\n DatabaseClient.isConnected = true;\n logger.info(\"DatabaseClient: Connection authenticated successfully\");\n } catch (error) {\n DatabaseClient.isConnected = false;\n logger.error(\"DatabaseClient: Unable to connect to database\", error);\n throw error;\n }\n }\n\n /**\n * Close database connection\n */\n static async close(): Promise<void> {\n if (DatabaseClient.instance) {\n await DatabaseClient.instance.close();\n DatabaseClient.instance = null;\n DatabaseClient.isConnected = false;\n logger.info(\"DatabaseClient: Connection closed\");\n }\n }\n\n /**\n * Sync all models with database\n * WARNING: Use with caution in production\n */\n static async sync(options?: { force?: boolean; alter?: boolean }): Promise<void> {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before sync()\",\n );\n }\n\n try {\n await DatabaseClient.instance.sync(options);\n logger.info(\"DatabaseClient: Models synced with database\", options);\n } catch (error) {\n logger.error(\"DatabaseClient: Failed to sync models\", error);\n throw error;\n }\n }\n\n /**\n * Check if database is connected\n */\n static isConnectedToDatabase(): boolean {\n return DatabaseClient.isConnected;\n }\n\n /**\n * Get raw Sequelize instance (use with caution)\n */\n static getSequelizeInstance(): Sequelize {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before getSequelizeInstance()\",\n );\n }\n return DatabaseClient.instance;\n }\n}\n"],"names":["Sequelize","Log","logger","getInstance","DatabaseClient","instance","isConnected","config","models","Error","options","dialect","dialectOptions","socketPath","URL","DATABASE_URL","hostname","pool","max","DB_POOL_MAX","min","DB_POOL_MIN","acquire","DB_ACQUIRE_TIMEOUT","idle","DB_IDLE_TIMEOUT","logging","msg","debug","info","length","addModels","authenticate","error","close","sync","isConnectedToDatabase","getSequelizeInstance"],"mappings":"AAAA,SAASA,SAAS,QAA+C,uBAAuB;AACxF,SAASC,GAAG,QAAQ,qBAAqB;AAEzC,MAAMC,SAASD,IAAIE,WAAW;AAW9B,OAAO,MAAMC;IACT,OAAeC,WAA6B,KAAK;IACjD,OAAeC,cAAuB,MAAM;IAE5C,OAAOH,YACHI,MAAuB,EACvBC,MAAoB,EACX;QACT,IAAI,CAACJ,eAAeC,QAAQ,EAAE;YAC1B,IAAI,CAACE,QAAQ;gBACT,MAAM,IAAIE,MACN;YAER;YAEA,MAAMC,UAA4B;gBAC9BC,SAAS;gBACTC,gBAAgB;oBACZC,YAAY,IAAIC,IAAIP,OAAOQ,YAAY,EAAEC,QAAQ;gBACrD;gBACAC,MAAM;oBACFC,KAAKX,OAAOY,WAAW,IAAI;oBAC3BC,KAAKb,OAAOc,WAAW,IAAI;oBAC3BC,SAASf,OAAOgB,kBAAkB,IAAI;oBACtCC,MAAMjB,OAAOkB,eAAe,IAAI;gBACpC;gBACAC,SAASnB,OAAOmB,OAAO,KAAK,QAAQ,CAACC,MAAgBzB,OAAO0B,KAAK,CAACD,OAAO;gBACzEnB,QAAQA,UAAU,EAAE;YACxB;YAEAJ,eAAeC,QAAQ,GAAG,IAAIL,UAAUO,OAAOQ,YAAY,EAAEL;YAC7DR,OAAO2B,IAAI,CAAC;QAChB,OAAO,IAAIrB,UAAUA,OAAOsB,MAAM,GAAG,GAAG;YACpC,6CAA6C;YAC7C1B,eAAeC,QAAQ,CAAC0B,SAAS,CAACvB;YAClCN,OAAO2B,IAAI,CAAC,CAAC,sBAAsB,EAAErB,OAAOsB,MAAM,CAAC,kBAAkB,CAAC;QAC1E;QAEA,OAAO1B,eAAeC,QAAQ;IAClC;IAEA;;KAEC,GACD,aAAa2B,eAA8B;QACvC,IAAI,CAAC5B,eAAeC,QAAQ,EAAE;YAC1B,MAAM,IAAII,MACN;QAER;QAEA,IAAI;YACA,MAAML,eAAeC,QAAQ,CAAC2B,YAAY;YAC1C5B,eAAeE,WAAW,GAAG;YAC7BJ,OAAO2B,IAAI,CAAC;QAChB,EAAE,OAAOI,OAAO;YACZ7B,eAAeE,WAAW,GAAG;YAC7BJ,OAAO+B,KAAK,CAAC,iDAAiDA;YAC9D,MAAMA;QACV;IACJ;IAEA;;KAEC,GACD,aAAaC,QAAuB;QAChC,IAAI9B,eAAeC,QAAQ,EAAE;YACzB,MAAMD,eAAeC,QAAQ,CAAC6B,KAAK;YACnC9B,eAAeC,QAAQ,GAAG;YAC1BD,eAAeE,WAAW,GAAG;YAC7BJ,OAAO2B,IAAI,CAAC;QAChB;IACJ;IAEA;;;KAGC,GACD,aAAaM,KAAKzB,OAA8C,EAAiB;QAC7E,IAAI,CAACN,eAAeC,QAAQ,EAAE;YAC1B,MAAM,IAAII,MACN;QAER;QAEA,IAAI;YACA,MAAML,eAAeC,QAAQ,CAAC8B,IAAI,CAACzB;YACnCR,OAAO2B,IAAI,CAAC,+CAA+CnB;QAC/D,EAAE,OAAOuB,OAAO;YACZ/B,OAAO+B,KAAK,CAAC,yCAAyCA;YACtD,MAAMA;QACV;IACJ;IAEA;;KAEC,GACD,OAAOG,wBAAiC;QACpC,OAAOhC,eAAeE,WAAW;IACrC;IAEA;;KAEC,GACD,OAAO+B,uBAAkC;QACrC,IAAI,CAACjC,eAAeC,QAAQ,EAAE;YAC1B,MAAM,IAAII,MACN;QAER;QACA,OAAOL,eAAeC,QAAQ;IAClC;AACJ"}
1
+ {"version":3,"sources":["../../../src/lib/classes/Database.ts"],"sourcesContent":["import { Sequelize, type SequelizeOptions, type ModelCtor } from \"sequelize-typescript\";\nimport { Log } from \"../utils/Logger.js\";\n\nconst logger = Log.getInstance();\n\nexport interface DatabaseConfig {\n DATABASE_URL: string;\n DB_POOL_MAX?: number;\n DB_POOL_MIN?: number;\n DB_ACQUIRE_TIMEOUT?: number;\n DB_IDLE_TIMEOUT?: number;\n logging?: boolean;\n}\n\nexport class DatabaseClient {\n private static instance: Sequelize | null = null;\n private static isConnected: boolean = false;\n\n static getInstance(\n config?: DatabaseConfig,\n models?: ModelCtor[],\n ): Sequelize {\n if (!DatabaseClient.instance) {\n if (!config) {\n throw new Error(\n \"DatabaseClient: config is required for first initialization\",\n );\n }\n\n const options: SequelizeOptions = {\n dialect: \"postgres\",\n dialectOptions: {\n socketPath: new URL(config.DATABASE_URL).hostname,\n },\n pool: {\n max: config.DB_POOL_MAX || 10,\n min: config.DB_POOL_MIN || 0,\n acquire: config.DB_ACQUIRE_TIMEOUT || 60000,\n idle: config.DB_IDLE_TIMEOUT || 10000,\n },\n logging: config.logging !== false ? (msg: string) => logger.debug(msg) : false,\n models: models || [],\n define: {\n timestamps: false\n }\n };\n\n DatabaseClient.instance = new Sequelize(config.DATABASE_URL, options);\n logger.info(\"DatabaseClient: Sequelize instance created\");\n } else if (models && models.length > 0) {\n DatabaseClient.instance.addModels(models);\n logger.info(`DatabaseClient: Added ${models.length} additional models`);\n }\n\n return DatabaseClient.instance;\n }\n\n static async authenticate(): Promise<void> {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before authenticate()\",\n );\n }\n\n try {\n await DatabaseClient.instance.authenticate();\n DatabaseClient.isConnected = true;\n logger.info(\"DatabaseClient: Connection authenticated successfully\");\n } catch (error) {\n DatabaseClient.isConnected = false;\n logger.error(\"DatabaseClient: Unable to connect to database\", error);\n throw error;\n }\n }\n\n\n static async close(): Promise<void> {\n if (DatabaseClient.instance) {\n await DatabaseClient.instance.close();\n DatabaseClient.instance = null;\n DatabaseClient.isConnected = false;\n logger.info(\"DatabaseClient: Connection closed\");\n }\n }\n\n static async sync(options?: { force?: boolean; alter?: boolean }): Promise<void> {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before sync()\",\n );\n }\n\n try {\n await DatabaseClient.instance.sync(options);\n logger.info(\"DatabaseClient: Models synced with database\", options);\n } catch (error) {\n logger.error(\"DatabaseClient: Failed to sync models\", error);\n throw error;\n }\n }\n\n\n static isConnectedToDatabase(): boolean {\n return DatabaseClient.isConnected;\n }\n\n\n static getSequelizeInstance(): Sequelize {\n if (!DatabaseClient.instance) {\n throw new Error(\n \"DatabaseClient: getInstance() must be called before getSequelizeInstance()\",\n );\n }\n return DatabaseClient.instance;\n }\n}\n"],"names":["Sequelize","Log","logger","getInstance","DatabaseClient","instance","isConnected","config","models","Error","options","dialect","dialectOptions","socketPath","URL","DATABASE_URL","hostname","pool","max","DB_POOL_MAX","min","DB_POOL_MIN","acquire","DB_ACQUIRE_TIMEOUT","idle","DB_IDLE_TIMEOUT","logging","msg","debug","define","timestamps","info","length","addModels","authenticate","error","close","sync","isConnectedToDatabase","getSequelizeInstance"],"mappings":"AAAA,SAASA,SAAS,QAA+C,uBAAuB;AACxF,SAASC,GAAG,QAAQ,qBAAqB;AAEzC,MAAMC,SAASD,IAAIE,WAAW;AAW9B,OAAO,MAAMC;IACT,OAAeC,WAA6B,KAAK;IACjD,OAAeC,cAAuB,MAAM;IAE5C,OAAOH,YACHI,MAAuB,EACvBC,MAAoB,EACX;QACT,IAAI,CAACJ,eAAeC,QAAQ,EAAE;YAC1B,IAAI,CAACE,QAAQ;gBACT,MAAM,IAAIE,MACN;YAER;YAEA,MAAMC,UAA4B;gBAC9BC,SAAS;gBACTC,gBAAgB;oBACZC,YAAY,IAAIC,IAAIP,OAAOQ,YAAY,EAAEC,QAAQ;gBACrD;gBACAC,MAAM;oBACFC,KAAKX,OAAOY,WAAW,IAAI;oBAC3BC,KAAKb,OAAOc,WAAW,IAAI;oBAC3BC,SAASf,OAAOgB,kBAAkB,IAAI;oBACtCC,MAAMjB,OAAOkB,eAAe,IAAI;gBACpC;gBACAC,SAASnB,OAAOmB,OAAO,KAAK,QAAQ,CAACC,MAAgBzB,OAAO0B,KAAK,CAACD,OAAO;gBACzEnB,QAAQA,UAAU,EAAE;gBACpBqB,QAAQ;oBACJC,YAAY;gBAChB;YACJ;YAEA1B,eAAeC,QAAQ,GAAG,IAAIL,UAAUO,OAAOQ,YAAY,EAAEL;YAC7DR,OAAO6B,IAAI,CAAC;QAChB,OAAO,IAAIvB,UAAUA,OAAOwB,MAAM,GAAG,GAAG;YACpC5B,eAAeC,QAAQ,CAAC4B,SAAS,CAACzB;YAClCN,OAAO6B,IAAI,CAAC,CAAC,sBAAsB,EAAEvB,OAAOwB,MAAM,CAAC,kBAAkB,CAAC;QAC1E;QAEA,OAAO5B,eAAeC,QAAQ;IAClC;IAEA,aAAa6B,eAA8B;QACvC,IAAI,CAAC9B,eAAeC,QAAQ,EAAE;YAC1B,MAAM,IAAII,MACN;QAER;QAEA,IAAI;YACA,MAAML,eAAeC,QAAQ,CAAC6B,YAAY;YAC1C9B,eAAeE,WAAW,GAAG;YAC7BJ,OAAO6B,IAAI,CAAC;QAChB,EAAE,OAAOI,OAAO;YACZ/B,eAAeE,WAAW,GAAG;YAC7BJ,OAAOiC,KAAK,CAAC,iDAAiDA;YAC9D,MAAMA;QACV;IACJ;IAGA,aAAaC,QAAuB;QAChC,IAAIhC,eAAeC,QAAQ,EAAE;YACzB,MAAMD,eAAeC,QAAQ,CAAC+B,KAAK;YACnChC,eAAeC,QAAQ,GAAG;YAC1BD,eAAeE,WAAW,GAAG;YAC7BJ,OAAO6B,IAAI,CAAC;QAChB;IACJ;IAEA,aAAaM,KAAK3B,OAA8C,EAAiB;QAC7E,IAAI,CAACN,eAAeC,QAAQ,EAAE;YAC1B,MAAM,IAAII,MACN;QAER;QAEA,IAAI;YACA,MAAML,eAAeC,QAAQ,CAACgC,IAAI,CAAC3B;YACnCR,OAAO6B,IAAI,CAAC,+CAA+CrB;QAC/D,EAAE,OAAOyB,OAAO;YACZjC,OAAOiC,KAAK,CAAC,yCAAyCA;YACtD,MAAMA;QACV;IACJ;IAGA,OAAOG,wBAAiC;QACpC,OAAOlC,eAAeE,WAAW;IACrC;IAGA,OAAOiC,uBAAkC;QACrC,IAAI,CAACnC,eAAeC,QAAQ,EAAE;YAC1B,MAAM,IAAII,MACN;QAER;QACA,OAAOL,eAAeC,QAAQ;IAClC;AACJ"}
@@ -0,0 +1,30 @@
1
+ import { Model } from "sequelize-typescript";
2
+ import type { Optional } from "sequelize";
3
+ import { RecipeIngredient } from "./RecipeIngredient.js";
4
+ import { IngredientTag } from "./IngredientTag.js";
5
+ interface IngredientAttributes {
6
+ uuid: string;
7
+ name: string;
8
+ caloriesPer100g: number;
9
+ proteinPer100g: number;
10
+ carbsPer100g: number;
11
+ fatsPer100g: number;
12
+ category?: string;
13
+ createdAt?: Date;
14
+ updatedAt?: Date;
15
+ }
16
+ interface IngredientCreationAttributes extends Optional<IngredientAttributes, "uuid" | "category" | "createdAt" | "updatedAt"> {
17
+ }
18
+ export declare class Ingredient extends Model<IngredientAttributes, IngredientCreationAttributes> {
19
+ uuid: string;
20
+ name: string;
21
+ caloriesPer100g: number;
22
+ proteinPer100g: number;
23
+ carbsPer100g: number;
24
+ fatsPer100g: number;
25
+ category: string;
26
+ recipeIngredients: RecipeIngredient[];
27
+ tags: IngredientTag[];
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=Ingredient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Ingredient.d.ts","sourceRoot":"","sources":["../../../../src/lib/dbmodels/diet/Ingredient.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,EAON,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,UAAU,oBAAoB;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,UAAU,4BACR,SAAQ,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC;CAAG;AAE5F,qBAYa,UAAW,SAAQ,KAAK,CAAC,oBAAoB,EAAE,4BAA4B,CAAC;IAI/E,IAAI,EAAE,MAAM,CAAC;IAGb,IAAI,EAAE,MAAM,CAAC;IAGb,eAAe,EAAE,MAAM,CAAC;IAGxB,cAAc,EAAE,MAAM,CAAC;IAGvB,YAAY,EAAE,MAAM,CAAC;IAGrB,WAAW,EAAE,MAAM,CAAC;IAGpB,QAAQ,EAAE,MAAM,CAAC;IAGjB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAQtC,IAAI,EAAE,aAAa,EAAE,CAAC;CAC/B"}
@@ -0,0 +1,88 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ import { Table, Model, Column, DataType, Default, PrimaryKey, HasMany, BelongsToMany } from "sequelize-typescript";
8
+ import { RecipeIngredient } from "./RecipeIngredient.js";
9
+ import { IngredientTag } from "./IngredientTag.js";
10
+ import { IngredientTags } from "./IngredientTags.js";
11
+ export class Ingredient extends Model {
12
+ }
13
+ _ts_decorate([
14
+ PrimaryKey,
15
+ Default(DataType.UUIDV4),
16
+ Column(DataType.UUID)
17
+ ], Ingredient.prototype, "uuid", void 0);
18
+ _ts_decorate([
19
+ Column({
20
+ type: DataType.STRING,
21
+ allowNull: false,
22
+ unique: true
23
+ })
24
+ ], Ingredient.prototype, "name", void 0);
25
+ _ts_decorate([
26
+ Column({
27
+ type: DataType.FLOAT,
28
+ allowNull: false
29
+ })
30
+ ], Ingredient.prototype, "caloriesPer100g", void 0);
31
+ _ts_decorate([
32
+ Column({
33
+ type: DataType.FLOAT,
34
+ allowNull: false
35
+ })
36
+ ], Ingredient.prototype, "proteinPer100g", void 0);
37
+ _ts_decorate([
38
+ Column({
39
+ type: DataType.FLOAT,
40
+ allowNull: false
41
+ })
42
+ ], Ingredient.prototype, "carbsPer100g", void 0);
43
+ _ts_decorate([
44
+ Column({
45
+ type: DataType.FLOAT,
46
+ allowNull: false
47
+ })
48
+ ], Ingredient.prototype, "fatsPer100g", void 0);
49
+ _ts_decorate([
50
+ Column({
51
+ type: DataType.STRING,
52
+ allowNull: true
53
+ })
54
+ ], Ingredient.prototype, "category", void 0);
55
+ _ts_decorate([
56
+ HasMany(()=>RecipeIngredient, {
57
+ foreignKey: "ingredientUuid",
58
+ onDelete: "CASCADE"
59
+ })
60
+ ], Ingredient.prototype, "recipeIngredients", void 0);
61
+ _ts_decorate([
62
+ BelongsToMany(()=>IngredientTag, {
63
+ through: ()=>IngredientTags,
64
+ foreignKey: "ingredientUuid",
65
+ otherKey: "ingredientTagUuid",
66
+ as: "tags"
67
+ })
68
+ ], Ingredient.prototype, "tags", void 0);
69
+ Ingredient = _ts_decorate([
70
+ Table({
71
+ timestamps: true,
72
+ indexes: [
73
+ {
74
+ fields: [
75
+ "name"
76
+ ],
77
+ unique: true
78
+ },
79
+ {
80
+ fields: [
81
+ "category"
82
+ ]
83
+ }
84
+ ]
85
+ })
86
+ ], Ingredient);
87
+
88
+ //# sourceMappingURL=Ingredient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/lib/dbmodels/diet/Ingredient.ts"],"sourcesContent":["import {\n Table,\n Model,\n Column,\n DataType,\n Default,\n PrimaryKey,\n HasMany,\n BelongsToMany,\n} from \"sequelize-typescript\";\nimport type { Optional } from \"sequelize\";\nimport { RecipeIngredient } from \"./RecipeIngredient.js\";\nimport { IngredientTag } from \"./IngredientTag.js\";\nimport { IngredientTags } from \"./IngredientTags.js\";\n\ninterface IngredientAttributes {\n uuid: string;\n name: string;\n caloriesPer100g: number;\n proteinPer100g: number;\n carbsPer100g: number;\n fatsPer100g: number;\n category?: string;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\ninterface IngredientCreationAttributes\n extends Optional<IngredientAttributes, \"uuid\" | \"category\" | \"createdAt\" | \"updatedAt\"> {}\n\n@Table({\n timestamps: true,\n indexes: [\n {\n fields: [\"name\"],\n unique: true,\n },\n {\n fields: [\"category\"],\n },\n ],\n})\nexport class Ingredient extends Model<IngredientAttributes, IngredientCreationAttributes> {\n @PrimaryKey\n @Default(DataType.UUIDV4)\n @Column(DataType.UUID)\n declare uuid: string;\n\n @Column({ type: DataType.STRING, allowNull: false, unique: true })\n declare name: string;\n\n @Column({ type: DataType.FLOAT, allowNull: false })\n declare caloriesPer100g: number;\n\n @Column({ type: DataType.FLOAT, allowNull: false })\n declare proteinPer100g: number;\n\n @Column({ type: DataType.FLOAT, allowNull: false })\n declare carbsPer100g: number;\n\n @Column({ type: DataType.FLOAT, allowNull: false })\n declare fatsPer100g: number;\n\n @Column({ type: DataType.STRING, allowNull: true })\n declare category: string;\n\n @HasMany(() => RecipeIngredient, { foreignKey: \"ingredientUuid\", onDelete: \"CASCADE\" })\n declare recipeIngredients: RecipeIngredient[];\n\n @BelongsToMany(() => IngredientTag, {\n through: () => IngredientTags,\n foreignKey: \"ingredientUuid\",\n otherKey: \"ingredientTagUuid\",\n as: \"tags\",\n })\n declare tags: IngredientTag[];\n}\n"],"names":["Table","Model","Column","DataType","Default","PrimaryKey","HasMany","BelongsToMany","RecipeIngredient","IngredientTag","IngredientTags","Ingredient","UUIDV4","UUID","type","STRING","allowNull","unique","FLOAT","foreignKey","onDelete","through","otherKey","as","timestamps","indexes","fields"],"mappings":";;;;;;AAAA,SACEA,KAAK,EACLC,KAAK,EACLC,MAAM,EACNC,QAAQ,EACRC,OAAO,EACPC,UAAU,EACVC,OAAO,EACPC,aAAa,QACR,uBAAuB;AAE9B,SAASC,gBAAgB,QAAQ,wBAAwB;AACzD,SAASC,aAAa,QAAQ,qBAAqB;AACnD,SAASC,cAAc,QAAQ,sBAAsB;AA6BrD,OAAO,MAAMC,mBAAmBV;AAkChC;;;qBAhCoBW;oBACDC;;;;QAGPC,MAAMX,SAASY,MAAM;QAAEC,WAAW;QAAOC,QAAQ;;;;;QAGjDH,MAAMX,SAASe,KAAK;QAAEF,WAAW;;;;;QAGjCF,MAAMX,SAASe,KAAK;QAAEF,WAAW;;;;;QAGjCF,MAAMX,SAASe,KAAK;QAAEF,WAAW;;;;;QAGjCF,MAAMX,SAASe,KAAK;QAAEF,WAAW;;;;;QAGjCF,MAAMX,SAASY,MAAM;QAAEC,WAAW;;;;gBAG7BR;QAAoBW,YAAY;QAAkBC,UAAU;;;;sBAGtDX;QACnBY,SAAS,IAAMX;QACfS,YAAY;QACZG,UAAU;QACVC,IAAI;;;;;QA1CNC,YAAY;QACZC,SAAS;YACP;gBACEC,QAAQ;oBAAC;iBAAO;gBAChBT,QAAQ;YACV;YACA;gBACES,QAAQ;oBAAC;iBAAW;YACtB;SACD"}
@@ -0,0 +1,22 @@
1
+ import { Model } from "sequelize-typescript";
2
+ import type { Optional } from "sequelize";
3
+ import { Ingredient } from "./Ingredient.js";
4
+ interface IngredientTagAttributes {
5
+ uuid: string;
6
+ tag: string;
7
+ category: string;
8
+ order: number;
9
+ createdAt?: Date;
10
+ updatedAt?: Date;
11
+ }
12
+ interface IngredientTagCreationAttributes extends Optional<IngredientTagAttributes, "uuid" | "order" | "createdAt" | "updatedAt"> {
13
+ }
14
+ export declare class IngredientTag extends Model<IngredientTagAttributes, IngredientTagCreationAttributes> {
15
+ uuid: string;
16
+ tag: string;
17
+ category: string;
18
+ order: number;
19
+ ingredients: Ingredient[];
20
+ }
21
+ export {};
22
+ //# sourceMappingURL=IngredientTag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IngredientTag.d.ts","sourceRoot":"","sources":["../../../../src/lib/dbmodels/diet/IngredientTag.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,EAGN,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,UAAU,uBAAuB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,UAAU,+BACR,SAAQ,QAAQ,CAAC,uBAAuB,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,CAAC;CAAG;AAE5F,qBAaa,aAAc,SAAQ,KAAK,CACtC,uBAAuB,EACvB,+BAA+B,CAChC;IAIS,IAAI,EAAE,MAAM,CAAC;IAGb,GAAG,EAAE,MAAM,CAAC;IAGZ,QAAQ,EAAE,MAAM,CAAC;IAGjB,KAAK,EAAE,MAAM,CAAC;IAOd,WAAW,EAAE,UAAU,EAAE,CAAC;CACnC"}
@@ -0,0 +1,64 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ import { BelongsToMany, Column, DataType, Default, Model, PrimaryKey, Table } from "sequelize-typescript";
8
+ import { Ingredient } from "./Ingredient.js";
9
+ import { IngredientTags } from "./IngredientTags.js";
10
+ export class IngredientTag extends Model {
11
+ }
12
+ _ts_decorate([
13
+ PrimaryKey,
14
+ Default(DataType.UUIDV4),
15
+ Column(DataType.UUID)
16
+ ], IngredientTag.prototype, "uuid", void 0);
17
+ _ts_decorate([
18
+ Column({
19
+ type: DataType.TEXT,
20
+ allowNull: false,
21
+ unique: true
22
+ })
23
+ ], IngredientTag.prototype, "tag", void 0);
24
+ _ts_decorate([
25
+ Column({
26
+ type: DataType.STRING,
27
+ allowNull: false
28
+ })
29
+ ], IngredientTag.prototype, "category", void 0);
30
+ _ts_decorate([
31
+ Column({
32
+ type: DataType.INTEGER,
33
+ allowNull: false,
34
+ defaultValue: 0
35
+ })
36
+ ], IngredientTag.prototype, "order", void 0);
37
+ _ts_decorate([
38
+ BelongsToMany(()=>Ingredient, {
39
+ through: ()=>IngredientTags,
40
+ foreignKey: "ingredientTagUuid",
41
+ otherKey: "ingredientUuid"
42
+ })
43
+ ], IngredientTag.prototype, "ingredients", void 0);
44
+ IngredientTag = _ts_decorate([
45
+ Table({
46
+ tableName: "IngredientTag",
47
+ timestamps: true,
48
+ indexes: [
49
+ {
50
+ fields: [
51
+ "tag"
52
+ ],
53
+ unique: true
54
+ },
55
+ {
56
+ fields: [
57
+ "category"
58
+ ]
59
+ }
60
+ ]
61
+ })
62
+ ], IngredientTag);
63
+
64
+ //# sourceMappingURL=IngredientTag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/lib/dbmodels/diet/IngredientTag.ts"],"sourcesContent":["import {\n BelongsToMany,\n Column,\n DataType,\n Default,\n Model,\n PrimaryKey,\n Table,\n} from \"sequelize-typescript\";\nimport type { Optional } from \"sequelize\";\nimport { Ingredient } from \"./Ingredient.js\";\nimport { IngredientTags } from \"./IngredientTags.js\";\n\ninterface IngredientTagAttributes {\n uuid: string;\n tag: string;\n category: string;\n order: number;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\ninterface IngredientTagCreationAttributes\n extends Optional<IngredientTagAttributes, \"uuid\" | \"order\" | \"createdAt\" | \"updatedAt\"> {}\n\n@Table({\n tableName: \"IngredientTag\",\n timestamps: true,\n indexes: [\n {\n fields: [\"tag\"],\n unique: true,\n },\n {\n fields: [\"category\"],\n },\n ],\n})\nexport class IngredientTag extends Model<\n IngredientTagAttributes,\n IngredientTagCreationAttributes\n> {\n @PrimaryKey\n @Default(DataType.UUIDV4)\n @Column(DataType.UUID)\n declare uuid: string;\n\n @Column({ type: DataType.TEXT, allowNull: false, unique: true })\n declare tag: string;\n\n @Column({ type: DataType.STRING, allowNull: false })\n declare category: string;\n\n @Column({ type: DataType.INTEGER, allowNull: false, defaultValue: 0 })\n declare order: number;\n\n @BelongsToMany(() => Ingredient, {\n through: () => IngredientTags,\n foreignKey: \"ingredientTagUuid\",\n otherKey: \"ingredientUuid\",\n })\n declare ingredients: Ingredient[];\n}\n"],"names":["BelongsToMany","Column","DataType","Default","Model","PrimaryKey","Table","Ingredient","IngredientTags","IngredientTag","UUIDV4","UUID","type","TEXT","allowNull","unique","STRING","INTEGER","defaultValue","through","foreignKey","otherKey","tableName","timestamps","indexes","fields"],"mappings":";;;;;;AAAA,SACEA,aAAa,EACbC,MAAM,EACNC,QAAQ,EACRC,OAAO,EACPC,KAAK,EACLC,UAAU,EACVC,KAAK,QACA,uBAAuB;AAE9B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,cAAc,QAAQ,sBAAsB;AA2BrD,OAAO,MAAMC,sBAAsBL;AAwBnC;;;qBAnBoBM;oBACDC;;;;QAGPC,MAAMV,SAASW,IAAI;QAAEC,WAAW;QAAOC,QAAQ;;;;;QAG/CH,MAAMV,SAASc,MAAM;QAAEF,WAAW;;;;;QAGlCF,MAAMV,SAASe,OAAO;QAAEH,WAAW;QAAOI,cAAc;;;;sBAG7CX;QACnBY,SAAS,IAAMX;QACfY,YAAY;QACZC,UAAU;;;;;QAjCZC,WAAW;QACXC,YAAY;QACZC,SAAS;YACP;gBACEC,QAAQ;oBAAC;iBAAM;gBACfV,QAAQ;YACV;YACA;gBACEU,QAAQ;oBAAC;iBAAW;YACtB;SACD"}
@@ -0,0 +1,6 @@
1
+ import { Model } from "sequelize-typescript";
2
+ export declare class IngredientTags extends Model<IngredientTags> {
3
+ ingredientUuid: string;
4
+ ingredientTagUuid: string;
5
+ }
6
+ //# sourceMappingURL=IngredientTags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IngredientTags.d.ts","sourceRoot":"","sources":["../../../../src/lib/dbmodels/diet/IngredientTags.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,EAGN,MAAM,sBAAsB,CAAC;AAI9B,qBACa,cAAe,SAAQ,KAAK,CAAC,cAAc,CAAC;IAI/C,cAAc,EAAE,MAAM,CAAC;IAKvB,iBAAiB,EAAE,MAAM,CAAC;CACnC"}
@@ -0,0 +1,29 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ import { Column, DataType, ForeignKey, Model, Table, PrimaryKey } from "sequelize-typescript";
8
+ import { Ingredient } from "./Ingredient.js";
9
+ import { IngredientTag } from "./IngredientTag.js";
10
+ export class IngredientTags extends Model {
11
+ }
12
+ _ts_decorate([
13
+ PrimaryKey,
14
+ ForeignKey(()=>Ingredient),
15
+ Column(DataType.UUID)
16
+ ], IngredientTags.prototype, "ingredientUuid", void 0);
17
+ _ts_decorate([
18
+ PrimaryKey,
19
+ ForeignKey(()=>IngredientTag),
20
+ Column(DataType.UUID)
21
+ ], IngredientTags.prototype, "ingredientTagUuid", void 0);
22
+ IngredientTags = _ts_decorate([
23
+ Table({
24
+ tableName: "IngredientTags",
25
+ timestamps: false
26
+ })
27
+ ], IngredientTags);
28
+
29
+ //# sourceMappingURL=IngredientTags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/lib/dbmodels/diet/IngredientTags.ts"],"sourcesContent":["import {\n Column,\n DataType,\n ForeignKey,\n Model,\n Table,\n PrimaryKey,\n} from \"sequelize-typescript\";\nimport { Ingredient } from \"./Ingredient.js\";\nimport { IngredientTag } from \"./IngredientTag.js\";\n\n@Table({ tableName: \"IngredientTags\", timestamps: false })\nexport class IngredientTags extends Model<IngredientTags> {\n @PrimaryKey\n @ForeignKey(() => Ingredient)\n @Column(DataType.UUID)\n declare ingredientUuid: string;\n\n @PrimaryKey\n @ForeignKey(() => IngredientTag)\n @Column(DataType.UUID)\n declare ingredientTagUuid: string;\n}\n"],"names":["Column","DataType","ForeignKey","Model","Table","PrimaryKey","Ingredient","IngredientTag","IngredientTags","UUID","tableName","timestamps"],"mappings":";;;;;;AAAA,SACEA,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVC,KAAK,EACLC,KAAK,EACLC,UAAU,QACL,uBAAuB;AAC9B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,qBAAqB;AAGnD,OAAO,MAAMC,uBAAuBL;AAUpC;;;mBARoBG;oBACDG;;;;mBAICF;oBACDE;;;;QATVC,WAAW;QAAkBC,YAAY"}
@@ -1,6 +1,7 @@
1
1
  import { Model } from "sequelize-typescript";
2
2
  import { TranslatedRecipe } from "./TranslatedRecipe.js";
3
3
  import { RecipeTag } from "./RecipeTag.js";
4
+ import { RecipeIngredient } from "./RecipeIngredient.js";
4
5
  export declare class Recipe extends Model<Recipe> {
5
6
  uuid: string;
6
7
  title: string;
@@ -15,8 +16,10 @@ export declare class Recipe extends Model<Recipe> {
15
16
  tipsAndTricks: string;
16
17
  ShowForFreeVersion: boolean;
17
18
  LockForFreeVersion: boolean;
19
+ showInApp: boolean;
18
20
  tags: RecipeTag[];
19
21
  order: number;
20
22
  translatedRecipes: TranslatedRecipe[];
23
+ recipeIngredients: RecipeIngredient[];
21
24
  }
22
25
  //# sourceMappingURL=Recipe.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Recipe.d.ts","sourceRoot":"","sources":["../../../../src/lib/dbmodels/diet/Recipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,EAEN,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,qBACa,MAAO,SAAQ,KAAK,CAAC,MAAM,CAAC;IAQ/B,IAAI,EAAE,MAAM,CAAC;IAGb,KAAK,EAAE,MAAM,CAAC;IAGd,QAAQ,EAAE,MAAM,CAAC;IAGjB,OAAO,EAAE,MAAM,CAAC;IAGhB,IAAI,EAAE,MAAM,CAAC;IAGb,GAAG,EAAE,MAAM,CAAC;IAGZ,KAAK,EAAE,MAAM,CAAC;IAGd,OAAO,EAAE,MAAM,CAAC;IAGhB,WAAW,EAAE,MAAM,CAAC;IAGpB,MAAM,EAAE,MAAM,CAAC;IAGf,aAAa,EAAE,MAAM,CAAC;IAGtB,kBAAkB,EAAE,OAAO,CAAC;IAG5B,kBAAkB,EAAE,OAAO,CAAC;IAG5B,IAAI,EAAE,SAAS,EAAE,CAAC;IAGlB,KAAK,EAAE,MAAM,CAAC;IAGd,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;CAC/C"}
1
+ {"version":3,"file":"Recipe.d.ts","sourceRoot":"","sources":["../../../../src/lib/dbmodels/diet/Recipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,EAEN,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,qBACa,MAAO,SAAQ,KAAK,CAAC,MAAM,CAAC;IAQ/B,IAAI,EAAE,MAAM,CAAC;IAGb,KAAK,EAAE,MAAM,CAAC;IAGd,QAAQ,EAAE,MAAM,CAAC;IAGjB,OAAO,EAAE,MAAM,CAAC;IAGhB,IAAI,EAAE,MAAM,CAAC;IAGb,GAAG,EAAE,MAAM,CAAC;IAGZ,KAAK,EAAE,MAAM,CAAC;IAGd,OAAO,EAAE,MAAM,CAAC;IAGhB,WAAW,EAAE,MAAM,CAAC;IAGpB,MAAM,EAAE,MAAM,CAAC;IAGf,aAAa,EAAE,MAAM,CAAC;IAGtB,kBAAkB,EAAE,OAAO,CAAC;IAG5B,kBAAkB,EAAE,OAAO,CAAC;IAI5B,SAAS,EAAE,OAAO,CAAC;IAGnB,IAAI,EAAE,SAAS,EAAE,CAAC;IAGlB,KAAK,EAAE,MAAM,CAAC;IAGd,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IAGtC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;CAC/C"}
@@ -8,6 +8,7 @@ import { BelongsToMany, Column, DataType, Default, HasMany, Model, Table } from
8
8
  import { TranslatedRecipe } from "./TranslatedRecipe.js";
9
9
  import { RecipeTag } from "./RecipeTag.js";
10
10
  import { RecipeTags } from "./RecipeTags.js";
11
+ import { RecipeIngredient } from "./RecipeIngredient.js";
11
12
  export class Recipe extends Model {
12
13
  }
13
14
  _ts_decorate([
@@ -93,6 +94,14 @@ _ts_decorate([
93
94
  defaultValue: false
94
95
  })
95
96
  ], Recipe.prototype, "LockForFreeVersion", void 0);
97
+ _ts_decorate([
98
+ Default(true),
99
+ Column({
100
+ type: DataType.BOOLEAN,
101
+ allowNull: false,
102
+ defaultValue: true
103
+ })
104
+ ], Recipe.prototype, "showInApp", void 0);
96
105
  _ts_decorate([
97
106
  BelongsToMany(()=>RecipeTag, {
98
107
  through: ()=>RecipeTags,
@@ -109,6 +118,12 @@ _ts_decorate([
109
118
  _ts_decorate([
110
119
  HasMany(()=>TranslatedRecipe)
111
120
  ], Recipe.prototype, "translatedRecipes", void 0);
121
+ _ts_decorate([
122
+ HasMany(()=>RecipeIngredient, {
123
+ foreignKey: "recipeUuid",
124
+ onDelete: "CASCADE"
125
+ })
126
+ ], Recipe.prototype, "recipeIngredients", void 0);
112
127
  Recipe = _ts_decorate([
113
128
  Table
114
129
  ], Recipe);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/lib/dbmodels/diet/Recipe.ts"],"sourcesContent":["import {\n BelongsToMany,\n Column,\n DataType,\n Default,\n HasMany,\n Model,\n Table,\n} from \"sequelize-typescript\";\nimport { TranslatedRecipe } from \"./TranslatedRecipe.js\";\nimport { RecipeTag } from \"./RecipeTag.js\";\nimport { RecipeTags } from \"./RecipeTags.js\";\n\n@Table\nexport class Recipe extends Model<Recipe> {\n @Default(DataType.UUIDV4)\n @Column({\n type: DataType.UUID,\n defaultValue: DataType.UUID,\n allowNull: false,\n primaryKey: true,\n })\n declare uuid: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare title: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare duration: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare content: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare kcal: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare fat: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare carbs: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare protein: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare ingredients: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare method: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare tipsAndTricks: string;\n\n @Column({ type: DataType.BOOLEAN, allowNull: false, defaultValue: false })\n declare ShowForFreeVersion: boolean;\n\n @Column({ type: DataType.BOOLEAN, allowNull: false, defaultValue: false })\n declare LockForFreeVersion: boolean;\n\n @BelongsToMany(() => RecipeTag, { through: () => RecipeTags, as: \"tags\" })\n declare tags: RecipeTag[];\n\n @Column({ type: DataType.INTEGER, allowNull: false, defaultValue: 0 })\n declare order: number;\n\n @HasMany(() => TranslatedRecipe)\n declare translatedRecipes: TranslatedRecipe[];\n}\n"],"names":["BelongsToMany","Column","DataType","Default","HasMany","Model","Table","TranslatedRecipe","RecipeTag","RecipeTags","Recipe","UUIDV4","type","UUID","defaultValue","allowNull","primaryKey","TEXT","BOOLEAN","through","as","INTEGER"],"mappings":";;;;;;AAAA,SACEA,aAAa,EACbC,MAAM,EACNC,QAAQ,EACRC,OAAO,EACPC,OAAO,EACPC,KAAK,EACLC,KAAK,QACA,uBAAuB;AAC9B,SAASC,gBAAgB,QAAQ,wBAAwB;AACzD,SAASC,SAAS,QAAQ,iBAAiB;AAC3C,SAASC,UAAU,QAAQ,kBAAkB;AAG7C,OAAO,MAAMC,eAAeL;AAsD5B;;qBArDoBM;;QAEhBC,MAAMV,SAASW,IAAI;QACnBC,cAAcZ,SAASW,IAAI;QAC3BE,WAAW;QACXC,YAAY;;;;;QAIJJ,MAAMV,SAASe,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMV,SAASe,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMV,SAASe,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMV,SAASe,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMV,SAASe,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMV,SAASe,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMV,SAASe,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMV,SAASe,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMV,SAASe,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMV,SAASe,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMV,SAASgB,OAAO;QAAEH,WAAW;QAAOD,cAAc;;;;;QAGxDF,MAAMV,SAASgB,OAAO;QAAEH,WAAW;QAAOD,cAAc;;;;sBAG7CN;QAAaW,SAAS,IAAMV;QAAYW,IAAI;;;;;QAGvDR,MAAMV,SAASmB,OAAO;QAAEN,WAAW;QAAOD,cAAc;;;;gBAGnDP"}
1
+ {"version":3,"sources":["../../../../src/lib/dbmodels/diet/Recipe.ts"],"sourcesContent":["import {\n BelongsToMany,\n Column,\n DataType,\n Default,\n HasMany,\n Model,\n Table,\n} from \"sequelize-typescript\";\nimport { TranslatedRecipe } from \"./TranslatedRecipe.js\";\nimport { RecipeTag } from \"./RecipeTag.js\";\nimport { RecipeTags } from \"./RecipeTags.js\";\nimport { RecipeIngredient } from \"./RecipeIngredient.js\";\n\n@Table\nexport class Recipe extends Model<Recipe> {\n @Default(DataType.UUIDV4)\n @Column({\n type: DataType.UUID,\n defaultValue: DataType.UUID,\n allowNull: false,\n primaryKey: true,\n })\n declare uuid: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare title: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare duration: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare content: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare kcal: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare fat: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare carbs: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare protein: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare ingredients: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare method: string;\n\n @Column({ type: DataType.TEXT, allowNull: false })\n declare tipsAndTricks: string;\n\n @Column({ type: DataType.BOOLEAN, allowNull: false, defaultValue: false })\n declare ShowForFreeVersion: boolean;\n\n @Column({ type: DataType.BOOLEAN, allowNull: false, defaultValue: false })\n declare LockForFreeVersion: boolean;\n\n @Default(true)\n @Column({ type: DataType.BOOLEAN, allowNull: false, defaultValue: true })\n declare showInApp: boolean;\n\n @BelongsToMany(() => RecipeTag, { through: () => RecipeTags, as: \"tags\" })\n declare tags: RecipeTag[];\n\n @Column({ type: DataType.INTEGER, allowNull: false, defaultValue: 0 })\n declare order: number;\n\n @HasMany(() => TranslatedRecipe)\n declare translatedRecipes: TranslatedRecipe[];\n\n @HasMany(() => RecipeIngredient, { foreignKey: \"recipeUuid\", onDelete: \"CASCADE\" })\n declare recipeIngredients: RecipeIngredient[];\n}\n"],"names":["BelongsToMany","Column","DataType","Default","HasMany","Model","Table","TranslatedRecipe","RecipeTag","RecipeTags","RecipeIngredient","Recipe","UUIDV4","type","UUID","defaultValue","allowNull","primaryKey","TEXT","BOOLEAN","through","as","INTEGER","foreignKey","onDelete"],"mappings":";;;;;;AAAA,SACEA,aAAa,EACbC,MAAM,EACNC,QAAQ,EACRC,OAAO,EACPC,OAAO,EACPC,KAAK,EACLC,KAAK,QACA,uBAAuB;AAC9B,SAASC,gBAAgB,QAAQ,wBAAwB;AACzD,SAASC,SAAS,QAAQ,iBAAiB;AAC3C,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,gBAAgB,QAAQ,wBAAwB;AAGzD,OAAO,MAAMC,eAAeN;AA6D5B;;qBA5DoBO;;QAEhBC,MAAMX,SAASY,IAAI;QACnBC,cAAcb,SAASY,IAAI;QAC3BE,WAAW;QACXC,YAAY;;;;;QAIJJ,MAAMX,SAASgB,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMX,SAASgB,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMX,SAASgB,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMX,SAASgB,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMX,SAASgB,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMX,SAASgB,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMX,SAASgB,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMX,SAASgB,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMX,SAASgB,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMX,SAASgB,IAAI;QAAEF,WAAW;;;;;QAGhCH,MAAMX,SAASiB,OAAO;QAAEH,WAAW;QAAOD,cAAc;;;;;QAGxDF,MAAMX,SAASiB,OAAO;QAAEH,WAAW;QAAOD,cAAc;;;;;;QAIxDF,MAAMX,SAASiB,OAAO;QAAEH,WAAW;QAAOD,cAAc;;;;sBAG7CP;QAAaY,SAAS,IAAMX;QAAYY,IAAI;;;;;QAGvDR,MAAMX,SAASoB,OAAO;QAAEN,WAAW;QAAOD,cAAc;;;;gBAGnDR;;;gBAGAG;QAAoBa,YAAY;QAAcC,UAAU"}
@@ -0,0 +1,24 @@
1
+ import { Model } from "sequelize-typescript";
2
+ import type { Optional } from "sequelize";
3
+ import { Recipe } from "./Recipe.js";
4
+ import { Ingredient } from "./Ingredient.js";
5
+ interface RecipeIngredientAttributes {
6
+ uuid: string;
7
+ recipeUuid: string;
8
+ ingredientUuid: string;
9
+ grams: number;
10
+ createdAt?: Date;
11
+ updatedAt?: Date;
12
+ }
13
+ interface RecipeIngredientCreationAttributes extends Optional<RecipeIngredientAttributes, "uuid" | "createdAt" | "updatedAt"> {
14
+ }
15
+ export declare class RecipeIngredient extends Model<RecipeIngredientAttributes, RecipeIngredientCreationAttributes> {
16
+ uuid: string;
17
+ recipeUuid: string;
18
+ recipe: Recipe;
19
+ ingredientUuid: string;
20
+ ingredient: Ingredient;
21
+ grams: number;
22
+ }
23
+ export {};
24
+ //# sourceMappingURL=RecipeIngredient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecipeIngredient.d.ts","sourceRoot":"","sources":["../../../../src/lib/dbmodels/diet/RecipeIngredient.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,EAQN,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,UAAU,0BAA0B;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,UAAU,kCACR,SAAQ,QAAQ,CAAC,0BAA0B,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC;CAAG;AAErF,qBASa,gBAAiB,SAAQ,KAAK,CACzC,0BAA0B,EAC1B,kCAAkC,CACnC;IAIS,IAAI,EAAE,MAAM,CAAC;IAKb,UAAU,EAAE,MAAM,CAAC;IAGnB,MAAM,EAAE,MAAM,CAAC;IAKf,cAAc,EAAE,MAAM,CAAC;IAGvB,UAAU,EAAE,UAAU,CAAC;IAGvB,KAAK,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,66 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ import { Table, Model, Column, DataType, Default, PrimaryKey, ForeignKey, BelongsTo, Index } from "sequelize-typescript";
8
+ import { Recipe } from "./Recipe.js";
9
+ import { Ingredient } from "./Ingredient.js";
10
+ export class RecipeIngredient extends Model {
11
+ }
12
+ _ts_decorate([
13
+ PrimaryKey,
14
+ Default(DataType.UUIDV4),
15
+ Column(DataType.UUID)
16
+ ], RecipeIngredient.prototype, "uuid", void 0);
17
+ _ts_decorate([
18
+ Index,
19
+ ForeignKey(()=>Recipe),
20
+ Column({
21
+ type: DataType.UUID,
22
+ allowNull: false
23
+ })
24
+ ], RecipeIngredient.prototype, "recipeUuid", void 0);
25
+ _ts_decorate([
26
+ BelongsTo(()=>Recipe, {
27
+ foreignKey: "recipeUuid",
28
+ onDelete: "CASCADE"
29
+ })
30
+ ], RecipeIngredient.prototype, "recipe", void 0);
31
+ _ts_decorate([
32
+ Index,
33
+ ForeignKey(()=>Ingredient),
34
+ Column({
35
+ type: DataType.UUID,
36
+ allowNull: false
37
+ })
38
+ ], RecipeIngredient.prototype, "ingredientUuid", void 0);
39
+ _ts_decorate([
40
+ BelongsTo(()=>Ingredient, {
41
+ foreignKey: "ingredientUuid",
42
+ onDelete: "RESTRICT"
43
+ })
44
+ ], RecipeIngredient.prototype, "ingredient", void 0);
45
+ _ts_decorate([
46
+ Column({
47
+ type: DataType.FLOAT,
48
+ allowNull: false
49
+ })
50
+ ], RecipeIngredient.prototype, "grams", void 0);
51
+ RecipeIngredient = _ts_decorate([
52
+ Table({
53
+ timestamps: true,
54
+ indexes: [
55
+ {
56
+ fields: [
57
+ "recipeUuid",
58
+ "ingredientUuid"
59
+ ],
60
+ unique: true
61
+ }
62
+ ]
63
+ })
64
+ ], RecipeIngredient);
65
+
66
+ //# sourceMappingURL=RecipeIngredient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/lib/dbmodels/diet/RecipeIngredient.ts"],"sourcesContent":["import {\n Table,\n Model,\n Column,\n DataType,\n Default,\n PrimaryKey,\n ForeignKey,\n BelongsTo,\n Index,\n} from \"sequelize-typescript\";\nimport type { Optional } from \"sequelize\";\nimport { Recipe } from \"./Recipe.js\";\nimport { Ingredient } from \"./Ingredient.js\";\n\ninterface RecipeIngredientAttributes {\n uuid: string;\n recipeUuid: string;\n ingredientUuid: string;\n grams: number;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\ninterface RecipeIngredientCreationAttributes\n extends Optional<RecipeIngredientAttributes, \"uuid\" | \"createdAt\" | \"updatedAt\"> {}\n\n@Table({\n timestamps: true,\n indexes: [\n {\n fields: [\"recipeUuid\", \"ingredientUuid\"],\n unique: true,\n },\n ],\n})\nexport class RecipeIngredient extends Model<\n RecipeIngredientAttributes,\n RecipeIngredientCreationAttributes\n> {\n @PrimaryKey\n @Default(DataType.UUIDV4)\n @Column(DataType.UUID)\n declare uuid: string;\n\n @Index\n @ForeignKey(() => Recipe)\n @Column({ type: DataType.UUID, allowNull: false })\n declare recipeUuid: string;\n\n @BelongsTo(() => Recipe, { foreignKey: \"recipeUuid\", onDelete: \"CASCADE\" })\n declare recipe: Recipe;\n\n @Index\n @ForeignKey(() => Ingredient)\n @Column({ type: DataType.UUID, allowNull: false })\n declare ingredientUuid: string;\n\n @BelongsTo(() => Ingredient, { foreignKey: \"ingredientUuid\", onDelete: \"RESTRICT\" })\n declare ingredient: Ingredient;\n\n @Column({ type: DataType.FLOAT, allowNull: false })\n declare grams: number;\n}\n"],"names":["Table","Model","Column","DataType","Default","PrimaryKey","ForeignKey","BelongsTo","Index","Recipe","Ingredient","RecipeIngredient","UUIDV4","UUID","type","allowNull","foreignKey","onDelete","FLOAT","timestamps","indexes","fields","unique"],"mappings":";;;;;;AAAA,SACEA,KAAK,EACLC,KAAK,EACLC,MAAM,EACNC,QAAQ,EACRC,OAAO,EACPC,UAAU,EACVC,UAAU,EACVC,SAAS,EACTC,KAAK,QACA,uBAAuB;AAE9B,SAASC,MAAM,QAAQ,cAAc;AACrC,SAASC,UAAU,QAAQ,kBAAkB;AAuB7C,OAAO,MAAMC,yBAAyBV;AA2BtC;;;qBAtBoBW;oBACDC;;;;mBAICJ;;QACRK,MAAMX,SAASU,IAAI;QAAEE,WAAW;;;;kBAGzBN;QAAUO,YAAY;QAAcC,UAAU;;;;;mBAI7CP;;QACRI,MAAMX,SAASU,IAAI;QAAEE,WAAW;;;;kBAGzBL;QAAcM,YAAY;QAAkBC,UAAU;;;;;QAG7DH,MAAMX,SAASe,KAAK;QAAEH,WAAW;;;;;QAjC3CI,YAAY;QACZC,SAAS;YACP;gBACEC,QAAQ;oBAAC;oBAAc;iBAAiB;gBACxCC,QAAQ;YACV;SACD"}
@@ -52,6 +52,10 @@ export { TranslatedRecipeTags } from "./diet/TranslatedRecipeTags.js";
52
52
  export { ShoppingList } from "./diet/ShoppingList.js";
53
53
  export { ShoppingListItem } from "./diet/ShoppingListItem.js";
54
54
  export { UserDietPreferences } from "./diet/UserDietPreferences.js";
55
+ export { Ingredient } from "./diet/Ingredient.js";
56
+ export { IngredientTag } from "./diet/IngredientTag.js";
57
+ export { IngredientTags } from "./diet/IngredientTags.js";
58
+ export { RecipeIngredient } from "./diet/RecipeIngredient.js";
55
59
  export { WeeklyCheckin } from "./coaching/WeeklyCheckIn.js";
56
60
  export { WeightRecord } from "./coaching/WeightRecord.js";
57
61
  export { Questionnaire, QuestionnaireType } from "./coaching/Questionnaire.js";
@@ -119,6 +123,10 @@ import { TranslatedRecipeTags } from "./diet/TranslatedRecipeTags.js";
119
123
  import { ShoppingList } from "./diet/ShoppingList.js";
120
124
  import { ShoppingListItem } from "./diet/ShoppingListItem.js";
121
125
  import { UserDietPreferences } from "./diet/UserDietPreferences.js";
126
+ import { Ingredient } from "./diet/Ingredient.js";
127
+ import { IngredientTag } from "./diet/IngredientTag.js";
128
+ import { IngredientTags } from "./diet/IngredientTags.js";
129
+ import { RecipeIngredient } from "./diet/RecipeIngredient.js";
122
130
  import { WeeklyCheckin } from "./coaching/WeeklyCheckIn.js";
123
131
  import { WeightRecord } from "./coaching/WeightRecord.js";
124
132
  import { Questionnaire } from "./coaching/Questionnaire.js";
@@ -137,9 +145,9 @@ export declare const USER_MODELS: (typeof PersistedUser | typeof UserBadges | ty
137
145
  export declare const SUBSCRIPTION_MODELS: (typeof SubscriptionLog | typeof Subscription)[];
138
146
  export declare const PROGRAM_MODELS: (typeof TranslatedChallenge | typeof Challenge | typeof ProgressEntry | typeof Exercise | typeof UserChallenge | typeof TranslatedStrengthTestExercise | typeof StrengthTestExercise | typeof UserStrengthTests | typeof TranslatedExerciseModel | typeof ExercisesModels | typeof Workout | typeof Superset | typeof Program | typeof TranslatedStrengthTest | typeof StrengthTest | typeof ChallengeBlueprint | typeof CustomProgramBlueprint | typeof CustomStrengthTestExercise | typeof CustomWorkoutBlueprint | typeof RestDay | typeof WorkoutSession | typeof ThirtyDayChallenge | typeof ThirtyDayChallengeStrengthTest | typeof StrengthTestSession)[];
139
147
  export declare const NON_CONSUMABLE_PROGRAM_MODELS: (typeof TranslatedConsumableProgram | typeof NonConsumableProgram | typeof UserPrograms | typeof TranslatedNonConsumableProgramWebContent | typeof NonConsumableProgramWebContent)[];
140
- export declare const DIET_MODELS: (typeof DietMealRecipe | typeof DietMeal | typeof DietDay | typeof DietProgram | typeof ShoppingListItem | typeof ShoppingList | typeof RecipeTags | typeof Recipe | typeof RecipeTag | typeof TranslatedRecipeTag | typeof TranslatedRecipeTags | typeof TranslatedRecipe | typeof UserDietPreferences)[];
148
+ export declare const DIET_MODELS: (typeof DietMealRecipe | typeof DietMeal | typeof DietDay | typeof DietProgram | typeof ShoppingListItem | typeof ShoppingList | typeof RecipeTags | typeof Recipe | typeof RecipeTag | typeof TranslatedRecipeTag | typeof TranslatedRecipeTags | typeof TranslatedRecipe | typeof IngredientTags | typeof Ingredient | typeof IngredientTag | typeof RecipeIngredient | typeof UserDietPreferences)[];
141
149
  export declare const COACHING_MODELS: (typeof WeeklyCheckin | typeof WeightRecord | typeof Question | typeof Questionnaire | typeof Answer | typeof QuestionnaireResponse)[];
142
150
  export declare const GAMIFICATION_MODELS: (typeof TranslatedBadge | typeof Badge | typeof StreaksLog | typeof XpEvent | typeof XpTransaction | typeof UserRankHistory)[];
143
151
  export declare const NOTIFICATION_MODELS: (typeof TranslatedNotification | typeof NotificationModels)[];
144
- export declare const ALL_CORE_MODELS: (typeof TranslatedChallenge | typeof Challenge | typeof ProgressEntry | typeof Exercise | typeof UserChallenge | typeof TranslatedStrengthTestExercise | typeof StrengthTestExercise | typeof UserStrengthTests | typeof TranslatedExerciseModel | typeof ExercisesModels | typeof Workout | typeof Superset | typeof Program | typeof TranslatedConsumableProgram | typeof NonConsumableProgram | typeof SubscriptionLog | typeof Subscription | typeof PersistedUser | typeof UserPrograms | typeof TranslatedNonConsumableProgramWebContent | typeof NonConsumableProgramWebContent | typeof TranslatedStrengthTest | typeof StrengthTest | typeof TranslatedBadge | typeof Badge | typeof UserBadges | typeof UserStreak | typeof UsersFriends | typeof UserCoach | typeof UserDiscount | typeof UserOptions | typeof UserAddons | typeof DeviceTokens | typeof ChallengeBlueprint | typeof CustomProgramBlueprint | typeof CustomStrengthTestExercise | typeof CustomWorkoutBlueprint | typeof RestDay | typeof WorkoutSession | typeof ThirtyDayChallenge | typeof ThirtyDayChallengeStrengthTest | typeof StrengthTestSession | typeof DietMealRecipe | typeof DietMeal | typeof DietDay | typeof DietProgram | typeof ShoppingListItem | typeof ShoppingList | typeof RecipeTags | typeof Recipe | typeof RecipeTag | typeof TranslatedRecipeTag | typeof TranslatedRecipeTags | typeof TranslatedRecipe | typeof UserDietPreferences | typeof WeeklyCheckin | typeof WeightRecord | typeof Question | typeof Questionnaire | typeof Answer | typeof QuestionnaireResponse | typeof StreaksLog | typeof XpEvent | typeof XpTransaction | typeof UserRankHistory | typeof TranslatedNotification | typeof NotificationModels)[];
152
+ export declare const ALL_CORE_MODELS: (typeof TranslatedChallenge | typeof Challenge | typeof ProgressEntry | typeof Exercise | typeof UserChallenge | typeof TranslatedStrengthTestExercise | typeof StrengthTestExercise | typeof UserStrengthTests | typeof TranslatedExerciseModel | typeof ExercisesModels | typeof Workout | typeof Superset | typeof Program | typeof TranslatedConsumableProgram | typeof NonConsumableProgram | typeof SubscriptionLog | typeof Subscription | typeof PersistedUser | typeof UserPrograms | typeof TranslatedNonConsumableProgramWebContent | typeof NonConsumableProgramWebContent | typeof TranslatedStrengthTest | typeof StrengthTest | typeof TranslatedBadge | typeof Badge | typeof UserBadges | typeof UserStreak | typeof UsersFriends | typeof UserCoach | typeof UserDiscount | typeof UserOptions | typeof UserAddons | typeof DeviceTokens | typeof ChallengeBlueprint | typeof CustomProgramBlueprint | typeof CustomStrengthTestExercise | typeof CustomWorkoutBlueprint | typeof RestDay | typeof WorkoutSession | typeof ThirtyDayChallenge | typeof ThirtyDayChallengeStrengthTest | typeof StrengthTestSession | typeof DietMealRecipe | typeof DietMeal | typeof DietDay | typeof DietProgram | typeof ShoppingListItem | typeof ShoppingList | typeof RecipeTags | typeof Recipe | typeof RecipeTag | typeof TranslatedRecipeTag | typeof TranslatedRecipeTags | typeof TranslatedRecipe | typeof IngredientTags | typeof Ingredient | typeof IngredientTag | typeof RecipeIngredient | typeof UserDietPreferences | typeof WeeklyCheckin | typeof WeightRecord | typeof Question | typeof Questionnaire | typeof Answer | typeof QuestionnaireResponse | typeof StreaksLog | typeof XpEvent | typeof XpTransaction | typeof UserRankHistory | typeof TranslatedNotification | typeof NotificationModels)[];
145
153
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/dbmodels/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/dbmodels/index.ts"],"names":[],"mappings":"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"}
@@ -57,6 +57,10 @@ export { TranslatedRecipeTags } from "./diet/TranslatedRecipeTags.js";
57
57
  export { ShoppingList } from "./diet/ShoppingList.js";
58
58
  export { ShoppingListItem } from "./diet/ShoppingListItem.js";
59
59
  export { UserDietPreferences } from "./diet/UserDietPreferences.js";
60
+ export { Ingredient } from "./diet/Ingredient.js";
61
+ export { IngredientTag } from "./diet/IngredientTag.js";
62
+ export { IngredientTags } from "./diet/IngredientTags.js";
63
+ export { RecipeIngredient } from "./diet/RecipeIngredient.js";
60
64
  // Coaching Models
61
65
  export { WeeklyCheckin } from "./coaching/WeeklyCheckIn.js";
62
66
  export { WeightRecord } from "./coaching/WeightRecord.js";
@@ -129,6 +133,10 @@ import { TranslatedRecipeTags } from "./diet/TranslatedRecipeTags.js";
129
133
  import { ShoppingList } from "./diet/ShoppingList.js";
130
134
  import { ShoppingListItem } from "./diet/ShoppingListItem.js";
131
135
  import { UserDietPreferences } from "./diet/UserDietPreferences.js";
136
+ import { Ingredient } from "./diet/Ingredient.js";
137
+ import { IngredientTag } from "./diet/IngredientTag.js";
138
+ import { IngredientTags } from "./diet/IngredientTags.js";
139
+ import { RecipeIngredient } from "./diet/RecipeIngredient.js";
132
140
  import { WeeklyCheckin } from "./coaching/WeeklyCheckIn.js";
133
141
  import { WeightRecord } from "./coaching/WeightRecord.js";
134
142
  import { Questionnaire } from "./coaching/Questionnaire.js";
@@ -206,7 +214,11 @@ export const DIET_MODELS = [
206
214
  TranslatedRecipeTags,
207
215
  ShoppingList,
208
216
  ShoppingListItem,
209
- UserDietPreferences
217
+ UserDietPreferences,
218
+ Ingredient,
219
+ IngredientTag,
220
+ IngredientTags,
221
+ RecipeIngredient
210
222
  ];
211
223
  export const COACHING_MODELS = [
212
224
  WeeklyCheckin,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/dbmodels/index.ts"],"sourcesContent":["// User Models\nexport { PersistedUser } from \"./user/PersistedUser.js\";\nexport { UserBadges } from \"./user/UserBadges.js\";\nexport { UserStreak } from \"./user/UserStreaks.js\";\nexport { UsersFriends } from \"./user/UsersFriends.js\";\nexport { UserCoach } from \"./user/UserCoach.js\";\nexport { UserDiscount } from \"./user/UserDiscount.js\";\nexport { UserOptions } from \"./user/UserOptions.js\";\nexport { UserAddons } from \"./user/UserAddons.js\";\nexport { DeviceTokens } from \"./user/DeviceTokens.js\";\n\n// Subscription Models\nexport { Subscription } from \"./subscription/Subscription.js\";\nexport { SubscriptionLog } from \"./subscription/SubscriptionLog.js\";\n\n// Program Models\nexport { Program } from \"./program/Program.js\";\nexport { Workout } from \"./program/Workout.js\";\nexport { Exercise } from \"./program/Exercise.js\";\nexport { ExercisesModels } from \"./program/ExerciseModels.js\";\nexport { Superset } from \"./program/Superset.js\";\nexport { ProgressEntry } from \"./program/ProgressEntry.js\";\nexport { RestDay } from \"./program/RestDay.js\";\nexport { WorkoutSession } from \"./program/WorkoutSession.js\";\nexport { Challenge } from \"./program/Challenge.js\";\nexport { ChallengeBlueprint } from \"./program/ChallengeBlueprint.js\";\nexport { UserChallenge } from \"./program/UserChallenge.js\";\nexport { TranslatedChallenge } from \"./program/TranslatedChallenge.js\";\nexport { ThirtyDayChallenge } from \"./program/ThirtyDayChallenge.js\";\nexport { ThirtyDayChallengeStrengthTest } from \"./program/ThirtyDayChallengeStrengthTest.js\";\nexport { StrengthTest } from \"./program/StrengthTest.js\";\nexport { StrengthTestExercise } from \"./program/StrengthTestExercise.js\";\nexport { StrengthTestSession } from \"./program/StrengthTestSession.js\";\nexport { UserStrengthTests } from \"./program/UserStrengthTests.js\";\nexport { TranslatedStrengthTest } from \"./program/TranslatedStrengthTest.js\";\nexport { TranslatedStrengthTestExercise } from \"./program/TranslatedStrengthTestExercise.js\";\nexport { TranslatedExerciseModel } from \"./program/TranslatedExerciseModel.js\";\nexport { CustomProgramBlueprint } from \"./program/CustomProgramBlueprint.js\";\nexport { CustomWorkoutBlueprint } from \"./program/CustomWorkoutBlueprint.js\";\nexport { CustomStrengthTest } from \"./program/CustomStrengthTest.js\";\nexport { CustomStrengthTestExercise } from \"./program/CustomStrengthTestExercises.js\";\n\n// Non-Consumable Program Models\nexport { NonConsumableProgram } from \"./nonconsprogram/NonConsumableProgram.js\";\nexport { NonConsumableProgramWebContent } from \"./nonconsprogram/NonConsumableProgramWebContent.js\";\nexport { UserPrograms } from \"./nonconsprogram/UserNonConsumableProgram.js\";\nexport { TranslatedConsumableProgram } from \"./nonconsprogram/TranslatedConsumableProgram.js\";\nexport { TranslatedNonConsumableProgramWebContent } from \"./nonconsprogram/TranslatedNonConsumableProgramWebContent.js\";\n\n// Diet & Nutrition Models\nexport { DietProgram } from \"./diet/DietProgram.js\";\nexport { DietDay } from \"./diet/DietDay.js\";\nexport { DietMeal } from \"./diet/DietMeal.js\";\nexport { DietMealRecipe } from \"./diet/DietMealRecipe.js\";\nexport { Recipe } from \"./diet/Recipe.js\";\nexport { TranslatedRecipe } from \"./diet/TranslatedRecipe.js\";\nexport { RecipeTag } from \"./diet/RecipeTag.js\";\nexport { TranslatedRecipeTag } from \"./diet/TranslatedRecipeTag.js\";\nexport { RecipeTags } from \"./diet/RecipeTags.js\";\nexport { TranslatedRecipeTags } from \"./diet/TranslatedRecipeTags.js\";\nexport { ShoppingList } from \"./diet/ShoppingList.js\";\nexport { ShoppingListItem } from \"./diet/ShoppingListItem.js\";\nexport { UserDietPreferences } from \"./diet/UserDietPreferences.js\";\n\n// Coaching Models\nexport { WeeklyCheckin } from \"./coaching/WeeklyCheckIn.js\";\nexport { WeightRecord } from \"./coaching/WeightRecord.js\";\nexport { Questionnaire, QuestionnaireType } from \"./coaching/Questionnaire.js\";\nexport { Question, QuestionType } from \"./coaching/Question.js\";\nexport { Answer } from \"./coaching/Answer.js\";\nexport { QuestionnaireResponse } from \"./coaching/QuestionnaireResponse.js\";\n\n// Gamification Models\nexport { Badge } from \"./gamification/Badge.js\";\nexport { TranslatedBadge } from \"./gamification/TranslatedBadge.js\";\nexport { StreaksLog } from \"./gamification/StreaksLog.js\";\nexport { XpEvent } from \"./gamification/xpAndLeaderboards/XpEvent.js\";\nexport { XpTransaction } from \"./gamification/xpAndLeaderboards/XpTransaction.js\";\nexport { UserRankHistory } from \"./gamification/xpAndLeaderboards/UserRankHistory.js\";\n\n// Notification Models\nexport { NotificationModels } from \"./notifications/NotificationModels.js\";\nexport { TranslatedNotification } from \"./notifications/TranslatedNotification.js\";\n\n// Import for model arrays\nimport { PersistedUser } from \"./user/PersistedUser.js\";\nimport { UserBadges } from \"./user/UserBadges.js\";\nimport { UserStreak } from \"./user/UserStreaks.js\";\nimport { UsersFriends } from \"./user/UsersFriends.js\";\nimport { UserCoach } from \"./user/UserCoach.js\";\nimport { UserDiscount } from \"./user/UserDiscount.js\";\nimport { UserOptions } from \"./user/UserOptions.js\";\nimport { UserAddons } from \"./user/UserAddons.js\";\nimport { DeviceTokens } from \"./user/DeviceTokens.js\";\nimport { Subscription } from \"./subscription/Subscription.js\";\nimport { SubscriptionLog } from \"./subscription/SubscriptionLog.js\";\nimport { Program } from \"./program/Program.js\";\nimport { Workout } from \"./program/Workout.js\";\nimport { Exercise } from \"./program/Exercise.js\";\nimport { ExercisesModels } from \"./program/ExerciseModels.js\";\nimport { Superset } from \"./program/Superset.js\";\nimport { ProgressEntry } from \"./program/ProgressEntry.js\";\nimport { RestDay } from \"./program/RestDay.js\";\nimport { WorkoutSession } from \"./program/WorkoutSession.js\";\nimport { Challenge } from \"./program/Challenge.js\";\nimport { ChallengeBlueprint } from \"./program/ChallengeBlueprint.js\";\nimport { UserChallenge } from \"./program/UserChallenge.js\";\nimport { TranslatedChallenge } from \"./program/TranslatedChallenge.js\";\nimport { ThirtyDayChallenge } from \"./program/ThirtyDayChallenge.js\";\nimport { ThirtyDayChallengeStrengthTest } from \"./program/ThirtyDayChallengeStrengthTest.js\";\nimport { StrengthTest } from \"./program/StrengthTest.js\";\nimport { StrengthTestExercise } from \"./program/StrengthTestExercise.js\";\nimport { StrengthTestSession } from \"./program/StrengthTestSession.js\";\nimport { UserStrengthTests } from \"./program/UserStrengthTests.js\";\nimport { TranslatedStrengthTest } from \"./program/TranslatedStrengthTest.js\";\nimport { TranslatedStrengthTestExercise } from \"./program/TranslatedStrengthTestExercise.js\";\nimport { TranslatedExerciseModel } from \"./program/TranslatedExerciseModel.js\";\nimport { CustomProgramBlueprint } from \"./program/CustomProgramBlueprint.js\";\nimport { CustomWorkoutBlueprint } from \"./program/CustomWorkoutBlueprint.js\";\nimport { CustomStrengthTest } from \"./program/CustomStrengthTest.js\";\nimport { CustomStrengthTestExercise } from \"./program/CustomStrengthTestExercises.js\";\nimport { NonConsumableProgram } from \"./nonconsprogram/NonConsumableProgram.js\";\nimport { NonConsumableProgramWebContent } from \"./nonconsprogram/NonConsumableProgramWebContent.js\";\nimport { UserPrograms } from \"./nonconsprogram/UserNonConsumableProgram.js\";\nimport { TranslatedConsumableProgram } from \"./nonconsprogram/TranslatedConsumableProgram.js\";\nimport { TranslatedNonConsumableProgramWebContent } from \"./nonconsprogram/TranslatedNonConsumableProgramWebContent.js\";\nimport { DietProgram } from \"./diet/DietProgram.js\";\nimport { DietDay } from \"./diet/DietDay.js\";\nimport { DietMeal } from \"./diet/DietMeal.js\";\nimport { DietMealRecipe } from \"./diet/DietMealRecipe.js\";\nimport { Recipe } from \"./diet/Recipe.js\";\nimport { TranslatedRecipe } from \"./diet/TranslatedRecipe.js\";\nimport { RecipeTag } from \"./diet/RecipeTag.js\";\nimport { TranslatedRecipeTag } from \"./diet/TranslatedRecipeTag.js\";\nimport { RecipeTags } from \"./diet/RecipeTags.js\";\nimport { TranslatedRecipeTags } from \"./diet/TranslatedRecipeTags.js\";\nimport { ShoppingList } from \"./diet/ShoppingList.js\";\nimport { ShoppingListItem } from \"./diet/ShoppingListItem.js\";\nimport { UserDietPreferences } from \"./diet/UserDietPreferences.js\";\nimport { WeeklyCheckin } from \"./coaching/WeeklyCheckIn.js\";\nimport { WeightRecord } from \"./coaching/WeightRecord.js\";\nimport { Questionnaire } from \"./coaching/Questionnaire.js\";\nimport { Question } from \"./coaching/Question.js\";\nimport { Answer } from \"./coaching/Answer.js\";\nimport { QuestionnaireResponse } from \"./coaching/QuestionnaireResponse.js\";\nimport { Badge } from \"./gamification/Badge.js\";\nimport { TranslatedBadge } from \"./gamification/TranslatedBadge.js\";\nimport { StreaksLog } from \"./gamification/StreaksLog.js\";\nimport { XpEvent } from \"./gamification/xpAndLeaderboards/XpEvent.js\";\nimport { XpTransaction } from \"./gamification/xpAndLeaderboards/XpTransaction.js\";\nimport { UserRankHistory } from \"./gamification/xpAndLeaderboards/UserRankHistory.js\";\nimport { NotificationModels } from \"./notifications/NotificationModels.js\";\nimport { TranslatedNotification } from \"./notifications/TranslatedNotification.js\";\n\n// Model Arrays - grouped by domain\nexport const USER_MODELS = [\n PersistedUser,\n UserBadges,\n UserStreak,\n UsersFriends,\n UserCoach,\n UserDiscount,\n UserOptions,\n UserAddons,\n DeviceTokens,\n];\n\nexport const SUBSCRIPTION_MODELS = [Subscription, SubscriptionLog];\n\nexport const PROGRAM_MODELS = [\n Program,\n Workout,\n Exercise,\n ExercisesModels,\n Superset,\n ProgressEntry,\n RestDay,\n WorkoutSession,\n Challenge,\n ChallengeBlueprint,\n UserChallenge,\n TranslatedChallenge,\n ThirtyDayChallenge,\n ThirtyDayChallengeStrengthTest,\n StrengthTest,\n StrengthTestExercise,\n StrengthTestSession,\n UserStrengthTests,\n TranslatedStrengthTest,\n TranslatedStrengthTestExercise,\n TranslatedExerciseModel,\n CustomProgramBlueprint,\n CustomWorkoutBlueprint,\n CustomStrengthTest,\n CustomStrengthTestExercise,\n];\n\nexport const NON_CONSUMABLE_PROGRAM_MODELS = [\n NonConsumableProgram,\n NonConsumableProgramWebContent,\n UserPrograms,\n TranslatedConsumableProgram,\n TranslatedNonConsumableProgramWebContent,\n];\n\nexport const DIET_MODELS = [\n DietProgram,\n DietDay,\n DietMeal,\n DietMealRecipe,\n Recipe,\n TranslatedRecipe,\n RecipeTag,\n TranslatedRecipeTag,\n RecipeTags,\n TranslatedRecipeTags,\n ShoppingList,\n ShoppingListItem,\n UserDietPreferences,\n];\n\nexport const COACHING_MODELS = [\n WeeklyCheckin,\n WeightRecord,\n Questionnaire,\n Question,\n Answer,\n QuestionnaireResponse,\n];\n\nexport const GAMIFICATION_MODELS = [\n Badge,\n TranslatedBadge,\n StreaksLog,\n XpEvent,\n XpTransaction,\n UserRankHistory,\n];\n\nexport const NOTIFICATION_MODELS = [NotificationModels, TranslatedNotification];\n\n// All core models combined\nexport const ALL_CORE_MODELS = [\n ...USER_MODELS,\n ...SUBSCRIPTION_MODELS,\n ...PROGRAM_MODELS,\n ...NON_CONSUMABLE_PROGRAM_MODELS,\n ...DIET_MODELS,\n ...COACHING_MODELS,\n ...GAMIFICATION_MODELS,\n ...NOTIFICATION_MODELS,\n];\n"],"names":["PersistedUser","UserBadges","UserStreak","UsersFriends","UserCoach","UserDiscount","UserOptions","UserAddons","DeviceTokens","Subscription","SubscriptionLog","Program","Workout","Exercise","ExercisesModels","Superset","ProgressEntry","RestDay","WorkoutSession","Challenge","ChallengeBlueprint","UserChallenge","TranslatedChallenge","ThirtyDayChallenge","ThirtyDayChallengeStrengthTest","StrengthTest","StrengthTestExercise","StrengthTestSession","UserStrengthTests","TranslatedStrengthTest","TranslatedStrengthTestExercise","TranslatedExerciseModel","CustomProgramBlueprint","CustomWorkoutBlueprint","CustomStrengthTest","CustomStrengthTestExercise","NonConsumableProgram","NonConsumableProgramWebContent","UserPrograms","TranslatedConsumableProgram","TranslatedNonConsumableProgramWebContent","DietProgram","DietDay","DietMeal","DietMealRecipe","Recipe","TranslatedRecipe","RecipeTag","TranslatedRecipeTag","RecipeTags","TranslatedRecipeTags","ShoppingList","ShoppingListItem","UserDietPreferences","WeeklyCheckin","WeightRecord","Questionnaire","QuestionnaireType","Question","QuestionType","Answer","QuestionnaireResponse","Badge","TranslatedBadge","StreaksLog","XpEvent","XpTransaction","UserRankHistory","NotificationModels","TranslatedNotification","USER_MODELS","SUBSCRIPTION_MODELS","PROGRAM_MODELS","NON_CONSUMABLE_PROGRAM_MODELS","DIET_MODELS","COACHING_MODELS","GAMIFICATION_MODELS","NOTIFICATION_MODELS","ALL_CORE_MODELS"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/dbmodels/index.ts"],"sourcesContent":["// User Models\nexport { PersistedUser } from \"./user/PersistedUser.js\";\nexport { UserBadges } from \"./user/UserBadges.js\";\nexport { UserStreak } from \"./user/UserStreaks.js\";\nexport { UsersFriends } from \"./user/UsersFriends.js\";\nexport { UserCoach } from \"./user/UserCoach.js\";\nexport { UserDiscount } from \"./user/UserDiscount.js\";\nexport { UserOptions } from \"./user/UserOptions.js\";\nexport { UserAddons } from \"./user/UserAddons.js\";\nexport { DeviceTokens } from \"./user/DeviceTokens.js\";\n\n// Subscription Models\nexport { Subscription } from \"./subscription/Subscription.js\";\nexport { SubscriptionLog } from \"./subscription/SubscriptionLog.js\";\n\n// Program Models\nexport { Program } from \"./program/Program.js\";\nexport { Workout } from \"./program/Workout.js\";\nexport { Exercise } from \"./program/Exercise.js\";\nexport { ExercisesModels } from \"./program/ExerciseModels.js\";\nexport { Superset } from \"./program/Superset.js\";\nexport { ProgressEntry } from \"./program/ProgressEntry.js\";\nexport { RestDay } from \"./program/RestDay.js\";\nexport { WorkoutSession } from \"./program/WorkoutSession.js\";\nexport { Challenge } from \"./program/Challenge.js\";\nexport { ChallengeBlueprint } from \"./program/ChallengeBlueprint.js\";\nexport { UserChallenge } from \"./program/UserChallenge.js\";\nexport { TranslatedChallenge } from \"./program/TranslatedChallenge.js\";\nexport { ThirtyDayChallenge } from \"./program/ThirtyDayChallenge.js\";\nexport { ThirtyDayChallengeStrengthTest } from \"./program/ThirtyDayChallengeStrengthTest.js\";\nexport { StrengthTest } from \"./program/StrengthTest.js\";\nexport { StrengthTestExercise } from \"./program/StrengthTestExercise.js\";\nexport { StrengthTestSession } from \"./program/StrengthTestSession.js\";\nexport { UserStrengthTests } from \"./program/UserStrengthTests.js\";\nexport { TranslatedStrengthTest } from \"./program/TranslatedStrengthTest.js\";\nexport { TranslatedStrengthTestExercise } from \"./program/TranslatedStrengthTestExercise.js\";\nexport { TranslatedExerciseModel } from \"./program/TranslatedExerciseModel.js\";\nexport { CustomProgramBlueprint } from \"./program/CustomProgramBlueprint.js\";\nexport { CustomWorkoutBlueprint } from \"./program/CustomWorkoutBlueprint.js\";\nexport { CustomStrengthTest } from \"./program/CustomStrengthTest.js\";\nexport { CustomStrengthTestExercise } from \"./program/CustomStrengthTestExercises.js\";\n\n// Non-Consumable Program Models\nexport { NonConsumableProgram } from \"./nonconsprogram/NonConsumableProgram.js\";\nexport { NonConsumableProgramWebContent } from \"./nonconsprogram/NonConsumableProgramWebContent.js\";\nexport { UserPrograms } from \"./nonconsprogram/UserNonConsumableProgram.js\";\nexport { TranslatedConsumableProgram } from \"./nonconsprogram/TranslatedConsumableProgram.js\";\nexport { TranslatedNonConsumableProgramWebContent } from \"./nonconsprogram/TranslatedNonConsumableProgramWebContent.js\";\n\n// Diet & Nutrition Models\nexport { DietProgram } from \"./diet/DietProgram.js\";\nexport { DietDay } from \"./diet/DietDay.js\";\nexport { DietMeal } from \"./diet/DietMeal.js\";\nexport { DietMealRecipe } from \"./diet/DietMealRecipe.js\";\nexport { Recipe } from \"./diet/Recipe.js\";\nexport { TranslatedRecipe } from \"./diet/TranslatedRecipe.js\";\nexport { RecipeTag } from \"./diet/RecipeTag.js\";\nexport { TranslatedRecipeTag } from \"./diet/TranslatedRecipeTag.js\";\nexport { RecipeTags } from \"./diet/RecipeTags.js\";\nexport { TranslatedRecipeTags } from \"./diet/TranslatedRecipeTags.js\";\nexport { ShoppingList } from \"./diet/ShoppingList.js\";\nexport { ShoppingListItem } from \"./diet/ShoppingListItem.js\";\nexport { UserDietPreferences } from \"./diet/UserDietPreferences.js\";\nexport { Ingredient } from \"./diet/Ingredient.js\";\nexport { IngredientTag } from \"./diet/IngredientTag.js\";\nexport { IngredientTags } from \"./diet/IngredientTags.js\";\nexport { RecipeIngredient } from \"./diet/RecipeIngredient.js\";\n\n// Coaching Models\nexport { WeeklyCheckin } from \"./coaching/WeeklyCheckIn.js\";\nexport { WeightRecord } from \"./coaching/WeightRecord.js\";\nexport { Questionnaire, QuestionnaireType } from \"./coaching/Questionnaire.js\";\nexport { Question, QuestionType } from \"./coaching/Question.js\";\nexport { Answer } from \"./coaching/Answer.js\";\nexport { QuestionnaireResponse } from \"./coaching/QuestionnaireResponse.js\";\n\n// Gamification Models\nexport { Badge } from \"./gamification/Badge.js\";\nexport { TranslatedBadge } from \"./gamification/TranslatedBadge.js\";\nexport { StreaksLog } from \"./gamification/StreaksLog.js\";\nexport { XpEvent } from \"./gamification/xpAndLeaderboards/XpEvent.js\";\nexport { XpTransaction } from \"./gamification/xpAndLeaderboards/XpTransaction.js\";\nexport { UserRankHistory } from \"./gamification/xpAndLeaderboards/UserRankHistory.js\";\n\n// Notification Models\nexport { NotificationModels } from \"./notifications/NotificationModels.js\";\nexport { TranslatedNotification } from \"./notifications/TranslatedNotification.js\";\n\n// Import for model arrays\nimport { PersistedUser } from \"./user/PersistedUser.js\";\nimport { UserBadges } from \"./user/UserBadges.js\";\nimport { UserStreak } from \"./user/UserStreaks.js\";\nimport { UsersFriends } from \"./user/UsersFriends.js\";\nimport { UserCoach } from \"./user/UserCoach.js\";\nimport { UserDiscount } from \"./user/UserDiscount.js\";\nimport { UserOptions } from \"./user/UserOptions.js\";\nimport { UserAddons } from \"./user/UserAddons.js\";\nimport { DeviceTokens } from \"./user/DeviceTokens.js\";\nimport { Subscription } from \"./subscription/Subscription.js\";\nimport { SubscriptionLog } from \"./subscription/SubscriptionLog.js\";\nimport { Program } from \"./program/Program.js\";\nimport { Workout } from \"./program/Workout.js\";\nimport { Exercise } from \"./program/Exercise.js\";\nimport { ExercisesModels } from \"./program/ExerciseModels.js\";\nimport { Superset } from \"./program/Superset.js\";\nimport { ProgressEntry } from \"./program/ProgressEntry.js\";\nimport { RestDay } from \"./program/RestDay.js\";\nimport { WorkoutSession } from \"./program/WorkoutSession.js\";\nimport { Challenge } from \"./program/Challenge.js\";\nimport { ChallengeBlueprint } from \"./program/ChallengeBlueprint.js\";\nimport { UserChallenge } from \"./program/UserChallenge.js\";\nimport { TranslatedChallenge } from \"./program/TranslatedChallenge.js\";\nimport { ThirtyDayChallenge } from \"./program/ThirtyDayChallenge.js\";\nimport { ThirtyDayChallengeStrengthTest } from \"./program/ThirtyDayChallengeStrengthTest.js\";\nimport { StrengthTest } from \"./program/StrengthTest.js\";\nimport { StrengthTestExercise } from \"./program/StrengthTestExercise.js\";\nimport { StrengthTestSession } from \"./program/StrengthTestSession.js\";\nimport { UserStrengthTests } from \"./program/UserStrengthTests.js\";\nimport { TranslatedStrengthTest } from \"./program/TranslatedStrengthTest.js\";\nimport { TranslatedStrengthTestExercise } from \"./program/TranslatedStrengthTestExercise.js\";\nimport { TranslatedExerciseModel } from \"./program/TranslatedExerciseModel.js\";\nimport { CustomProgramBlueprint } from \"./program/CustomProgramBlueprint.js\";\nimport { CustomWorkoutBlueprint } from \"./program/CustomWorkoutBlueprint.js\";\nimport { CustomStrengthTest } from \"./program/CustomStrengthTest.js\";\nimport { CustomStrengthTestExercise } from \"./program/CustomStrengthTestExercises.js\";\nimport { NonConsumableProgram } from \"./nonconsprogram/NonConsumableProgram.js\";\nimport { NonConsumableProgramWebContent } from \"./nonconsprogram/NonConsumableProgramWebContent.js\";\nimport { UserPrograms } from \"./nonconsprogram/UserNonConsumableProgram.js\";\nimport { TranslatedConsumableProgram } from \"./nonconsprogram/TranslatedConsumableProgram.js\";\nimport { TranslatedNonConsumableProgramWebContent } from \"./nonconsprogram/TranslatedNonConsumableProgramWebContent.js\";\nimport { DietProgram } from \"./diet/DietProgram.js\";\nimport { DietDay } from \"./diet/DietDay.js\";\nimport { DietMeal } from \"./diet/DietMeal.js\";\nimport { DietMealRecipe } from \"./diet/DietMealRecipe.js\";\nimport { Recipe } from \"./diet/Recipe.js\";\nimport { TranslatedRecipe } from \"./diet/TranslatedRecipe.js\";\nimport { RecipeTag } from \"./diet/RecipeTag.js\";\nimport { TranslatedRecipeTag } from \"./diet/TranslatedRecipeTag.js\";\nimport { RecipeTags } from \"./diet/RecipeTags.js\";\nimport { TranslatedRecipeTags } from \"./diet/TranslatedRecipeTags.js\";\nimport { ShoppingList } from \"./diet/ShoppingList.js\";\nimport { ShoppingListItem } from \"./diet/ShoppingListItem.js\";\nimport { UserDietPreferences } from \"./diet/UserDietPreferences.js\";\nimport { Ingredient } from \"./diet/Ingredient.js\";\nimport { IngredientTag } from \"./diet/IngredientTag.js\";\nimport { IngredientTags } from \"./diet/IngredientTags.js\";\nimport { RecipeIngredient } from \"./diet/RecipeIngredient.js\";\nimport { WeeklyCheckin } from \"./coaching/WeeklyCheckIn.js\";\nimport { WeightRecord } from \"./coaching/WeightRecord.js\";\nimport { Questionnaire } from \"./coaching/Questionnaire.js\";\nimport { Question } from \"./coaching/Question.js\";\nimport { Answer } from \"./coaching/Answer.js\";\nimport { QuestionnaireResponse } from \"./coaching/QuestionnaireResponse.js\";\nimport { Badge } from \"./gamification/Badge.js\";\nimport { TranslatedBadge } from \"./gamification/TranslatedBadge.js\";\nimport { StreaksLog } from \"./gamification/StreaksLog.js\";\nimport { XpEvent } from \"./gamification/xpAndLeaderboards/XpEvent.js\";\nimport { XpTransaction } from \"./gamification/xpAndLeaderboards/XpTransaction.js\";\nimport { UserRankHistory } from \"./gamification/xpAndLeaderboards/UserRankHistory.js\";\nimport { NotificationModels } from \"./notifications/NotificationModels.js\";\nimport { TranslatedNotification } from \"./notifications/TranslatedNotification.js\";\n\n// Model Arrays - grouped by domain\nexport const USER_MODELS = [\n PersistedUser,\n UserBadges,\n UserStreak,\n UsersFriends,\n UserCoach,\n UserDiscount,\n UserOptions,\n UserAddons,\n DeviceTokens,\n];\n\nexport const SUBSCRIPTION_MODELS = [Subscription, SubscriptionLog];\n\nexport const PROGRAM_MODELS = [\n Program,\n Workout,\n Exercise,\n ExercisesModels,\n Superset,\n ProgressEntry,\n RestDay,\n WorkoutSession,\n Challenge,\n ChallengeBlueprint,\n UserChallenge,\n TranslatedChallenge,\n ThirtyDayChallenge,\n ThirtyDayChallengeStrengthTest,\n StrengthTest,\n StrengthTestExercise,\n StrengthTestSession,\n UserStrengthTests,\n TranslatedStrengthTest,\n TranslatedStrengthTestExercise,\n TranslatedExerciseModel,\n CustomProgramBlueprint,\n CustomWorkoutBlueprint,\n CustomStrengthTest,\n CustomStrengthTestExercise,\n];\n\nexport const NON_CONSUMABLE_PROGRAM_MODELS = [\n NonConsumableProgram,\n NonConsumableProgramWebContent,\n UserPrograms,\n TranslatedConsumableProgram,\n TranslatedNonConsumableProgramWebContent,\n];\n\nexport const DIET_MODELS = [\n DietProgram,\n DietDay,\n DietMeal,\n DietMealRecipe,\n Recipe,\n TranslatedRecipe,\n RecipeTag,\n TranslatedRecipeTag,\n RecipeTags,\n TranslatedRecipeTags,\n ShoppingList,\n ShoppingListItem,\n UserDietPreferences,\n Ingredient,\n IngredientTag,\n IngredientTags,\n RecipeIngredient,\n];\n\nexport const COACHING_MODELS = [\n WeeklyCheckin,\n WeightRecord,\n Questionnaire,\n Question,\n Answer,\n QuestionnaireResponse,\n];\n\nexport const GAMIFICATION_MODELS = [\n Badge,\n TranslatedBadge,\n StreaksLog,\n XpEvent,\n XpTransaction,\n UserRankHistory,\n];\n\nexport const NOTIFICATION_MODELS = [NotificationModels, TranslatedNotification];\n\n// All core models combined\nexport const ALL_CORE_MODELS = [\n ...USER_MODELS,\n ...SUBSCRIPTION_MODELS,\n ...PROGRAM_MODELS,\n ...NON_CONSUMABLE_PROGRAM_MODELS,\n ...DIET_MODELS,\n ...COACHING_MODELS,\n ...GAMIFICATION_MODELS,\n ...NOTIFICATION_MODELS,\n];\n"],"names":["PersistedUser","UserBadges","UserStreak","UsersFriends","UserCoach","UserDiscount","UserOptions","UserAddons","DeviceTokens","Subscription","SubscriptionLog","Program","Workout","Exercise","ExercisesModels","Superset","ProgressEntry","RestDay","WorkoutSession","Challenge","ChallengeBlueprint","UserChallenge","TranslatedChallenge","ThirtyDayChallenge","ThirtyDayChallengeStrengthTest","StrengthTest","StrengthTestExercise","StrengthTestSession","UserStrengthTests","TranslatedStrengthTest","TranslatedStrengthTestExercise","TranslatedExerciseModel","CustomProgramBlueprint","CustomWorkoutBlueprint","CustomStrengthTest","CustomStrengthTestExercise","NonConsumableProgram","NonConsumableProgramWebContent","UserPrograms","TranslatedConsumableProgram","TranslatedNonConsumableProgramWebContent","DietProgram","DietDay","DietMeal","DietMealRecipe","Recipe","TranslatedRecipe","RecipeTag","TranslatedRecipeTag","RecipeTags","TranslatedRecipeTags","ShoppingList","ShoppingListItem","UserDietPreferences","Ingredient","IngredientTag","IngredientTags","RecipeIngredient","WeeklyCheckin","WeightRecord","Questionnaire","QuestionnaireType","Question","QuestionType","Answer","QuestionnaireResponse","Badge","TranslatedBadge","StreaksLog","XpEvent","XpTransaction","UserRankHistory","NotificationModels","TranslatedNotification","USER_MODELS","SUBSCRIPTION_MODELS","PROGRAM_MODELS","NON_CONSUMABLE_PROGRAM_MODELS","DIET_MODELS","COACHING_MODELS","GAMIFICATION_MODELS","NOTIFICATION_MODELS","ALL_CORE_MODELS"],"mappings":"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"}
@@ -48,5 +48,6 @@ export declare class AuthenticationUtil {
48
48
  static getAndroidAccessToken(): Promise<CredentialsType>;
49
49
  static getAndroidSubscriptionsStatuses(token: string): Promise<any>;
50
50
  static isAndroidSubscriptionsActive(token: string): Promise<boolean>;
51
+ static extendAndroidSubscription(purchaseToken: string, subscriptionId: string, extendByDays: number): Promise<any>;
51
52
  }
52
53
  //# sourceMappingURL=AuthenticationUtil.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthenticationUtil.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/AuthenticationUtil.ts"],"names":[],"mappings":"AACA,OAAO,GAAyC,MAAM,cAAc,CAAC;AAIrE,OAAO,KAAK,EAAC,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EACV,WAAW,IAAI,eAAe,EAC9B,kBAAkB,EAIlB,wBAAwB,EAExB,SAAS,EACT,kBAAkB,EACnB,MAAM,6BAA6B,CAAC;AAKrC,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,KAAK,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAmCnE,qBAAa,kBAAkB;IAC7B,gBAAuB,aAAa,EAAsC,MAAM,CAAC;IACjF,gBAAuB,cAAc,EAAuC,MAAM,CAAC;WAG/D,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;WAQ1E,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,GAAG,KAAK,CAAC;IAmC3F;;OAEG;WACW,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAMtD;;OAEG;WACW,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIvD;;OAEG;WACW,kBAAkB,CAAC,YAAY,EAAE,MAAM;IA4BrD;;OAEG;WACiB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAInE;;OAEG;WACiB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAItE,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;WAMzE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;WAiBrE,iBAAiB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;WAUhB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;WAchD,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;WAqB1C,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;WAUtC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;WAW3D,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;WAa7D,oBAAoB,CACpC,qBAAqB,EAAE,MAAM,GAC9B,OAAO,CAAC,kBAAkB,EAAE,CAAC;WAuDZ,6BAA6B,CAC7C,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,wBAAwB,EAAE,CAAC;WAkElB,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WA6BlE,8BAA8B,CAAC,aAAa,EAAE,MAAM;;;WA8CpD,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;WAyBxE,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa;WAQzC,uBAAuB,CACvC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACrB,OAAO,CAAC,GAAG,CAAC;WAkBK,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC;WAYjD,+BAA+B,CAAC,KAAK,EAAE,MAAM;WAiC7C,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAwBlF"}
1
+ {"version":3,"file":"AuthenticationUtil.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/AuthenticationUtil.ts"],"names":[],"mappings":"AACA,OAAO,GAAyC,MAAM,cAAc,CAAC;AAIrE,OAAO,KAAK,EAAC,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EACV,WAAW,IAAI,eAAe,EAC9B,kBAAkB,EAIlB,wBAAwB,EAExB,SAAS,EACT,kBAAkB,EACnB,MAAM,6BAA6B,CAAC;AAKrC,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,KAAK,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAmCnE,qBAAa,kBAAkB;IAC7B,gBAAuB,aAAa,EAAsC,MAAM,CAAC;IACjF,gBAAuB,cAAc,EAAuC,MAAM,CAAC;WAG/D,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;WAQ1E,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,GAAG,KAAK,CAAC;IAmC3F;;OAEG;WACW,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAMtD;;OAEG;WACW,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAIvD;;OAEG;WACW,kBAAkB,CAAC,YAAY,EAAE,MAAM;IA4BrD;;OAEG;WACiB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAInE;;OAEG;WACiB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAItE,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;WAMzE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;WAiBrE,iBAAiB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;WAUhB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;WAchD,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;WAqB1C,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;WAUtC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;WAW3D,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;WAa7D,oBAAoB,CACpC,qBAAqB,EAAE,MAAM,GAC9B,OAAO,CAAC,kBAAkB,EAAE,CAAC;WAuDZ,6BAA6B,CAC7C,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,wBAAwB,EAAE,CAAC;WAkElB,yBAAyB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WA6BlE,8BAA8B,CAAC,aAAa,EAAE,MAAM;;;WA8CpD,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;WAyBxE,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa;WAQzC,uBAAuB,CACvC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACrB,OAAO,CAAC,GAAG,CAAC;WAkBK,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC;WAYjD,+BAA+B,CAAC,KAAK,EAAE,MAAM;WAiC7C,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAyB7D,yBAAyB,CACzC,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACrB,OAAO,CAAC,GAAG,CAAC;CA0ChB"}
@@ -446,6 +446,36 @@ export class AuthenticationUtil {
446
446
  return false;
447
447
  }
448
448
  }
449
+ static async extendAndroidSubscription(purchaseToken, subscriptionId, extendByDays) {
450
+ const credentials = await this.getAndroidAccessToken();
451
+ const packageName = process.env.ANDROID_PACKAGE_NAME || "nl.browney.nintydayschallenge";
452
+ // First, get the current subscription details to get the current expiry time
453
+ const currentSubResponse = await axios.get(`https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${packageName}/purchases/subscriptionsv2/tokens/${purchaseToken}`, {
454
+ headers: {
455
+ Authorization: `Bearer ${credentials.access_token}`
456
+ }
457
+ });
458
+ const currentExpiryTime = currentSubResponse.data.lineItems?.[0]?.expiryTime;
459
+ if (!currentExpiryTime) {
460
+ throw new Error("Unable to get current subscription expiry time");
461
+ }
462
+ // Calculate the new expiry time
463
+ const currentExpiryMs = new Date(currentExpiryTime).getTime();
464
+ const desiredExpiryMs = currentExpiryMs + extendByDays * 24 * 60 * 60 * 1000;
465
+ // Use the defer API to extend the subscription
466
+ const response = await axios.post(`https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${packageName}/purchases/subscriptions/${subscriptionId}/tokens/${purchaseToken}:defer`, {
467
+ deferralInfo: {
468
+ expectedExpiryTimeMillis: currentExpiryMs.toString(),
469
+ desiredExpiryTimeMillis: desiredExpiryMs.toString()
470
+ }
471
+ }, {
472
+ headers: {
473
+ Authorization: `Bearer ${credentials.access_token}`,
474
+ "Content-Type": "application/json"
475
+ }
476
+ });
477
+ return response.data;
478
+ }
449
479
  }
450
480
 
451
481
  //# sourceMappingURL=AuthenticationUtil.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/utils/AuthenticationUtil.ts"],"sourcesContent":["import * as dotenv from \"dotenv\";\nimport jwt, {type JwtPayload, type VerifyErrors} from \"jsonwebtoken\";\nimport axios, {type AxiosResponse, isAxiosError} from \"axios\";\nimport {google} from \"googleapis\";\nimport * as bcrypt from \"bcryptjs\";\nimport type {LoginTicket,} from \"google-auth-library\";\nimport {OAuth2Client as OAuth2ClientImpl} from \"google-auth-library\";\nimport jwksClient, {type SigningKey} from \"jwks-rsa\";\nimport type {\n Credentials as CredentialsType,\n SignedTransactions,\n SingleTransactionResponse,\n SubscriptionStatusResponse,\n SubscriptionStatusResponseError,\n SubscriptionStatusResult,\n TransactionsResponse,\n UserTypes,\n VerificationStatus,\n} from '../models/UserInterfaces.js';\nimport {AppleTransactionError} from '../Errors/Errors.js';\nimport {SecretManagerServiceClient} from \"@google-cloud/secret-manager\";\nimport {Log} from \"./Logger.js\";\nimport {randomUUID} from \"node:crypto\";\nimport type {Context} from \"koa\";\nimport {AuthenticationError} from \"../Errors/AppError.js\";\nimport { PersistedUser } from \"lib/dbmodels/user/PersistedUser.js\";\n\ndotenv.config();\n\nconst logger: Log = Log.getInstance().extend(\"authentication-util\");\n\nenum TokenExpiration {\n ACCESS = 60 * 60, // 1 hour in seconds\n REFRESH = 30 * 24 * 60 * 60 // 30 days in seconds\n}\n\nconst appleJwksClient = jwksClient({\n jwksUri: \"https://appleid.apple.com/auth/keys\",\n});\n\nasync function loadAndroidServiceAccount(): Promise<{client_email: string; private_key: string}> {\n const sm = new SecretManagerServiceClient();\n const name = \"projects/1033066542238/secrets/ANDROID_SUB_KEY/versions/latest\";\n const [v] = await sm.accessSecretVersion({ name });\n const raw = v.payload?.data?.toString(\"utf8\") ?? \"\";\n\n // Secret should be the full JSON key. Parse and normalize newlines.\n const json = JSON.parse(raw);\n const client_email = json.client_email as string;\n const private_key = String(json.private_key).replace(/\\\\n/g, \"\\n\");\n return { client_email, private_key };\n}\n\nasync function loadAppleSubscriptionkey(): Promise<string> {\n const client = new SecretManagerServiceClient();\n const name = \"projects/1033066542238/secrets/APPLE_SUB_KEY/versions/latest\";\n const [v] = await client.accessSecretVersion({ name });\n return v.payload?.data?.toString(\"utf8\") ?? \"\";\n}\n\nexport class AuthenticationUtil {\n public static readonly ACCESS_SECRET = process.env.ACCESS_TOKEN_SECRET as string;\n public static readonly REFRESH_SECRET = process.env.REFRESH_TOKEN_SECRET as string;\n\n\n public static async fetchUserWithTokenInfo(token: string): Promise<PersistedUser | null> {\n const userInToken = await AuthenticationUtil.verifyTokenAndFetchUser(token);\n if (!userInToken || !userInToken.userUuid) {\n return null;\n }\n return userInToken;\n }\n\n public static verifyTokenAndFetchUser(token: string): Promise<PersistedUser | null | false> {\n return new Promise<PersistedUser | null | false>((resolve, reject) => {\n jwt.verify(\n token,\n this.ACCESS_SECRET,\n (err: VerifyErrors | null, decoded: JwtPayload | string | undefined) => {\n if (err) {\n reject(err);\n return;\n }\n\n if (decoded === undefined) {\n resolve(null);\n return;\n }\n\n const user: UserTypes = <UserTypes>decoded;\n\n if (!user.userUuid) {\n resolve(false);\n return;\n }\n\n PersistedUser.findByPk(user.userUuid)\n .then((persistedUser: PersistedUser | null) => {\n resolve(persistedUser);\n })\n .catch((e: Error) => {\n reject(e);\n });\n }\n );\n });\n }\n\n /**\n * Sign access token\n */\n public static signAccessToken(user: UserTypes): string {\n return jwt.sign(user, this.ACCESS_SECRET, {\n expiresIn: TokenExpiration.ACCESS,\n });\n }\n\n /**\n * Sign refresh token\n */\n public static signRefreshToken(user: UserTypes): string {\n return jwt.sign(user, this.REFRESH_SECRET);\n }\n\n /**\n * Verify refresh token and return new access token\n */\n public static verifyRefreshToken(refreshToken: string) {\n return new Promise<string | null | false>((resolve, reject) => {\n jwt.verify(\n refreshToken,\n this.REFRESH_SECRET,\n async (\n err: VerifyErrors | null,\n user: JwtPayload | string | undefined\n ) => {\n if (err) {\n reject(err);\n }\n\n if (user === undefined) {\n resolve(null);\n return;\n }\n const userTypes = <UserTypes>user;\n const newAccessToken = this.signAccessToken(userTypes);\n\n resolve(newAccessToken);\n }\n );\n });\n }\n\n // ==================== Password Management ====================\n\n /**\n * Hash password using bcrypt\n */\n public static async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, 10);\n }\n\n /**\n * Compare password with hash\n */\n public static async comparePassword(plainPassword: string, hash: string): Promise<boolean> {\n return bcrypt.compare(plainPassword, hash);\n }\n\n public static async checkIfUserAlreadyRegistered(email: string | undefined): Promise<boolean> {\n if (!email) return false;\n const user = await PersistedUser.findOne({ where: { email } });\n return user !== null;\n }\n\n public static async login(email: string, password: string): Promise<PersistedUser | null> {\n const users = await PersistedUser.findAll({ where: { email } });\n\n if (!users || users.length === 0) {\n return null;\n }\n\n for (const user of users) {\n const passwordsMatch = await this.comparePassword(password, user.password);\n if (passwordsMatch) {\n return user;\n }\n }\n\n return null;\n }\n\n public static async verifyGoogleToken(\n idToken: string,\n audience: string\n ): Promise<LoginTicket | null> {\n const client = new OAuth2ClientImpl(audience);\n try {\n return await client.verifyIdToken({ idToken, audience });\n } catch (error) {\n logger.error(\"Google Token Verification Error:\", error);\n return null;\n }\n }\n\n public static getGoogleClientId(platform: string): string | undefined {\n switch (platform) {\n case \"android\":\n return process.env.ANDROID_GOOGLE_CLIENT_ID;\n case \"ios\":\n return process.env.IOS_GOOGLE_CLIENT_ID;\n case \"web\":\n return process.env.WEB_GOOGLE_CLIENT_ID;\n default:\n return undefined;\n }\n }\n\n\n public static async generateAppleJWT(): Promise<string> {\n const privateKey: string = await loadAppleSubscriptionkey()\n\n const header = {\n alg: \"ES256\",\n kid: process.env.APPLE_KID as string,\n typ: \"JWT\",\n };\n\n const payload = {\n iss: process.env.APPLE_ISSUER as string,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 3600,\n aud: \"appstoreconnect-v1\",\n bid: process.env.APPLE_BUNDLE_ID as string,\n };\n\n return jwt.sign(payload, privateKey, { header });\n }\n\n\n public static verifyAppleJwt(userData: string, key: string) {\n try {\n return jwt.verify(userData, key);\n } catch (e) {\n logger.error(e);\n return null;\n }\n }\n\n\n public static async getAppleSignInKey(kid: string): Promise<string | undefined> {\n try {\n const key: SigningKey = await appleJwksClient.getSigningKey(kid);\n return key.getPublicKey();\n } catch (e) {\n logger.error(e);\n return undefined;\n }\n }\n\n\n public static async verifyAppleReceipt(data: string): Promise<VerificationStatus> {\n const response: AxiosResponse = await axios.post(\n \"https://buy.itunes.apple.com/verifyReceipt\",\n {\n \"receipt-data\": data,\n password: process.env.APPLE_SHARED_SECRET as string,\n \"exclude-old-transactions\": true,\n }\n );\n\n return response.data as VerificationStatus;\n }\n\n public static async getAppleTransactions(\n originalTransactionId: string\n ): Promise<SignedTransactions[]> {\n const result: SignedTransactions[] = [];\n\n try {\n const response: AxiosResponse<TransactionsResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/history/${originalTransactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const token of response.data.signedTransactions) {\n result.push(jwt.decode(token) as SignedTransactions);\n }\n\n return result;\n } catch (error) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n\n if (\n isAxiosError(error) &&\n (error.response?.data.errorCode === 4040010 || error.response?.status === 401)\n ) {\n try {\n const response: AxiosResponse<TransactionsResponse> = await axios.get(\n `https://api.storekit-sandbox.itunes.apple.com/inApps/v1/history/${originalTransactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const token of response.data.signedTransactions) {\n result.push(jwt.decode(token) as SignedTransactions);\n }\n\n return result;\n } catch (e) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n }\n throw new AppleTransactionError(\"Transaction was not found in both environments.\");\n }\n throw error;\n }\n }\n\n public static async getAppleSubscriptionsStatuses(\n transactionId: string\n ): Promise<SubscriptionStatusResult[]> {\n const result: SubscriptionStatusResult[] = [];\n\n try {\n const response: AxiosResponse<SubscriptionStatusResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const transaction of response.data.data[0].lastTransactions) {\n result.push({\n originalTransactionId: transaction.originalTransactionId,\n status: transaction.status,\n signedTransactionInfo: jwt.decode(transaction.signedTransactionInfo),\n signedRenewalInfo: jwt.decode(transaction.signedRenewalInfo),\n });\n }\n\n return result;\n } catch (error: unknown) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n\n // Try sandbox\n if (\n isAxiosError(error) &&\n (error.response?.data.errorCode === 4040010 || error.response?.status === 401)\n ) {\n try {\n const response: AxiosResponse<SubscriptionStatusResponse> = await axios.get(\n `https://api.storekit-sandbox.itunes.apple.com/inApps/v1/subscriptions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const transaction of response.data.data[0].lastTransactions) {\n result.push({\n originalTransactionId: transaction.originalTransactionId,\n status: transaction.status,\n signedTransactionInfo: jwt.decode(transaction.signedTransactionInfo),\n signedRenewalInfo: jwt.decode(transaction.signedRenewalInfo),\n });\n }\n\n return result;\n } catch (e) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n }\n throw new AppleTransactionError(\"Transaction was not found in both environments.\");\n }\n throw error;\n }\n }\n\n public static async isAppleSubscriptionActive(transactionId: string): Promise<boolean> {\n try {\n const response: AxiosResponse<SubscriptionStatusResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return (\n response.data.data[0].lastTransactions[0].status === 0 ||\n response.data.data[0].lastTransactions[0].status === 2\n );\n } catch (e) {\n if (\n axios.isAxiosError(e) &&\n e.response &&\n (e.response.data as SubscriptionStatusResponseError)[\"errorMessage\"] ===\n \"Invalid transaction id.\"\n ) {\n return false;\n }\n return false;\n }\n }\n\n public static async getSingleAppleTransactionsInfo(transactionId: string) {\n try {\n const response: AxiosResponse<SingleTransactionResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/transactions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return { signedTransactionInfo: jwt.decode(response.data.signedTransactionInfo) };\n } catch (error) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n\n if (\n isAxiosError(error) &&\n (error.response?.data.errorCode === 4040010 || error.response?.status === 401)\n ) {\n try {\n const response: AxiosResponse<SingleTransactionResponse> = await axios.get(\n `https://api.storekit-sandbox.itunes.apple.com/inApps/v1/transactions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return { signedTransactionInfo: jwt.decode(response.data.signedTransactionInfo) };\n } catch (e) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n }\n throw new AppleTransactionError(\"Transaction was not found in both environments.\");\n }\n throw error;\n }\n }\n\n\n public static async checkIfUserBoughtProgram(transactionId: string): Promise<string[]> {\n try {\n const productIds: string[] = [];\n const url = process.env.PURCHASE_HISTORY_URL || \"https://api.storekit.itunes.apple.com\";\n const response: AxiosResponse = await axios.get(\n `${url}/inApps/v2/history/${transactionId}?productType=NON_CONSUMABLE`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const transaction of response.data.signedTransactions) {\n productIds.push((jwt.decode(transaction) as { productId: string }).productId);\n }\n\n return productIds;\n } catch (e) {\n logger.error((e as Error).message);\n return [];\n }\n }\n\n public static getUserFromContext(ctx: Context): PersistedUser {\n const user = ctx.state.user as PersistedUser;\n if (!user) {\n ctx.throw(AuthenticationError);\n }\n return user;\n }\n\n public static async extendAppleSubscription(\n transactionId: string,\n extendByDays: number\n ): Promise<any> {\n const response: AxiosResponse = await axios.put(\n `https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/extend/${transactionId}`,\n {\n extendByDays,\n extendReasonCode: 1,\n requestIdentifier: randomUUID(),\n },\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n },\n }\n );\n\n return response.data;\n }\n\n public static async getAndroidAccessToken(): Promise<CredentialsType> {\n const { client_email, private_key } = await loadAndroidServiceAccount();\n\n const jwtClient = new google.auth.JWT({\n email: client_email,\n key: private_key, // unesc\n scopes: [\"https://www.googleapis.com/auth/androidpublisher\"],\n });\n\n return await jwtClient.authorize();\n }\n\n public static async getAndroidSubscriptionsStatuses(token: string) {\n try {\n const credentials = await this.getAndroidAccessToken();\n\n const response: AxiosResponse = await axios.get(\n `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${process.env.ANDROID_PACKAGE_NAME || \"nl.browney.nintydayschallenge\"}/purchases/subscriptionsv2/tokens/${token}`,\n {\n headers: {\n Authorization: `Bearer ${credentials.access_token as string}`,\n },\n }\n );\n\n return response.data;\n } catch (error) {\n if (isAxiosError(error) && error.response && error.response.status === 410) {\n // Subscription expired\n return {\n lineItems: [\n {\n expiryTime: new Date(Date.now() - 86400000).toISOString(), // Yesterday\n },\n ],\n };\n } else {\n if (isAxiosError(error)) {\n logger.error(\"Android subscription error:\", error.message);\n return false;\n }\n }\n }\n }\n\n public static async isAndroidSubscriptionsActive(token: string): Promise<boolean> {\n try {\n const credentials = await this.getAndroidAccessToken();\n\n const response: AxiosResponse = await axios.get(\n `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${process.env.ANDROID_PACKAGE_NAME || \"nl.browney.nintydayschallenge\"}/purchases/subscriptionsv2/tokens/${token}`,\n {\n headers: {\n Authorization: `Bearer ${credentials.access_token as string}`,\n },\n }\n );\n\n return (\n (response.data as { subscriptionState: string }).subscriptionState ===\n \"SUBSCRIPTION_STATE_ACTIVE\"\n );\n } catch (error) {\n if (isAxiosError(error)) {\n logger.error(\"An error occurred:\", error.message);\n }\n return false;\n }\n }\n}\n"],"names":["dotenv","jwt","axios","isAxiosError","google","bcrypt","OAuth2Client","OAuth2ClientImpl","jwksClient","AppleTransactionError","SecretManagerServiceClient","Log","randomUUID","AuthenticationError","PersistedUser","config","logger","getInstance","extend","TokenExpiration","appleJwksClient","jwksUri","loadAndroidServiceAccount","sm","name","v","accessSecretVersion","raw","payload","data","toString","json","JSON","parse","client_email","private_key","String","replace","loadAppleSubscriptionkey","client","AuthenticationUtil","ACCESS_SECRET","process","env","ACCESS_TOKEN_SECRET","REFRESH_SECRET","REFRESH_TOKEN_SECRET","fetchUserWithTokenInfo","token","userInToken","verifyTokenAndFetchUser","userUuid","Promise","resolve","reject","verify","err","decoded","undefined","user","findByPk","then","persistedUser","catch","e","signAccessToken","sign","expiresIn","signRefreshToken","verifyRefreshToken","refreshToken","userTypes","newAccessToken","hashPassword","password","hash","comparePassword","plainPassword","compare","checkIfUserAlreadyRegistered","email","findOne","where","login","users","findAll","length","passwordsMatch","verifyGoogleToken","idToken","audience","verifyIdToken","error","getGoogleClientId","platform","ANDROID_GOOGLE_CLIENT_ID","IOS_GOOGLE_CLIENT_ID","WEB_GOOGLE_CLIENT_ID","generateAppleJWT","privateKey","header","alg","kid","APPLE_KID","typ","iss","APPLE_ISSUER","iat","Math","floor","Date","now","exp","aud","bid","APPLE_BUNDLE_ID","verifyAppleJwt","userData","key","getAppleSignInKey","getSigningKey","getPublicKey","verifyAppleReceipt","response","post","APPLE_SHARED_SECRET","getAppleTransactions","originalTransactionId","result","get","headers","Authorization","signedTransactions","push","decode","status","errorCode","getAppleSubscriptionsStatuses","transactionId","transaction","lastTransactions","signedTransactionInfo","signedRenewalInfo","isAppleSubscriptionActive","getSingleAppleTransactionsInfo","checkIfUserBoughtProgram","productIds","url","PURCHASE_HISTORY_URL","productId","message","getUserFromContext","ctx","state","throw","extendAppleSubscription","extendByDays","put","extendReasonCode","requestIdentifier","getAndroidAccessToken","jwtClient","auth","JWT","scopes","authorize","getAndroidSubscriptionsStatuses","credentials","ANDROID_PACKAGE_NAME","access_token","lineItems","expiryTime","toISOString","isAndroidSubscriptionsActive","subscriptionState"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/utils/AuthenticationUtil.ts"],"sourcesContent":["import * as dotenv from \"dotenv\";\nimport jwt, {type JwtPayload, type VerifyErrors} from \"jsonwebtoken\";\nimport axios, {type AxiosResponse, isAxiosError} from \"axios\";\nimport {google} from \"googleapis\";\nimport * as bcrypt from \"bcryptjs\";\nimport type {LoginTicket,} from \"google-auth-library\";\nimport {OAuth2Client as OAuth2ClientImpl} from \"google-auth-library\";\nimport jwksClient, {type SigningKey} from \"jwks-rsa\";\nimport type {\n Credentials as CredentialsType,\n SignedTransactions,\n SingleTransactionResponse,\n SubscriptionStatusResponse,\n SubscriptionStatusResponseError,\n SubscriptionStatusResult,\n TransactionsResponse,\n UserTypes,\n VerificationStatus,\n} from '../models/UserInterfaces.js';\nimport {AppleTransactionError} from '../Errors/Errors.js';\nimport {SecretManagerServiceClient} from \"@google-cloud/secret-manager\";\nimport {Log} from \"./Logger.js\";\nimport {randomUUID} from \"node:crypto\";\nimport type {Context} from \"koa\";\nimport {AuthenticationError} from \"../Errors/AppError.js\";\nimport { PersistedUser } from \"lib/dbmodels/user/PersistedUser.js\";\n\ndotenv.config();\n\nconst logger: Log = Log.getInstance().extend(\"authentication-util\");\n\nenum TokenExpiration {\n ACCESS = 60 * 60, // 1 hour in seconds\n REFRESH = 30 * 24 * 60 * 60 // 30 days in seconds\n}\n\nconst appleJwksClient = jwksClient({\n jwksUri: \"https://appleid.apple.com/auth/keys\",\n});\n\nasync function loadAndroidServiceAccount(): Promise<{client_email: string; private_key: string}> {\n const sm = new SecretManagerServiceClient();\n const name = \"projects/1033066542238/secrets/ANDROID_SUB_KEY/versions/latest\";\n const [v] = await sm.accessSecretVersion({ name });\n const raw = v.payload?.data?.toString(\"utf8\") ?? \"\";\n\n // Secret should be the full JSON key. Parse and normalize newlines.\n const json = JSON.parse(raw);\n const client_email = json.client_email as string;\n const private_key = String(json.private_key).replace(/\\\\n/g, \"\\n\");\n return { client_email, private_key };\n}\n\nasync function loadAppleSubscriptionkey(): Promise<string> {\n const client = new SecretManagerServiceClient();\n const name = \"projects/1033066542238/secrets/APPLE_SUB_KEY/versions/latest\";\n const [v] = await client.accessSecretVersion({ name });\n return v.payload?.data?.toString(\"utf8\") ?? \"\";\n}\n\nexport class AuthenticationUtil {\n public static readonly ACCESS_SECRET = process.env.ACCESS_TOKEN_SECRET as string;\n public static readonly REFRESH_SECRET = process.env.REFRESH_TOKEN_SECRET as string;\n\n\n public static async fetchUserWithTokenInfo(token: string): Promise<PersistedUser | null> {\n const userInToken = await AuthenticationUtil.verifyTokenAndFetchUser(token);\n if (!userInToken || !userInToken.userUuid) {\n return null;\n }\n return userInToken;\n }\n\n public static verifyTokenAndFetchUser(token: string): Promise<PersistedUser | null | false> {\n return new Promise<PersistedUser | null | false>((resolve, reject) => {\n jwt.verify(\n token,\n this.ACCESS_SECRET,\n (err: VerifyErrors | null, decoded: JwtPayload | string | undefined) => {\n if (err) {\n reject(err);\n return;\n }\n\n if (decoded === undefined) {\n resolve(null);\n return;\n }\n\n const user: UserTypes = <UserTypes>decoded;\n\n if (!user.userUuid) {\n resolve(false);\n return;\n }\n\n PersistedUser.findByPk(user.userUuid)\n .then((persistedUser: PersistedUser | null) => {\n resolve(persistedUser);\n })\n .catch((e: Error) => {\n reject(e);\n });\n }\n );\n });\n }\n\n /**\n * Sign access token\n */\n public static signAccessToken(user: UserTypes): string {\n return jwt.sign(user, this.ACCESS_SECRET, {\n expiresIn: TokenExpiration.ACCESS,\n });\n }\n\n /**\n * Sign refresh token\n */\n public static signRefreshToken(user: UserTypes): string {\n return jwt.sign(user, this.REFRESH_SECRET);\n }\n\n /**\n * Verify refresh token and return new access token\n */\n public static verifyRefreshToken(refreshToken: string) {\n return new Promise<string | null | false>((resolve, reject) => {\n jwt.verify(\n refreshToken,\n this.REFRESH_SECRET,\n async (\n err: VerifyErrors | null,\n user: JwtPayload | string | undefined\n ) => {\n if (err) {\n reject(err);\n }\n\n if (user === undefined) {\n resolve(null);\n return;\n }\n const userTypes = <UserTypes>user;\n const newAccessToken = this.signAccessToken(userTypes);\n\n resolve(newAccessToken);\n }\n );\n });\n }\n\n // ==================== Password Management ====================\n\n /**\n * Hash password using bcrypt\n */\n public static async hashPassword(password: string): Promise<string> {\n return bcrypt.hash(password, 10);\n }\n\n /**\n * Compare password with hash\n */\n public static async comparePassword(plainPassword: string, hash: string): Promise<boolean> {\n return bcrypt.compare(plainPassword, hash);\n }\n\n public static async checkIfUserAlreadyRegistered(email: string | undefined): Promise<boolean> {\n if (!email) return false;\n const user = await PersistedUser.findOne({ where: { email } });\n return user !== null;\n }\n\n public static async login(email: string, password: string): Promise<PersistedUser | null> {\n const users = await PersistedUser.findAll({ where: { email } });\n\n if (!users || users.length === 0) {\n return null;\n }\n\n for (const user of users) {\n const passwordsMatch = await this.comparePassword(password, user.password);\n if (passwordsMatch) {\n return user;\n }\n }\n\n return null;\n }\n\n public static async verifyGoogleToken(\n idToken: string,\n audience: string\n ): Promise<LoginTicket | null> {\n const client = new OAuth2ClientImpl(audience);\n try {\n return await client.verifyIdToken({ idToken, audience });\n } catch (error) {\n logger.error(\"Google Token Verification Error:\", error);\n return null;\n }\n }\n\n public static getGoogleClientId(platform: string): string | undefined {\n switch (platform) {\n case \"android\":\n return process.env.ANDROID_GOOGLE_CLIENT_ID;\n case \"ios\":\n return process.env.IOS_GOOGLE_CLIENT_ID;\n case \"web\":\n return process.env.WEB_GOOGLE_CLIENT_ID;\n default:\n return undefined;\n }\n }\n\n\n public static async generateAppleJWT(): Promise<string> {\n const privateKey: string = await loadAppleSubscriptionkey()\n\n const header = {\n alg: \"ES256\",\n kid: process.env.APPLE_KID as string,\n typ: \"JWT\",\n };\n\n const payload = {\n iss: process.env.APPLE_ISSUER as string,\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 3600,\n aud: \"appstoreconnect-v1\",\n bid: process.env.APPLE_BUNDLE_ID as string,\n };\n\n return jwt.sign(payload, privateKey, { header });\n }\n\n\n public static verifyAppleJwt(userData: string, key: string) {\n try {\n return jwt.verify(userData, key);\n } catch (e) {\n logger.error(e);\n return null;\n }\n }\n\n\n public static async getAppleSignInKey(kid: string): Promise<string | undefined> {\n try {\n const key: SigningKey = await appleJwksClient.getSigningKey(kid);\n return key.getPublicKey();\n } catch (e) {\n logger.error(e);\n return undefined;\n }\n }\n\n\n public static async verifyAppleReceipt(data: string): Promise<VerificationStatus> {\n const response: AxiosResponse = await axios.post(\n \"https://buy.itunes.apple.com/verifyReceipt\",\n {\n \"receipt-data\": data,\n password: process.env.APPLE_SHARED_SECRET as string,\n \"exclude-old-transactions\": true,\n }\n );\n\n return response.data as VerificationStatus;\n }\n\n public static async getAppleTransactions(\n originalTransactionId: string\n ): Promise<SignedTransactions[]> {\n const result: SignedTransactions[] = [];\n\n try {\n const response: AxiosResponse<TransactionsResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/history/${originalTransactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const token of response.data.signedTransactions) {\n result.push(jwt.decode(token) as SignedTransactions);\n }\n\n return result;\n } catch (error) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n\n if (\n isAxiosError(error) &&\n (error.response?.data.errorCode === 4040010 || error.response?.status === 401)\n ) {\n try {\n const response: AxiosResponse<TransactionsResponse> = await axios.get(\n `https://api.storekit-sandbox.itunes.apple.com/inApps/v1/history/${originalTransactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const token of response.data.signedTransactions) {\n result.push(jwt.decode(token) as SignedTransactions);\n }\n\n return result;\n } catch (e) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n }\n throw new AppleTransactionError(\"Transaction was not found in both environments.\");\n }\n throw error;\n }\n }\n\n public static async getAppleSubscriptionsStatuses(\n transactionId: string\n ): Promise<SubscriptionStatusResult[]> {\n const result: SubscriptionStatusResult[] = [];\n\n try {\n const response: AxiosResponse<SubscriptionStatusResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const transaction of response.data.data[0].lastTransactions) {\n result.push({\n originalTransactionId: transaction.originalTransactionId,\n status: transaction.status,\n signedTransactionInfo: jwt.decode(transaction.signedTransactionInfo),\n signedRenewalInfo: jwt.decode(transaction.signedRenewalInfo),\n });\n }\n\n return result;\n } catch (error: unknown) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n\n // Try sandbox\n if (\n isAxiosError(error) &&\n (error.response?.data.errorCode === 4040010 || error.response?.status === 401)\n ) {\n try {\n const response: AxiosResponse<SubscriptionStatusResponse> = await axios.get(\n `https://api.storekit-sandbox.itunes.apple.com/inApps/v1/subscriptions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const transaction of response.data.data[0].lastTransactions) {\n result.push({\n originalTransactionId: transaction.originalTransactionId,\n status: transaction.status,\n signedTransactionInfo: jwt.decode(transaction.signedTransactionInfo),\n signedRenewalInfo: jwt.decode(transaction.signedRenewalInfo),\n });\n }\n\n return result;\n } catch (e) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n }\n throw new AppleTransactionError(\"Transaction was not found in both environments.\");\n }\n throw error;\n }\n }\n\n public static async isAppleSubscriptionActive(transactionId: string): Promise<boolean> {\n try {\n const response: AxiosResponse<SubscriptionStatusResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return (\n response.data.data[0].lastTransactions[0].status === 0 ||\n response.data.data[0].lastTransactions[0].status === 2\n );\n } catch (e) {\n if (\n axios.isAxiosError(e) &&\n e.response &&\n (e.response.data as SubscriptionStatusResponseError)[\"errorMessage\"] ===\n \"Invalid transaction id.\"\n ) {\n return false;\n }\n return false;\n }\n }\n\n public static async getSingleAppleTransactionsInfo(transactionId: string) {\n try {\n const response: AxiosResponse<SingleTransactionResponse> = await axios.get(\n `https://api.storekit.itunes.apple.com/inApps/v1/transactions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return { signedTransactionInfo: jwt.decode(response.data.signedTransactionInfo) };\n } catch (error) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n\n if (\n isAxiosError(error) &&\n (error.response?.data.errorCode === 4040010 || error.response?.status === 401)\n ) {\n try {\n const response: AxiosResponse<SingleTransactionResponse> = await axios.get(\n `https://api.storekit-sandbox.itunes.apple.com/inApps/v1/transactions/${transactionId}`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return { signedTransactionInfo: jwt.decode(response.data.signedTransactionInfo) };\n } catch (e) {\n if (isAxiosError(error) && error.response?.status === 400) {\n throw new AppleTransactionError(\"Invalid transaction id.\");\n }\n }\n throw new AppleTransactionError(\"Transaction was not found in both environments.\");\n }\n throw error;\n }\n }\n\n\n public static async checkIfUserBoughtProgram(transactionId: string): Promise<string[]> {\n try {\n const productIds: string[] = [];\n const url = process.env.PURCHASE_HISTORY_URL || \"https://api.storekit.itunes.apple.com\";\n const response: AxiosResponse = await axios.get(\n `${url}/inApps/v2/history/${transactionId}?productType=NON_CONSUMABLE`,\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n for (const transaction of response.data.signedTransactions) {\n productIds.push((jwt.decode(transaction) as { productId: string }).productId);\n }\n\n return productIds;\n } catch (e) {\n logger.error((e as Error).message);\n return [];\n }\n }\n\n public static getUserFromContext(ctx: Context): PersistedUser {\n const user = ctx.state.user as PersistedUser;\n if (!user) {\n ctx.throw(AuthenticationError);\n }\n return user;\n }\n\n public static async extendAppleSubscription(\n transactionId: string,\n extendByDays: number\n ): Promise<any> {\n const response: AxiosResponse = await axios.put(\n `https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/extend/${transactionId}`,\n {\n extendByDays,\n extendReasonCode: 1,\n requestIdentifier: randomUUID(),\n },\n {\n headers: {\n Authorization: `Bearer ${await this.generateAppleJWT()}`,\n },\n }\n );\n\n return response.data;\n }\n\n public static async getAndroidAccessToken(): Promise<CredentialsType> {\n const { client_email, private_key } = await loadAndroidServiceAccount();\n\n const jwtClient = new google.auth.JWT({\n email: client_email,\n key: private_key, // unesc\n scopes: [\"https://www.googleapis.com/auth/androidpublisher\"],\n });\n\n return await jwtClient.authorize();\n }\n\n public static async getAndroidSubscriptionsStatuses(token: string) {\n try {\n const credentials = await this.getAndroidAccessToken();\n\n const response: AxiosResponse = await axios.get(\n `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${process.env.ANDROID_PACKAGE_NAME || \"nl.browney.nintydayschallenge\"}/purchases/subscriptionsv2/tokens/${token}`,\n {\n headers: {\n Authorization: `Bearer ${credentials.access_token as string}`,\n },\n }\n );\n\n return response.data;\n } catch (error) {\n if (isAxiosError(error) && error.response && error.response.status === 410) {\n // Subscription expired\n return {\n lineItems: [\n {\n expiryTime: new Date(Date.now() - 86400000).toISOString(), // Yesterday\n },\n ],\n };\n } else {\n if (isAxiosError(error)) {\n logger.error(\"Android subscription error:\", error.message);\n return false;\n }\n }\n }\n }\n\n public static async isAndroidSubscriptionsActive(token: string): Promise<boolean> {\n try {\n const credentials = await this.getAndroidAccessToken();\n\n const response: AxiosResponse = await axios.get(\n `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${process.env.ANDROID_PACKAGE_NAME || \"nl.browney.nintydayschallenge\"}/purchases/subscriptionsv2/tokens/${token}`,\n {\n headers: {\n Authorization: `Bearer ${credentials.access_token as string}`,\n },\n }\n );\n\n return (\n (response.data as { subscriptionState: string }).subscriptionState ===\n \"SUBSCRIPTION_STATE_ACTIVE\"\n );\n } catch (error) {\n if (isAxiosError(error)) {\n logger.error(\"An error occurred:\", error.message);\n }\n return false;\n }\n }\n\n public static async extendAndroidSubscription(\n purchaseToken: string,\n subscriptionId: string,\n extendByDays: number\n ): Promise<any> {\n const credentials = await this.getAndroidAccessToken();\n const packageName = process.env.ANDROID_PACKAGE_NAME || \"nl.browney.nintydayschallenge\";\n\n // First, get the current subscription details to get the current expiry time\n const currentSubResponse: AxiosResponse = await axios.get(\n `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${packageName}/purchases/subscriptionsv2/tokens/${purchaseToken}`,\n {\n headers: {\n Authorization: `Bearer ${credentials.access_token as string}`,\n },\n }\n );\n\n const currentExpiryTime = currentSubResponse.data.lineItems?.[0]?.expiryTime;\n if (!currentExpiryTime) {\n throw new Error(\"Unable to get current subscription expiry time\");\n }\n\n // Calculate the new expiry time\n const currentExpiryMs = new Date(currentExpiryTime).getTime();\n const desiredExpiryMs = currentExpiryMs + (extendByDays * 24 * 60 * 60 * 1000);\n\n // Use the defer API to extend the subscription\n const response: AxiosResponse = await axios.post(\n `https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${packageName}/purchases/subscriptions/${subscriptionId}/tokens/${purchaseToken}:defer`,\n {\n deferralInfo: {\n expectedExpiryTimeMillis: currentExpiryMs.toString(),\n desiredExpiryTimeMillis: desiredExpiryMs.toString(),\n },\n },\n {\n headers: {\n Authorization: `Bearer ${credentials.access_token as string}`,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n return response.data;\n }\n}\n"],"names":["dotenv","jwt","axios","isAxiosError","google","bcrypt","OAuth2Client","OAuth2ClientImpl","jwksClient","AppleTransactionError","SecretManagerServiceClient","Log","randomUUID","AuthenticationError","PersistedUser","config","logger","getInstance","extend","TokenExpiration","appleJwksClient","jwksUri","loadAndroidServiceAccount","sm","name","v","accessSecretVersion","raw","payload","data","toString","json","JSON","parse","client_email","private_key","String","replace","loadAppleSubscriptionkey","client","AuthenticationUtil","ACCESS_SECRET","process","env","ACCESS_TOKEN_SECRET","REFRESH_SECRET","REFRESH_TOKEN_SECRET","fetchUserWithTokenInfo","token","userInToken","verifyTokenAndFetchUser","userUuid","Promise","resolve","reject","verify","err","decoded","undefined","user","findByPk","then","persistedUser","catch","e","signAccessToken","sign","expiresIn","signRefreshToken","verifyRefreshToken","refreshToken","userTypes","newAccessToken","hashPassword","password","hash","comparePassword","plainPassword","compare","checkIfUserAlreadyRegistered","email","findOne","where","login","users","findAll","length","passwordsMatch","verifyGoogleToken","idToken","audience","verifyIdToken","error","getGoogleClientId","platform","ANDROID_GOOGLE_CLIENT_ID","IOS_GOOGLE_CLIENT_ID","WEB_GOOGLE_CLIENT_ID","generateAppleJWT","privateKey","header","alg","kid","APPLE_KID","typ","iss","APPLE_ISSUER","iat","Math","floor","Date","now","exp","aud","bid","APPLE_BUNDLE_ID","verifyAppleJwt","userData","key","getAppleSignInKey","getSigningKey","getPublicKey","verifyAppleReceipt","response","post","APPLE_SHARED_SECRET","getAppleTransactions","originalTransactionId","result","get","headers","Authorization","signedTransactions","push","decode","status","errorCode","getAppleSubscriptionsStatuses","transactionId","transaction","lastTransactions","signedTransactionInfo","signedRenewalInfo","isAppleSubscriptionActive","getSingleAppleTransactionsInfo","checkIfUserBoughtProgram","productIds","url","PURCHASE_HISTORY_URL","productId","message","getUserFromContext","ctx","state","throw","extendAppleSubscription","extendByDays","put","extendReasonCode","requestIdentifier","getAndroidAccessToken","jwtClient","auth","JWT","scopes","authorize","getAndroidSubscriptionsStatuses","credentials","ANDROID_PACKAGE_NAME","access_token","lineItems","expiryTime","toISOString","isAndroidSubscriptionsActive","subscriptionState","extendAndroidSubscription","purchaseToken","subscriptionId","packageName","currentSubResponse","currentExpiryTime","Error","currentExpiryMs","getTime","desiredExpiryMs","deferralInfo","expectedExpiryTimeMillis","desiredExpiryTimeMillis"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "90dc-core",
3
- "version": "1.12.0",
3
+ "version": "1.12.2",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -55,7 +55,8 @@
55
55
  "homepage": "https://github.com/RomaPchel/90DC-core#readme",
56
56
  "scripts": {
57
57
  "clean": "rm -rf dist",
58
- "build": "npm run clean && npx swc --strip-leading-paths --config-file .swcrc ./src -d dist && npm run generate:dts && npm run copy:scripts",
58
+ "build": "npm run clean && npx swc --strip-leading-paths --config-file .swcrc ./src -d dist && npm run generate:dts && npm run copy:scripts && npm run post-build-fix",
59
+ "post-build-fix": "bash scripts/post-build-fix.sh",
59
60
  "generate:dts": "tsc --emitDeclarationOnly --declaration --declarationMap --outDir dist",
60
61
  "copy:scripts": "cp src/lib/scripts/.sequelizerc.cjs dist/lib/scripts/ && cp src/lib/scripts/sequelize.config.cjs dist/lib/scripts/ && cp -r src/lib/scripts/seeders dist/lib/scripts/ 2>/dev/null || true",
61
62
  "prettier:format": "prettier . --write",