module.exports = { meta: { type: 'problem', docs: { description: 'Enforce that API controllers only call Use Cases or Application Services', category: 'Architecture', recommended: true, }, fixable: null, schema: [], messages: { forbiddenCall: 'Controllers should only call Use Cases or Application Services. Forbidden call to "{{name}}".', }, }, create(context) { return { ClassDeclaration(node) { const isController = node.decorators && node.decorators.some(d => d.expression.type === 'CallExpression' && d.expression.callee.name === 'Controller' ); if (!isController) return; // Check constructor for injected dependencies const constructor = node.body.body.find(m => m.kind === 'constructor'); if (constructor) { constructor.value.params.forEach(param => { if (param.type === 'TSParameterProperty') { const typeAnnotation = param.parameter.typeAnnotation; if (typeAnnotation && typeAnnotation.typeAnnotation.type === 'TSTypeReference') { const typeName = typeAnnotation.typeAnnotation.typeName.name; const isValidDependency = /UseCase$/.test(typeName) || /Service$/.test(typeName) || /Logger$/.test(typeName) || /Module$/.test(typeName); if (!isValidDependency) { context.report({ node: param, messageId: 'forbiddenCall', data: { name: typeName, }, }); } } } }); } }, }; }, };