@drax/ai-back 3.44.0 → 3.46.0

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 (50) hide show
  1. package/dist/controllers/TTSVoiceController.js +18 -0
  2. package/dist/factory/services/TTSVoiceServiceFactory.js +28 -0
  3. package/dist/index.js +13 -4
  4. package/dist/interfaces/ITTSVoice.js +1 -0
  5. package/dist/interfaces/ITTSVoiceRepository.js +1 -0
  6. package/dist/models/TTSVoiceModel.js +25 -0
  7. package/dist/permissions/TTSVoicePermissions.js +10 -0
  8. package/dist/repository/mongo/TTSVoiceMongoRepository.js +13 -0
  9. package/dist/repository/sqlite/TTSVoiceSqliteRepository.js +27 -0
  10. package/dist/routes/TTSVoiceRoutes.js +21 -0
  11. package/dist/schemas/TTSVoiceSchema.js +19 -0
  12. package/dist/services/TTSVoiceService.js +9 -0
  13. package/package.json +4 -4
  14. package/src/controllers/TTSVoiceController.ts +27 -0
  15. package/src/factory/services/TTSVoiceServiceFactory.ts +36 -0
  16. package/src/index.ts +22 -0
  17. package/src/interfaces/ITTSVoice.ts +20 -0
  18. package/src/interfaces/ITTSVoiceRepository.ts +8 -0
  19. package/src/models/TTSVoiceModel.ts +37 -0
  20. package/src/permissions/TTSVoicePermissions.ts +12 -0
  21. package/src/repository/mongo/TTSVoiceMongoRepository.ts +19 -0
  22. package/src/repository/sqlite/TTSVoiceSqliteRepository.ts +33 -0
  23. package/src/routes/TTSVoiceRoutes.ts +26 -0
  24. package/src/schemas/TTSVoiceSchema.ts +23 -0
  25. package/src/services/TTSVoiceService.ts +16 -0
  26. package/tsconfig.tsbuildinfo +1 -1
  27. package/types/controllers/TTSVoiceController.d.ts +8 -0
  28. package/types/controllers/TTSVoiceController.d.ts.map +1 -0
  29. package/types/factory/services/TTSVoiceServiceFactory.d.ts +8 -0
  30. package/types/factory/services/TTSVoiceServiceFactory.d.ts.map +1 -0
  31. package/types/index.d.ts +12 -2
  32. package/types/index.d.ts.map +1 -1
  33. package/types/interfaces/ITTSVoice.d.ts +16 -0
  34. package/types/interfaces/ITTSVoice.d.ts.map +1 -0
  35. package/types/interfaces/ITTSVoiceRepository.d.ts +6 -0
  36. package/types/interfaces/ITTSVoiceRepository.d.ts.map +1 -0
  37. package/types/models/TTSVoiceModel.d.ts +15 -0
  38. package/types/models/TTSVoiceModel.d.ts.map +1 -0
  39. package/types/permissions/TTSVoicePermissions.d.ts +10 -0
  40. package/types/permissions/TTSVoicePermissions.d.ts.map +1 -0
  41. package/types/repository/mongo/TTSVoiceMongoRepository.d.ts +9 -0
  42. package/types/repository/mongo/TTSVoiceMongoRepository.d.ts.map +1 -0
  43. package/types/repository/sqlite/TTSVoiceSqliteRepository.d.ts +23 -0
  44. package/types/repository/sqlite/TTSVoiceSqliteRepository.d.ts.map +1 -0
  45. package/types/routes/TTSVoiceRoutes.d.ts +4 -0
  46. package/types/routes/TTSVoiceRoutes.d.ts.map +1 -0
  47. package/types/schemas/TTSVoiceSchema.d.ts +36 -0
  48. package/types/schemas/TTSVoiceSchema.d.ts.map +1 -0
  49. package/types/services/TTSVoiceService.d.ts +10 -0
  50. package/types/services/TTSVoiceService.d.ts.map +1 -0
@@ -0,0 +1,18 @@
1
+ import TTSVoiceServiceFactory from "../factory/services/TTSVoiceServiceFactory.js";
2
+ import { AbstractFastifyController } from "@drax/crud-back";
3
+ import TTSVoicePermissions from "../permissions/TTSVoicePermissions.js";
4
+ class TTSVoiceController extends AbstractFastifyController {
5
+ constructor() {
6
+ super(TTSVoiceServiceFactory.instance, TTSVoicePermissions);
7
+ this.tenantField = "tenant";
8
+ this.userField = "user";
9
+ this.tenantFilter = true;
10
+ this.tenantSetter = true;
11
+ this.tenantAssert = true;
12
+ this.userFilter = false;
13
+ this.userSetter = false;
14
+ this.userAssert = false;
15
+ }
16
+ }
17
+ export default TTSVoiceController;
18
+ export { TTSVoiceController };
@@ -0,0 +1,28 @@
1
+ import TTSVoiceMongoRepository from '../../repository/mongo/TTSVoiceMongoRepository.js';
2
+ import TTSVoiceSqliteRepository from '../../repository/sqlite/TTSVoiceSqliteRepository.js';
3
+ import { TTSVoiceService } from '../../services/TTSVoiceService.js';
4
+ import { TTSVoiceBaseSchema, TTSVoiceSchema } from "../../schemas/TTSVoiceSchema.js";
5
+ import { COMMON, CommonConfig, DraxConfig } from "@drax/common-back";
6
+ class TTSVoiceServiceFactory {
7
+ static get instance() {
8
+ if (!TTSVoiceServiceFactory.service) {
9
+ let repository;
10
+ switch (DraxConfig.getOrLoad(CommonConfig.DbEngine)) {
11
+ case COMMON.DB_ENGINES.MONGODB:
12
+ repository = new TTSVoiceMongoRepository();
13
+ break;
14
+ case COMMON.DB_ENGINES.SQLITE:
15
+ const dbFile = DraxConfig.getOrLoad(CommonConfig.SqliteDbFile);
16
+ repository = new TTSVoiceSqliteRepository(dbFile, false);
17
+ repository.build();
18
+ break;
19
+ default:
20
+ throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(COMMON.DB_ENGINES).join(", "));
21
+ }
22
+ TTSVoiceServiceFactory.service = new TTSVoiceService(repository, TTSVoiceBaseSchema, TTSVoiceSchema);
23
+ }
24
+ return TTSVoiceServiceFactory.service;
25
+ }
26
+ }
27
+ export default TTSVoiceServiceFactory;
28
+ export { TTSVoiceServiceFactory };
package/dist/index.js CHANGED
@@ -4,10 +4,14 @@ import { OllamaAiConfig } from "./config/OllamaAiConfig.js";
4
4
  import { DeepSeekConfig } from "./config/DeepSeekConfig.js";
5
5
  import { ElevenLabsTTSConfig } from "./config/ElevenLabsTTSConfig.js";
6
6
  import { AILogSchema, AILogBaseSchema } from "./schemas/AILogSchema.js";
7
+ import { TTSVoiceSchema, TTSVoiceBaseSchema, TTSVoiceProviderSchema } from "./schemas/TTSVoiceSchema.js";
7
8
  import { TTSRequestSchema, TTSVoiceSettingsSchema } from "./schemas/TTSRequestSchema.js";
8
9
  import AILogModel from "./models/AILogModel.js";
10
+ import TTSVoiceModel from "./models/TTSVoiceModel.js";
9
11
  import AILogMongoRepository from "./repository/mongo/AILogMongoRepository.js";
10
12
  import AILogSqliteRepository from "./repository/sqlite/AILogSqliteRepository.js";
13
+ import TTSVoiceMongoRepository from "./repository/mongo/TTSVoiceMongoRepository.js";
14
+ import TTSVoiceSqliteRepository from "./repository/sqlite/TTSVoiceSqliteRepository.js";
11
15
  import { OpenAiProviderFactory } from "./factory/ai/OpenAiProviderFactory.js";
12
16
  import { GoogleAiProviderFactory } from "./factory/ai/GoogleAiProviderFactory.js";
13
17
  import { OllamaAiProviderFactory } from "./factory/ai/OllamaAiProviderFactory.js";
@@ -17,6 +21,7 @@ import { ElevenLabsTTSProviderFactory } from "./factory/tts/ElevenLabsTTSProvide
17
21
  import { TTSProviderFactory } from "./factory/tts/TTSProviderFactory.js";
18
22
  import { DraxAgentFactory } from "./factory/DraxAgentFactory.js";
19
23
  import AILogServiceFactory from "./factory/services/AILogServiceFactory.js";
24
+ import TTSVoiceServiceFactory from "./factory/services/TTSVoiceServiceFactory.js";
20
25
  import { OpenAiProvider } from "./providers/ai/OpenAiProvider.js";
21
26
  import { GoogleAiProvider } from "./providers/ai/GoogleAiProvider.js";
22
27
  import { OllamaAiProvider } from "./providers/ai/OllamaAiProvider.js";
@@ -25,6 +30,7 @@ import { ElevenLabsTTSProvider } from "./providers/tts/ElevenLabsTTSProvider.js"
25
30
  import { BuilderTool } from "./tools/BuilderTool.js";
26
31
  import { KnowledgeService } from "./services/KnowledgeService.js";
27
32
  import { AILogService } from "./services/AILogService.js";
33
+ import { TTSVoiceService } from "./services/TTSVoiceService.js";
28
34
  import { TTSGenericService } from "./services/TTSGenericService.js";
29
35
  import { PromptAudioService } from "./services/PromptAudioService.js";
30
36
  import AILogPermissions from "./permissions/AILogPermissions.js";
@@ -32,23 +38,26 @@ import AgentPermissions from "./permissions/AgentPermissions.js";
32
38
  import AgentSessionPermissions from "./permissions/AgentSessionPermissions.js";
33
39
  import AIPermissions from "./permissions/AIPermissions.js";
34
40
  import TTSPermissions from "./permissions/TTSPermissions.js";
41
+ import TTSVoicePermissions from "./permissions/TTSVoicePermissions.js";
35
42
  import AILogController from "./controllers/AILogController.js";
36
43
  import AICrudController from "./controllers/AICrudController.js";
37
44
  import AIGenericController from "./controllers/AIGenericController.js";
38
45
  import TTSGenericController from "./controllers/TTSGenericController.js";
46
+ import TTSVoiceController from "./controllers/TTSVoiceController.js";
39
47
  import DraxAgentController from "./controllers/DraxAgentController.js";
40
48
  import AgentSessionController from "./controllers/AgentSessionController.js";
41
49
  import AILogRoutes from "./routes/AILogRoutes.js";
42
50
  import AIRoutes from "./routes/AIRoutes.js";
43
51
  import TTSRoutes from "./routes/TTSRoutes.js";
52
+ import TTSVoiceRoutes from "./routes/TTSVoiceRoutes.js";
44
53
  import DraxAgentRoutes from "./routes/DraxAgentRoutes.js";
45
54
  import AgentSessionRoutes from "./routes/AgentSessionRoutes.js";
46
55
  import { DraxAgent } from "./agents/DraxAgent.js";
47
56
  import { BuildContextTool } from "./tools/BuildContextTool.js";
48
- export { OpenAiConfig, GoogleAiConfig, OllamaAiConfig, DeepSeekConfig, ElevenLabsTTSConfig, AILogSchema, AILogBaseSchema, TTSRequestSchema, TTSVoiceSettingsSchema, AILogModel, AILogMongoRepository, AILogSqliteRepository, OpenAiProviderFactory, GoogleAiProviderFactory, OllamaAiProviderFactory, DeepSeekAiProviderFactory, AiProviderFactory, ElevenLabsTTSProviderFactory, TTSProviderFactory, DraxAgentFactory, AILogServiceFactory, OpenAiProvider, GoogleAiProvider, OllamaAiProvider, DeepSeekAiProvider, ElevenLabsTTSProvider, BuilderTool, BuildContextTool,
57
+ export { OpenAiConfig, GoogleAiConfig, OllamaAiConfig, DeepSeekConfig, ElevenLabsTTSConfig, AILogSchema, AILogBaseSchema, TTSVoiceSchema, TTSVoiceBaseSchema, TTSVoiceProviderSchema, TTSRequestSchema, TTSVoiceSettingsSchema, AILogModel, TTSVoiceModel, AILogMongoRepository, AILogSqliteRepository, TTSVoiceMongoRepository, TTSVoiceSqliteRepository, OpenAiProviderFactory, GoogleAiProviderFactory, OllamaAiProviderFactory, DeepSeekAiProviderFactory, AiProviderFactory, ElevenLabsTTSProviderFactory, TTSProviderFactory, DraxAgentFactory, AILogServiceFactory, TTSVoiceServiceFactory, OpenAiProvider, GoogleAiProvider, OllamaAiProvider, DeepSeekAiProvider, ElevenLabsTTSProvider, BuilderTool, BuildContextTool,
49
58
  //Service
50
- KnowledgeService, AILogService, TTSGenericService, PromptAudioService,
59
+ KnowledgeService, AILogService, TTSVoiceService, TTSGenericService, PromptAudioService,
51
60
  //Permissions
52
- AILogPermissions, AgentPermissions, AIPermissions, TTSPermissions, AgentSessionPermissions,
61
+ AILogPermissions, AgentPermissions, AIPermissions, TTSPermissions, TTSVoicePermissions, AgentSessionPermissions,
53
62
  //Controllers
54
- AILogController, AICrudController, AIGenericController, TTSGenericController, DraxAgentController, AgentSessionController, DraxAgent, AILogRoutes, AIRoutes, TTSRoutes, DraxAgentRoutes, AgentSessionRoutes };
63
+ AILogController, AICrudController, AIGenericController, TTSGenericController, TTSVoiceController, DraxAgentController, AgentSessionController, DraxAgent, AILogRoutes, AIRoutes, TTSRoutes, TTSVoiceRoutes, DraxAgentRoutes, AgentSessionRoutes };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import { mongoose } from '@drax/common-back';
2
+ import uniqueValidator from 'mongoose-unique-validator';
3
+ import mongoosePaginate from 'mongoose-paginate-v2';
4
+ const TTSVoiceSchema = new mongoose.Schema({
5
+ name: { type: String, required: true, index: true, unique: false },
6
+ ttsProvider: { type: String, enum: ['ElevenLabs'], required: true, index: true, unique: false },
7
+ voiceId: { type: String, required: true, index: true, unique: false },
8
+ model: { type: String, required: false, index: true, unique: false },
9
+ languageCode: { type: String, required: false, index: true, unique: false },
10
+ tenant: { type: mongoose.Schema.Types.ObjectId, ref: 'Tenant', required: false, index: true, unique: false },
11
+ user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: false, index: true, unique: false }
12
+ }, { timestamps: true });
13
+ TTSVoiceSchema.index({ ttsProvider: 1, voiceId: 1, tenant: 1 }, { unique: true, sparse: true });
14
+ TTSVoiceSchema.plugin(uniqueValidator, { message: 'validation.unique' });
15
+ TTSVoiceSchema.plugin(mongoosePaginate);
16
+ TTSVoiceSchema.virtual("id").get(function () {
17
+ return this._id.toString();
18
+ });
19
+ TTSVoiceSchema.set('toJSON', { getters: true, virtuals: true });
20
+ TTSVoiceSchema.set('toObject', { getters: true, virtuals: true });
21
+ const MODEL_NAME = 'TTSVoice';
22
+ const COLLECTION_NAME = 'TTSVoice';
23
+ const TTSVoiceModel = mongoose.model(MODEL_NAME, TTSVoiceSchema, COLLECTION_NAME);
24
+ export { TTSVoiceSchema, TTSVoiceModel };
25
+ export default TTSVoiceModel;
@@ -0,0 +1,10 @@
1
+ var TTSVoicePermissions;
2
+ (function (TTSVoicePermissions) {
3
+ TTSVoicePermissions["Create"] = "ttsvoice:create";
4
+ TTSVoicePermissions["Update"] = "ttsvoice:update";
5
+ TTSVoicePermissions["Delete"] = "ttsvoice:delete";
6
+ TTSVoicePermissions["View"] = "ttsvoice:view";
7
+ TTSVoicePermissions["Manage"] = "ttsvoice:manage";
8
+ })(TTSVoicePermissions || (TTSVoicePermissions = {}));
9
+ export { TTSVoicePermissions };
10
+ export default TTSVoicePermissions;
@@ -0,0 +1,13 @@
1
+ import { AbstractMongoRepository } from "@drax/crud-back";
2
+ import { TTSVoiceModel } from "../../models/TTSVoiceModel.js";
3
+ class TTSVoiceMongoRepository extends AbstractMongoRepository {
4
+ constructor() {
5
+ super();
6
+ this._model = TTSVoiceModel;
7
+ this._searchFields = ['name', 'ttsProvider', 'voiceId', 'model', 'languageCode'];
8
+ this._populateFields = ['tenant', 'user'];
9
+ this._lean = true;
10
+ }
11
+ }
12
+ export default TTSVoiceMongoRepository;
13
+ export { TTSVoiceMongoRepository };
@@ -0,0 +1,27 @@
1
+ import { AbstractSqliteRepository } from "@drax/crud-back";
2
+ class TTSVoiceSqliteRepository extends AbstractSqliteRepository {
3
+ constructor() {
4
+ super(...arguments);
5
+ this.tableName = 'TTSVoice';
6
+ this.searchFields = ['name', 'ttsProvider', 'voiceId', 'model', 'languageCode'];
7
+ this.booleanFields = [];
8
+ this.jsonFields = [];
9
+ this.identifier = '_id';
10
+ this.populateFields = [
11
+ { field: 'tenant', table: 'tenant', identifier: '_id' },
12
+ { field: 'user', table: 'user', identifier: '_id' }
13
+ ];
14
+ this.verbose = false;
15
+ this.tableFields = [
16
+ { name: "name", type: "TEXT", unique: false, primary: false },
17
+ { name: "ttsProvider", type: "TEXT", unique: false, primary: false },
18
+ { name: "voiceId", type: "TEXT", unique: false, primary: false },
19
+ { name: "model", type: "TEXT", unique: false, primary: false },
20
+ { name: "languageCode", type: "TEXT", unique: false, primary: false },
21
+ { name: "tenant", type: "TEXT", unique: false, primary: false },
22
+ { name: "user", type: "TEXT", unique: false, primary: false }
23
+ ];
24
+ }
25
+ }
26
+ export default TTSVoiceSqliteRepository;
27
+ export { TTSVoiceSqliteRepository };
@@ -0,0 +1,21 @@
1
+ import TTSVoiceController from "../controllers/TTSVoiceController.js";
2
+ import { CrudSchemaBuilder } from "@drax/crud-back";
3
+ import { TTSVoiceSchema, TTSVoiceBaseSchema } from '../schemas/TTSVoiceSchema.js';
4
+ async function TTSVoiceRoutes(fastify, options) {
5
+ const controller = new TTSVoiceController();
6
+ const schemas = new CrudSchemaBuilder(TTSVoiceSchema, TTSVoiceBaseSchema, TTSVoiceBaseSchema, 'TTSVoice', 'openapi-3.0', ['ai']);
7
+ fastify.get('/api/ttsvoice', { schema: schemas.paginateSchema }, (req, rep) => controller.paginate(req, rep));
8
+ fastify.get('/api/ttsvoice/find', { schema: schemas.findSchema }, (req, rep) => controller.find(req, rep));
9
+ fastify.get('/api/ttsvoice/search', { schema: schemas.searchSchema }, (req, rep) => controller.search(req, rep));
10
+ fastify.get('/api/ttsvoice/:id', { schema: schemas.findByIdSchema }, (req, rep) => controller.findById(req, rep));
11
+ fastify.get('/api/ttsvoice/find-one', { schema: schemas.findOneSchema }, (req, rep) => controller.findOne(req, rep));
12
+ fastify.get('/api/ttsvoice/group-by', { schema: schemas.groupBySchema }, (req, rep) => controller.groupBy(req, rep));
13
+ fastify.post('/api/ttsvoice', { schema: schemas.createSchema }, (req, rep) => controller.create(req, rep));
14
+ fastify.put('/api/ttsvoice/:id', { schema: schemas.updateSchema }, (req, rep) => controller.update(req, rep));
15
+ fastify.patch('/api/ttsvoice/:id', { schema: schemas.updateSchema }, (req, rep) => controller.updatePartial(req, rep));
16
+ fastify.delete('/api/ttsvoice/:id', { schema: schemas.deleteSchema }, (req, rep) => controller.delete(req, rep));
17
+ fastify.get('/api/ttsvoice/export', (req, rep) => controller.export(req, rep));
18
+ fastify.post('/api/ttsvoice/import', (req, rep) => controller.import(req, rep));
19
+ }
20
+ export default TTSVoiceRoutes;
21
+ export { TTSVoiceRoutes };
@@ -0,0 +1,19 @@
1
+ import { z } from 'zod';
2
+ const TTSVoiceProviderSchema = z.enum(['ElevenLabs']);
3
+ const TTSVoiceBaseSchema = z.object({
4
+ name: z.string().min(1, 'validation.required'),
5
+ ttsProvider: TTSVoiceProviderSchema,
6
+ voiceId: z.string().min(1, 'validation.required'),
7
+ model: z.string().optional().nullable(),
8
+ languageCode: z.string().optional().nullable(),
9
+ tenant: z.coerce.string().optional().nullable(),
10
+ user: z.coerce.string().optional().nullable()
11
+ });
12
+ const TTSVoiceSchema = TTSVoiceBaseSchema
13
+ .extend({
14
+ _id: z.coerce.string(),
15
+ tenant: z.object({ _id: z.coerce.string(), name: z.string().optional() }).nullable().optional(),
16
+ user: z.object({ _id: z.coerce.string(), username: z.string().optional() }).nullable().optional()
17
+ });
18
+ export default TTSVoiceSchema;
19
+ export { TTSVoiceSchema, TTSVoiceBaseSchema, TTSVoiceProviderSchema };
@@ -0,0 +1,9 @@
1
+ import { AbstractService } from "@drax/crud-back";
2
+ class TTSVoiceService extends AbstractService {
3
+ constructor(TTSVoiceRepository, baseSchema, fullSchema) {
4
+ super(TTSVoiceRepository, baseSchema, fullSchema);
5
+ this._validateOutput = true;
6
+ }
7
+ }
8
+ export default TTSVoiceService;
9
+ export { TTSVoiceService };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "3.44.0",
6
+ "version": "3.46.0",
7
7
  "description": "Ai utils",
8
8
  "main": "dist/index.js",
9
9
  "types": "types/index.d.ts",
@@ -18,8 +18,8 @@
18
18
  "author": "Cristian Incarnato & Drax Team",
19
19
  "license": "ISC",
20
20
  "dependencies": {
21
- "@drax/ai-share": "^3.43.0",
22
- "@drax/crud-back": "^3.39.0",
21
+ "@drax/ai-share": "^3.45.0",
22
+ "@drax/crud-back": "^3.46.0",
23
23
  "mongoose": "^8.23.0",
24
24
  "mongoose-paginate-v2": "^1.8.3"
25
25
  },
@@ -46,5 +46,5 @@
46
46
  "typescript": "^5.9.3",
47
47
  "vitest": "^3.0.8"
48
48
  },
49
- "gitHead": "4ba7a86c8b28bba3156bd124a76f3150ba0f676e"
49
+ "gitHead": "a90e6d81ea836f1f921c7baf6f149b82a0aced38"
50
50
  }
@@ -0,0 +1,27 @@
1
+ import TTSVoiceServiceFactory from "../factory/services/TTSVoiceServiceFactory.js";
2
+ import {AbstractFastifyController} from "@drax/crud-back";
3
+ import TTSVoicePermissions from "../permissions/TTSVoicePermissions.js";
4
+ import type {ITTSVoice, ITTSVoiceBase} from "../interfaces/ITTSVoice";
5
+
6
+ class TTSVoiceController extends AbstractFastifyController<ITTSVoice, ITTSVoiceBase, ITTSVoiceBase> {
7
+
8
+ constructor() {
9
+ super(TTSVoiceServiceFactory.instance, TTSVoicePermissions)
10
+ this.tenantField = "tenant";
11
+ this.userField = "user";
12
+
13
+ this.tenantFilter = true;
14
+ this.tenantSetter = true;
15
+ this.tenantAssert = true;
16
+
17
+ this.userFilter = false;
18
+ this.userSetter = false;
19
+ this.userAssert = false;
20
+ }
21
+
22
+ }
23
+
24
+ export default TTSVoiceController;
25
+ export {
26
+ TTSVoiceController
27
+ }
@@ -0,0 +1,36 @@
1
+ import TTSVoiceMongoRepository from '../../repository/mongo/TTSVoiceMongoRepository.js'
2
+ import TTSVoiceSqliteRepository from '../../repository/sqlite/TTSVoiceSqliteRepository.js'
3
+ import type {ITTSVoiceRepository} from "../../interfaces/ITTSVoiceRepository";
4
+ import {TTSVoiceService} from '../../services/TTSVoiceService.js'
5
+ import {TTSVoiceBaseSchema, TTSVoiceSchema} from "../../schemas/TTSVoiceSchema.js";
6
+ import {COMMON, CommonConfig, DraxConfig} from "@drax/common-back";
7
+
8
+ class TTSVoiceServiceFactory {
9
+ private static service: TTSVoiceService;
10
+
11
+ public static get instance(): TTSVoiceService {
12
+ if (!TTSVoiceServiceFactory.service) {
13
+ let repository: ITTSVoiceRepository
14
+ switch (DraxConfig.getOrLoad(CommonConfig.DbEngine)) {
15
+ case COMMON.DB_ENGINES.MONGODB:
16
+ repository = new TTSVoiceMongoRepository()
17
+ break;
18
+ case COMMON.DB_ENGINES.SQLITE:
19
+ const dbFile = DraxConfig.getOrLoad(CommonConfig.SqliteDbFile)
20
+ repository = new TTSVoiceSqliteRepository(dbFile, false)
21
+ repository.build()
22
+ break;
23
+ default:
24
+ throw new Error("DraxConfig.DB_ENGINE must be one of " + Object.values(COMMON.DB_ENGINES).join(", "));
25
+ }
26
+
27
+ TTSVoiceServiceFactory.service = new TTSVoiceService(repository, TTSVoiceBaseSchema, TTSVoiceSchema);
28
+ }
29
+ return TTSVoiceServiceFactory.service;
30
+ }
31
+ }
32
+
33
+ export default TTSVoiceServiceFactory
34
+ export {
35
+ TTSVoiceServiceFactory
36
+ }
package/src/index.ts CHANGED
@@ -4,10 +4,14 @@ import {OllamaAiConfig} from "./config/OllamaAiConfig.js";
4
4
  import {DeepSeekConfig} from "./config/DeepSeekConfig.js";
5
5
  import {ElevenLabsTTSConfig} from "./config/ElevenLabsTTSConfig.js";
6
6
  import {AILogSchema, AILogBaseSchema} from "./schemas/AILogSchema.js";
7
+ import {TTSVoiceSchema, TTSVoiceBaseSchema, TTSVoiceProviderSchema} from "./schemas/TTSVoiceSchema.js";
7
8
  import {TTSRequestSchema, TTSVoiceSettingsSchema} from "./schemas/TTSRequestSchema.js";
8
9
  import AILogModel from "./models/AILogModel.js";
10
+ import TTSVoiceModel from "./models/TTSVoiceModel.js";
9
11
  import AILogMongoRepository from "./repository/mongo/AILogMongoRepository.js";
10
12
  import AILogSqliteRepository from "./repository/sqlite/AILogSqliteRepository.js";
13
+ import TTSVoiceMongoRepository from "./repository/mongo/TTSVoiceMongoRepository.js";
14
+ import TTSVoiceSqliteRepository from "./repository/sqlite/TTSVoiceSqliteRepository.js";
11
15
  import {OpenAiProviderFactory} from "./factory/ai/OpenAiProviderFactory.js";
12
16
  import {GoogleAiProviderFactory} from "./factory/ai/GoogleAiProviderFactory.js";
13
17
  import {OllamaAiProviderFactory} from "./factory/ai/OllamaAiProviderFactory.js";
@@ -18,6 +22,7 @@ import {TTSProviderFactory} from "./factory/tts/TTSProviderFactory.js";
18
22
  import type {TTSProviderInfo} from "./factory/tts/TTSProviderFactory.js";
19
23
  import {DraxAgentFactory} from "./factory/DraxAgentFactory.js";
20
24
  import AILogServiceFactory from "./factory/services/AILogServiceFactory.js";
25
+ import TTSVoiceServiceFactory from "./factory/services/TTSVoiceServiceFactory.js";
21
26
  import {OpenAiProvider} from "./providers/ai/OpenAiProvider.js";
22
27
  import {GoogleAiProvider} from "./providers/ai/GoogleAiProvider.js";
23
28
  import {OllamaAiProvider} from "./providers/ai/OllamaAiProvider.js";
@@ -26,6 +31,7 @@ import {ElevenLabsTTSProvider} from "./providers/tts/ElevenLabsTTSProvider.js";
26
31
  import {BuilderTool} from "./tools/BuilderTool.js";
27
32
  import {KnowledgeService} from "./services/KnowledgeService.js";
28
33
  import {AILogService} from "./services/AILogService.js";
34
+ import {TTSVoiceService} from "./services/TTSVoiceService.js";
29
35
  import {TTSGenericService} from "./services/TTSGenericService.js";
30
36
  import {PromptAudioService} from "./services/PromptAudioService.js";
31
37
  import AILogPermissions from "./permissions/AILogPermissions.js";
@@ -33,20 +39,24 @@ import AgentPermissions from "./permissions/AgentPermissions.js";
33
39
  import AgentSessionPermissions from "./permissions/AgentSessionPermissions.js";
34
40
  import AIPermissions from "./permissions/AIPermissions.js";
35
41
  import TTSPermissions from "./permissions/TTSPermissions.js";
42
+ import TTSVoicePermissions from "./permissions/TTSVoicePermissions.js";
36
43
  import AILogController from "./controllers/AILogController.js";
37
44
  import AICrudController from "./controllers/AICrudController.js";
38
45
  import AIGenericController from "./controllers/AIGenericController.js";
39
46
  import TTSGenericController from "./controllers/TTSGenericController.js";
47
+ import TTSVoiceController from "./controllers/TTSVoiceController.js";
40
48
  import DraxAgentController from "./controllers/DraxAgentController.js";
41
49
  import AgentSessionController from "./controllers/AgentSessionController.js";
42
50
  import AILogRoutes from "./routes/AILogRoutes.js";
43
51
  import AIRoutes from "./routes/AIRoutes.js";
44
52
  import TTSRoutes from "./routes/TTSRoutes.js";
53
+ import TTSVoiceRoutes from "./routes/TTSVoiceRoutes.js";
45
54
  import DraxAgentRoutes from "./routes/DraxAgentRoutes.js";
46
55
  import AgentSessionRoutes from "./routes/AgentSessionRoutes.js";
47
56
  import {DraxAgent} from "./agents/DraxAgent.js";
48
57
  import {BuildContextTool} from "./tools/BuildContextTool.js";
49
58
  import type {IAILogRepository} from "./interfaces/IAILogRepository.js";
59
+ import type {ITTSVoiceRepository} from "./interfaces/ITTSVoiceRepository.js";
50
60
  import type {
51
61
  IAIProvider,
52
62
  IPromptContentPart,
@@ -107,6 +117,7 @@ import type {
107
117
  export type {
108
118
 
109
119
  IAILogRepository,
120
+ ITTSVoiceRepository,
110
121
  IAIProvider,
111
122
  IPromptParams,
112
123
  IPromptMessage,
@@ -156,11 +167,17 @@ export {
156
167
  ElevenLabsTTSConfig,
157
168
  AILogSchema,
158
169
  AILogBaseSchema,
170
+ TTSVoiceSchema,
171
+ TTSVoiceBaseSchema,
172
+ TTSVoiceProviderSchema,
159
173
  TTSRequestSchema,
160
174
  TTSVoiceSettingsSchema,
161
175
  AILogModel,
176
+ TTSVoiceModel,
162
177
  AILogMongoRepository,
163
178
  AILogSqliteRepository,
179
+ TTSVoiceMongoRepository,
180
+ TTSVoiceSqliteRepository,
164
181
  OpenAiProviderFactory,
165
182
  GoogleAiProviderFactory,
166
183
  OllamaAiProviderFactory,
@@ -170,6 +187,7 @@ export {
170
187
  TTSProviderFactory,
171
188
  DraxAgentFactory,
172
189
  AILogServiceFactory,
190
+ TTSVoiceServiceFactory,
173
191
  OpenAiProvider,
174
192
  GoogleAiProvider,
175
193
  OllamaAiProvider,
@@ -180,6 +198,7 @@ export {
180
198
  //Service
181
199
  KnowledgeService,
182
200
  AILogService,
201
+ TTSVoiceService,
183
202
  TTSGenericService,
184
203
  PromptAudioService,
185
204
  //Permissions
@@ -187,18 +206,21 @@ export {
187
206
  AgentPermissions,
188
207
  AIPermissions,
189
208
  TTSPermissions,
209
+ TTSVoicePermissions,
190
210
  AgentSessionPermissions,
191
211
  //Controllers
192
212
  AILogController,
193
213
  AICrudController,
194
214
  AIGenericController,
195
215
  TTSGenericController,
216
+ TTSVoiceController,
196
217
  DraxAgentController,
197
218
  AgentSessionController,
198
219
  DraxAgent,
199
220
  AILogRoutes,
200
221
  AIRoutes,
201
222
  TTSRoutes,
223
+ TTSVoiceRoutes,
202
224
  DraxAgentRoutes,
203
225
  AgentSessionRoutes
204
226
  }
@@ -0,0 +1,20 @@
1
+ interface ITTSVoiceBase {
2
+ name: string
3
+ ttsProvider: 'ElevenLabs'
4
+ voiceId: string
5
+ model?: string
6
+ languageCode?: string
7
+ tenant?: any
8
+ user?: any
9
+ createdAt?: Date
10
+ updatedAt?: Date
11
+ }
12
+
13
+ interface ITTSVoice extends ITTSVoiceBase {
14
+ _id: string
15
+ }
16
+
17
+ export type {
18
+ ITTSVoiceBase,
19
+ ITTSVoice,
20
+ }
@@ -0,0 +1,8 @@
1
+ import type {ITTSVoice, ITTSVoiceBase} from './ITTSVoice'
2
+ import {IDraxCrudRepository} from "@drax/crud-share";
3
+
4
+ interface ITTSVoiceRepository extends IDraxCrudRepository<ITTSVoice, ITTSVoiceBase, ITTSVoiceBase> {
5
+
6
+ }
7
+
8
+ export {ITTSVoiceRepository}
@@ -0,0 +1,37 @@
1
+ import {mongoose} from '@drax/common-back';
2
+ import {PaginateModel} from "mongoose";
3
+ import uniqueValidator from 'mongoose-unique-validator';
4
+ import mongoosePaginate from 'mongoose-paginate-v2'
5
+ import type {ITTSVoice} from '../interfaces/ITTSVoice'
6
+
7
+ const TTSVoiceSchema = new mongoose.Schema<ITTSVoice>({
8
+ name: {type: String, required: true, index: true, unique: false},
9
+ ttsProvider: {type: String, enum: ['ElevenLabs'], required: true, index: true, unique: false},
10
+ voiceId: {type: String, required: true, index: true, unique: false},
11
+ model: {type: String, required: false, index: true, unique: false},
12
+ languageCode: {type: String, required: false, index: true, unique: false},
13
+ tenant: {type: mongoose.Schema.Types.ObjectId, ref: 'Tenant', required: false, index: true, unique: false},
14
+ user: {type: mongoose.Schema.Types.ObjectId, ref: 'User', required: false, index: true, unique: false}
15
+ }, {timestamps: true});
16
+
17
+ TTSVoiceSchema.index({ttsProvider: 1, voiceId: 1, tenant: 1}, {unique: true, sparse: true});
18
+ TTSVoiceSchema.plugin(uniqueValidator, {message: 'validation.unique'});
19
+ TTSVoiceSchema.plugin(mongoosePaginate);
20
+
21
+ TTSVoiceSchema.virtual("id").get(function () {
22
+ return this._id.toString();
23
+ });
24
+
25
+ TTSVoiceSchema.set('toJSON', {getters: true, virtuals: true});
26
+ TTSVoiceSchema.set('toObject', {getters: true, virtuals: true});
27
+
28
+ const MODEL_NAME = 'TTSVoice';
29
+ const COLLECTION_NAME = 'TTSVoice';
30
+ const TTSVoiceModel = mongoose.model<ITTSVoice, PaginateModel<ITTSVoice>>(MODEL_NAME, TTSVoiceSchema, COLLECTION_NAME);
31
+
32
+ export {
33
+ TTSVoiceSchema,
34
+ TTSVoiceModel
35
+ }
36
+
37
+ export default TTSVoiceModel
@@ -0,0 +1,12 @@
1
+ enum TTSVoicePermissions {
2
+
3
+ Create = "ttsvoice:create",
4
+ Update = "ttsvoice:update",
5
+ Delete = "ttsvoice:delete",
6
+ View = "ttsvoice:view",
7
+ Manage = "ttsvoice:manage"
8
+
9
+ }
10
+
11
+ export { TTSVoicePermissions };
12
+ export default TTSVoicePermissions;
@@ -0,0 +1,19 @@
1
+ import {AbstractMongoRepository} from "@drax/crud-back";
2
+ import {TTSVoiceModel} from "../../models/TTSVoiceModel.js";
3
+ import type {ITTSVoiceRepository} from '../../interfaces/ITTSVoiceRepository'
4
+ import type {ITTSVoice, ITTSVoiceBase} from "../../interfaces/ITTSVoice";
5
+
6
+ class TTSVoiceMongoRepository extends AbstractMongoRepository<ITTSVoice, ITTSVoiceBase, ITTSVoiceBase> implements ITTSVoiceRepository {
7
+
8
+ constructor() {
9
+ super();
10
+ this._model = TTSVoiceModel;
11
+ this._searchFields = ['name', 'ttsProvider', 'voiceId', 'model', 'languageCode'];
12
+ this._populateFields = ['tenant', 'user'];
13
+ this._lean = true
14
+ }
15
+
16
+ }
17
+
18
+ export default TTSVoiceMongoRepository
19
+ export {TTSVoiceMongoRepository}
@@ -0,0 +1,33 @@
1
+ import {AbstractSqliteRepository} from "@drax/crud-back";
2
+ import type {ITTSVoiceRepository} from '../../interfaces/ITTSVoiceRepository'
3
+ import type {ITTSVoice, ITTSVoiceBase} from "../../interfaces/ITTSVoice";
4
+ import {SqliteTableField} from "@drax/common-back";
5
+
6
+ class TTSVoiceSqliteRepository extends AbstractSqliteRepository<ITTSVoice, ITTSVoiceBase, ITTSVoiceBase> implements ITTSVoiceRepository {
7
+
8
+ protected db: any;
9
+ protected tableName: string = 'TTSVoice';
10
+ protected dataBaseFile: string;
11
+ protected searchFields: string[] = ['name', 'ttsProvider', 'voiceId', 'model', 'languageCode'];
12
+ protected booleanFields: string[] = [];
13
+ protected jsonFields: string[] = [];
14
+ protected identifier: string = '_id';
15
+ protected populateFields = [
16
+ {field: 'tenant', table: 'tenant', identifier: '_id'},
17
+ {field: 'user', table: 'user', identifier: '_id'}
18
+ ]
19
+ protected verbose: boolean = false;
20
+ protected tableFields: SqliteTableField[] = [
21
+ {name: "name", type: "TEXT", unique: false, primary: false},
22
+ {name: "ttsProvider", type: "TEXT", unique: false, primary: false},
23
+ {name: "voiceId", type: "TEXT", unique: false, primary: false},
24
+ {name: "model", type: "TEXT", unique: false, primary: false},
25
+ {name: "languageCode", type: "TEXT", unique: false, primary: false},
26
+ {name: "tenant", type: "TEXT", unique: false, primary: false},
27
+ {name: "user", type: "TEXT", unique: false, primary: false}
28
+ ]
29
+
30
+ }
31
+
32
+ export default TTSVoiceSqliteRepository
33
+ export {TTSVoiceSqliteRepository}
@@ -0,0 +1,26 @@
1
+ import TTSVoiceController from "../controllers/TTSVoiceController.js";
2
+ import {CrudSchemaBuilder} from "@drax/crud-back";
3
+ import {TTSVoiceSchema, TTSVoiceBaseSchema} from '../schemas/TTSVoiceSchema.js'
4
+
5
+ async function TTSVoiceRoutes(fastify, options) {
6
+
7
+ const controller: TTSVoiceController = new TTSVoiceController()
8
+ const schemas = new CrudSchemaBuilder(TTSVoiceSchema, TTSVoiceBaseSchema, TTSVoiceBaseSchema, 'TTSVoice', 'openapi-3.0', ['ai']);
9
+
10
+ fastify.get('/api/ttsvoice', {schema: schemas.paginateSchema}, (req, rep) => controller.paginate(req, rep))
11
+ fastify.get('/api/ttsvoice/find', {schema: schemas.findSchema}, (req, rep) => controller.find(req, rep))
12
+ fastify.get('/api/ttsvoice/search', {schema: schemas.searchSchema}, (req, rep) => controller.search(req, rep))
13
+ fastify.get('/api/ttsvoice/:id', {schema: schemas.findByIdSchema}, (req, rep) => controller.findById(req, rep))
14
+ fastify.get('/api/ttsvoice/find-one', {schema: schemas.findOneSchema}, (req, rep) => controller.findOne(req, rep))
15
+ fastify.get('/api/ttsvoice/group-by', {schema: schemas.groupBySchema}, (req, rep) => controller.groupBy(req, rep))
16
+ fastify.post('/api/ttsvoice', {schema: schemas.createSchema}, (req, rep) => controller.create(req, rep))
17
+ fastify.put('/api/ttsvoice/:id', {schema: schemas.updateSchema}, (req, rep) => controller.update(req, rep))
18
+ fastify.patch('/api/ttsvoice/:id', {schema: schemas.updateSchema}, (req, rep) => controller.updatePartial(req, rep))
19
+ fastify.delete('/api/ttsvoice/:id', {schema: schemas.deleteSchema}, (req, rep) => controller.delete(req, rep))
20
+ fastify.get('/api/ttsvoice/export', (req, rep) => controller.export(req, rep))
21
+ fastify.post('/api/ttsvoice/import', (req, rep) => controller.import(req, rep))
22
+
23
+ }
24
+
25
+ export default TTSVoiceRoutes;
26
+ export {TTSVoiceRoutes}