@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.
- package/dist/controllers/TTSVoiceController.js +18 -0
- package/dist/factory/services/TTSVoiceServiceFactory.js +28 -0
- package/dist/index.js +13 -4
- package/dist/interfaces/ITTSVoice.js +1 -0
- package/dist/interfaces/ITTSVoiceRepository.js +1 -0
- package/dist/models/TTSVoiceModel.js +25 -0
- package/dist/permissions/TTSVoicePermissions.js +10 -0
- package/dist/repository/mongo/TTSVoiceMongoRepository.js +13 -0
- package/dist/repository/sqlite/TTSVoiceSqliteRepository.js +27 -0
- package/dist/routes/TTSVoiceRoutes.js +21 -0
- package/dist/schemas/TTSVoiceSchema.js +19 -0
- package/dist/services/TTSVoiceService.js +9 -0
- package/package.json +4 -4
- package/src/controllers/TTSVoiceController.ts +27 -0
- package/src/factory/services/TTSVoiceServiceFactory.ts +36 -0
- package/src/index.ts +22 -0
- package/src/interfaces/ITTSVoice.ts +20 -0
- package/src/interfaces/ITTSVoiceRepository.ts +8 -0
- package/src/models/TTSVoiceModel.ts +37 -0
- package/src/permissions/TTSVoicePermissions.ts +12 -0
- package/src/repository/mongo/TTSVoiceMongoRepository.ts +19 -0
- package/src/repository/sqlite/TTSVoiceSqliteRepository.ts +33 -0
- package/src/routes/TTSVoiceRoutes.ts +26 -0
- package/src/schemas/TTSVoiceSchema.ts +23 -0
- package/src/services/TTSVoiceService.ts +16 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/types/controllers/TTSVoiceController.d.ts +8 -0
- package/types/controllers/TTSVoiceController.d.ts.map +1 -0
- package/types/factory/services/TTSVoiceServiceFactory.d.ts +8 -0
- package/types/factory/services/TTSVoiceServiceFactory.d.ts.map +1 -0
- package/types/index.d.ts +12 -2
- package/types/index.d.ts.map +1 -1
- package/types/interfaces/ITTSVoice.d.ts +16 -0
- package/types/interfaces/ITTSVoice.d.ts.map +1 -0
- package/types/interfaces/ITTSVoiceRepository.d.ts +6 -0
- package/types/interfaces/ITTSVoiceRepository.d.ts.map +1 -0
- package/types/models/TTSVoiceModel.d.ts +15 -0
- package/types/models/TTSVoiceModel.d.ts.map +1 -0
- package/types/permissions/TTSVoicePermissions.d.ts +10 -0
- package/types/permissions/TTSVoicePermissions.d.ts.map +1 -0
- package/types/repository/mongo/TTSVoiceMongoRepository.d.ts +9 -0
- package/types/repository/mongo/TTSVoiceMongoRepository.d.ts.map +1 -0
- package/types/repository/sqlite/TTSVoiceSqliteRepository.d.ts +23 -0
- package/types/repository/sqlite/TTSVoiceSqliteRepository.d.ts.map +1 -0
- package/types/routes/TTSVoiceRoutes.d.ts +4 -0
- package/types/routes/TTSVoiceRoutes.d.ts.map +1 -0
- package/types/schemas/TTSVoiceSchema.d.ts +36 -0
- package/types/schemas/TTSVoiceSchema.d.ts.map +1 -0
- package/types/services/TTSVoiceService.d.ts +10 -0
- 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.
|
|
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.
|
|
22
|
-
"@drax/crud-back": "^3.
|
|
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": "
|
|
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,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,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}
|