*/ public function index(): array { $userId = auth()->id(); $user = auth()->user(); $query = PromptProject::with(['user', 'provider', 'model']) ->latest(); if (!$user || $user->role !== 'superadmin') { $query->where('user_id', $userId); } $paginator = $query->paginate(15); return [ 'data' => $paginator->items(), 'total' => $paginator->total(), 'per_page' => $paginator->perPage(), 'current_page' => $paginator->currentPage(), 'last_page' => $paginator->lastPage(), 'from' => $paginator->firstItem(), 'to' => $paginator->lastItem(), ]; } /** * Store a newly created resource in storage. */ public function store(array $data): PromptProject { $data['examples'] = $this->convertToArray($data['examples'] ?? null); $data['variables'] = $this->convertToArray($data['variables'] ?? null); return PromptProject::create($data); } /** * Update the specified resource in storage. */ public function update(PromptProject $project, array $data): PromptProject { $data['examples'] = $this->convertToArray($data['examples'] ?? null); $data['variables'] = $this->convertToArray($data['variables'] ?? null); $project->update($data); return $project; } /** * Convert string to array. */ private function convertToArray(mixed $value): ?array { if (is_array($value)) { return $value; } if (is_string($value)) { $value = trim($value); if ($value === '') { return null; } return array_map('trim', explode(',', $value)); } return null; } /** * Remove the specified resource from storage. */ public function destroy(PromptProject $project): bool { try { $project->delete(); return true; } catch (RuntimeException $e) { Log::error('Failed to delete prompt project: ' . $e->getMessage()); return false; } } /** * Generate prompt for the specified project. */ public function generate(PromptProject $project, mixed $model = null, ?int $userId = null): PromptGeneration { $provider = $project->provider; if (!$provider instanceof AiProvider) { throw new InvalidArgumentException('AI provider is required for generation.'); } if (!$model) { $model = $project->model; } if (!$model) { throw new InvalidArgumentException('AI model is required for generation.'); } if (is_string($model)) { $model = AiModel::firstOrCreate( ['provider_id' => $provider->id, 'slug' => $model], ['name' => $model, 'slug' => $model, 'is_active' => true] ); } $modelSlug = $model->slug; $modelId = $model->id; $userId ??= auth()->id(); $promptText = $this->buildPrompt($project); $aiData = [ 'prompt' => $promptText, 'temperature' => (float) ($project->temperature ?? 0.7), 'max_tokens' => (int) ($project->max_tokens ?? 1024), 'model' => $modelSlug, 'api_key' => $provider->api_key, 'base_url' => $provider->base_url, ]; $startTime = microtime(true); try { $service = $this->aiServiceFactory->make($provider); $result = $service->generatePrompt($aiData); } catch (ConnectionException|RuntimeException $e) { Log::error('Prompt generation failed: ' . $e->getMessage()); return $this->generationModel::create([ 'project_id' => $project->id, 'user_id' => $userId, 'provider_id' => $provider->id, 'model_id' => $modelId, 'generated_prompt' => $promptText, 'input_data' => $aiData, 'output_data' => ['error' => $e->getMessage()], 'tokens_used' => null, 'generation_time' => round(microtime(true) - $startTime, 3), 'status' => 'failed', ]); } return $this->generationModel::create([ 'project_id' => $project->id, 'user_id' => $userId, 'provider_id' => $provider->id, 'model_id' => $modelId, 'generated_prompt' => $promptText, 'input_data' => $aiData, 'output_data' => $result, 'tokens_used' => $result['tokens_used'] ?? null, 'generation_time' => round(microtime(true) - $startTime, 3), 'status' => 'completed', ]); } /** * Build the prompt text from project data. */ public function buildPrompt(PromptProject $project): string { $parts = []; $companyName = $project->company_name ?? $project->title; $parts[] = "Generate a complete, ready-to-use prompt in Portuguese that another AI or developer can follow to build the project described below. The generated prompt must be self-contained and include ALL specifications, design requirements, technical constraints, and code standards needed to build the project from scratch."; $parts[] = "IMPORTANT: Your output must be ONLY the prompt text in Portuguese. Do NOT include this instruction, do NOT wrap in markdown, do NOT add explanations — just output the prompt itself."; if ($project->company_name) { $parts[] = "Company Name: " . $project->company_name; } if ($project->company_address) { $parts[] = "Company Address: " . $project->company_address; } if ($project->company_whatsapp) { $parts[] = "Company WhatsApp: " . $project->company_whatsapp; } if ($project->company_website) { $parts[] = "Company Website: " . $project->company_website; } if ($project->company_social_media) { $parts[] = "Company Social Media: " . $project->company_social_media; } if ($project->company_business_activities) { $parts[] = "Company Business Activities: " . $project->company_business_activities; } if ($project->company_services_products) { $parts[] = "Company Services/Products: " . $project->company_services_products; } if ($project->objective) { $parts[] = "Objective: " . $project->objective; } if ($project->context) { $parts[] = "Context: " . $project->context; } if ($project->persona) { $parts[] = "Persona/Role: " . $project->persona; } if ($project->tone) { $parts[] = "Tone/Style: " . $project->tone; } if ($project->constraints) { $parts[] = "Constraints: " . $project->constraints; } if ($project->output_format) { $parts[] = "Output Format: " . $project->output_format; } if (!empty($project->examples)) { $parts[] = "Examples:\n" . json_encode($project->examples, JSON_PRETTY_PRINT); } if (!empty($project->variables)) { $parts[] = "Variables: " . json_encode($project->variables, JSON_PRETTY_PRINT); } $parts[] = "SYSTEM REQUIREMENTS (ALWAYS apply to every project):"; $parts[] = "- Fully responsive design (mobile-first, all screen sizes including smartphones)"; $parts[] = "- Use only MIT-licensed or permissive open-source icons, images, and dependencies that are safe for commercial use"; $parts[] = "- All password fields must include a toggle button (eye icon) to show/hide the password"; $parts[] = "- Complete SEO optimization: semantic HTML5, meta tags (title, description, keywords, OG tags for social media), structured data (JSON-LD), sitemap, robots.txt, aria labels, alt text on images, canonical URL, mobile-friendly validation"; $parts[] = "Generate the optimized prompt now. Return ONLY the prompt text, without explanations, introductions, or additional text."; return implode("\n\n", $parts); } /** * Generate LICENSE file content for the project. */ public function generateLicenseContent(PromptProject $project): string { $year = date('Y'); $company = $project->company_name ?? $project->title; return <<company_name ?? $project->title; $description = $project->objective ?? 'Sistema profissional'; $activities = $project->company_business_activities ?? ''; $services = $project->company_services_products ?? ''; $readme = "# {$company}\n\n"; $readme .= "## 📋 Descrição\n\n{$description}\n\n"; if ($activities) { $readme .= "## 🏢 Atividades\n\n{$activities}\n\n"; } if ($services) { $readme .= "## 🛠️ Serviços e Produtos\n\n{$services}\n\n"; } $readme .= "## 🚀 Tecnologias\n\n"; $readme .= "- HTML5 / CSS3 / JavaScript\n"; $readme .= "- Bootstrap 5\n"; $readme .= "- Font Awesome / Bootstrap Icons\n"; $readme .= "- Responsive Design\n\n"; $readme .= "## 📦 Instalação\n\n```bash\n"; $readme .= "# Clone o repositório\ngit clone https://github.com/seu-usuario/{$this->slugify($company)}.git\n\n"; $readme .= "# Acesse o diretório\ncd {$this->slugify($company)}\n"; $readme .= "```\n\n"; $readme .= "## ⚙️ Configuração\n\n"; $readme .= "1. Configure as variáveis de ambiente necessárias\n"; $readme .= "2. Ajuste as credenciais de banco de dados no arquivo de configuração\n"; $readme .= "3. Execute as migrações (se aplicável)\n\n"; $readme .= "## 🎯 Funcionalidades\n\n"; $readme .= "- Interface responsiva e moderna\n"; $readme .= "- Design otimizado para todos os dispositivos\n"; $readme .= "- Componentes reutilizáveis\n"; $readme .= "- Performance otimizada\n\n"; if ($project->company_website) { $readme .= "## 🌐 Website\n\n[{$project->company_website}]({$project->company_website})\n\n"; } $readme .= "## 📄 Licença\n\nEste projeto está licenciado sob a Licença MIT.\n\n"; $readme .= "## 📞 Contato\n\n"; if ($project->company_whatsapp) { $readme .= "- WhatsApp: {$project->company_whatsapp}\n"; } if ($project->company_social_media) { $readme .= "- Redes Sociais: {$project->company_social_media}\n"; } return $readme; } /** * Generate RULES.md content for the project. */ public function generateRulesContent(PromptProject $project): string { $company = $project->company_name ?? $project->title; $rules = "# Regras de Desenvolvimento - {$company}\n\n"; $rules .= "## 📐 Padrões de Código\n\n"; $rules .= "- Seguir PSR-12 (PHP) / Airbnb Style Guide (JavaScript)\n"; $rules .= "- Usar type hints em todos os métodos e parâmetros\n"; $rules .= "- Strict typing habilitado (declare(strict_types=1))\n"; $rules .= "- PHPDoc comments em métodos públicos\n"; $rules .= "- Sem uso de `var`, usar `private/protected/public`\n\n"; $rules .= "## 🏗️ Arquitetura\n\n"; $rules .= "- Seguir princípios SOLID\n"; $rules .= "- MVC Pattern com Service Layer\n"; $rules .= "- Repository Pattern para abstração de dados\n"; $rules .= "- Injeção de dependências\n\n"; $rules .= "## 🔒 Segurança\n\n"; $rules .= "- CSRF em todos os formulários\n"; $rules .= "- XSS: usar escaping automático, evitar `{!! !!}`\n"; $rules .= "- SQL Injection: usar ORM ou Query Builder com bindings\n"; $rules .= "- Mass Assignment: usar \$fillable ou \$guarded\n"; $rules .= "- Senhas: hash com bcrypt\n"; $rules .= "- Rate Limiting em formulários públicos\n\n"; $rules .= "## 🎨 Frontend\n\n"; $rules .= "- Bootstrap 5 com Bootstrap Icons\n"; $rules .= "- Design responsivo (mobile-first)\n"; $rules .= "- Breadcrumbs em todas as páginas\n"; $rules .= "- Sem CSS ou JS inline\n"; $rules .= "- Modern, clean design\n\n"; $rules .= "## 🧪 Testes\n\n"; $rules .= "- Testes unitários para Models e Services\n"; $rules .= "- Testes de feature para CRUD\n"; $rules .= "- Cobertura mínima de 80%\n\n"; $rules .= "## 🚫 Práticas Proibidas\n\n"; $rules .= "- `dd()`, `dump()`, `var_dump()` em produção\n"; $rules .= "- Comentários `TODO`, `FIXME`, `XXX`\n"; $rules .= "- URLs ou caminhos hardcoded\n"; $rules .= "- Magic numbers (definir constantes)\n"; $rules .= "- Código comentado\n\n"; $rules .= "## ⚡ Performance\n\n"; $rules .= "- Eager load relacionamentos (N+1 prevention)\n"; $rules .= "- Indexar foreign keys no banco\n"; $rules .= "- Cache de queries pesadas\n"; $rules .= "- Paginar datasets grandes\n"; $rules .= "- Otimizar assets (compressão, minificação)\n\n"; $rules .= "## 📖 Documentação\n\n"; $rules .= "- README.md com instruções de instalação e uso\n"; $rules .= "- Documentação técnica em markdown\n"; $rules .= "- CHANGELOG.md para versionamento\n"; return $rules; } /** * Generate cookies.html content (cookie consent banner in compliance with LGPD). */ public function generateCookieConsentContent(PromptProject $project): string { $company = $project->company_name ?? $project->title; return << Política de Cookies - {$company} EOT; } /** * Generate termos-de-uso.html content (Terms of Service compliant with Brazilian legislation). */ public function generateTermsContent(PromptProject $project): string { $company = $project->company_name ?? $project->title; $year = date('Y'); $activities = $project->company_business_activities ?? 'servicos de tecnologia'; return << Termos de Uso - {$company}

Termos de Uso - {$company}

Versao: 1.0 | Data: {$year}

1. Aceitacao dos Termos

Ao acessar e utilizar os servicos da {$company}, voce concorda em cumprir integralmente estes Termos de Uso. Caso nao concorde com qualquer disposicao deste documento, voce nao deve utilizar nossos servicos.

2. Descricao do Servico

A {$company} oferece {$activities}. Este documento estabelece as condicoes gerais de uso dos servicos disponibilizados.

3. Definicoes

  • Plataforma: sistema, site ou aplicativo fornecido pela {$company}
  • Usuario: pessoa fisica ou juridica que utiliza a plataforma
  • Conteudo: qualquer informacao, dado ou material inserido na plataforma
  • LGPD: Lei Geral de Protecao de Dados Pessoais (Lei no 13.709/2018)

4. Cadastro e Conta de Usuario

4.1. Para utilizar a plataforma, o usuario deve criar uma conta fornecendo informacoes precisas e atualizadas.

4.2. O usuario e integralmente responsavel pela confidencialidade de suas credenciais de acesso.

4.3. O usuario compromete-se a notificar imediatamente qualquer uso nao autorizado de sua conta.

5. Obrigacoes do Usuario

5.1. Utilizar a plataforma em conformidade com as leis brasileiras.

5.2. Nao realizar atividades que possam comprometer a seguranca da plataforma.

5.3. Nao inserir conteudo ilegal, ofensivo ou que viole direitos de terceiros.

6. Propriedade Intelectual

6.1. Todo o conteudo e funcionalidades da plataforma sao de propriedade da {$company}.

6.2. O conteudo gerado pelo usuario e de propriedade do usuario.

6.3. E proibida a engenharia reversa, descompilacao ou tentativa de extrair o codigo fonte.

7. Limitacao de Responsabilidade

7.1. A plataforma e fornecida "como esta", sem garantias de disponibilidade continua.

7.2. A {$company} nao se responsabiliza por danos decorrentes do uso ou da impossibilidade de uso da plataforma.

8. Privacidade e Protecao de Dados

8.1. O tratamento de dados pessoais segue integralmente a LGPD (Lei no 13.709/2018).

8.2. Os dados coletados sao utilizados exclusivamente para as finalidades descritas na Politica de Privacidade.

8.3. O usuario pode exercer seus direitos de titular de dados a qualquer momento.

9. Disposicoes Gerais

9.1. Estes termos podem ser alterados a qualquer momento, mediante comunicacao previa aos usuarios.

9.2. O uso continuado apos alteracoes constitui aceitacao dos novos termos.

9.3. Foro: Comarca de Sao Paulo/SP para eventuais controversias.

10. Contato

Para esclarecimentos sobre estes termos, entre em contato atraves dos canais oficiais da {$company}.

© {$year} {$company}. Todos os direitos reservados.

EOT; } /** * Generate privacidade.html content (Privacy Policy compliant with LGPD). */ public function generatePrivacyContent(PromptProject $project): string { $company = $project->company_name ?? $project->title; $year = date('Y'); return << Politica de Privacidade - {$company}

Politica de Privacidade - {$company} (LGPD)

Versao: 1.0 | Data: {$year}

1. Informacoes Gerais

Esta Politica de Privacidade descreve como a {$company} coleta, utiliza, armazena e protege os dados pessoais dos usuarios, em conformidade com a Lei Geral de Protecao de Dados Pessoais (LGPD - Lei no 13.709/2018).

2. Titular do Tratamento

{$company}

E-mail de contato disponivel no site oficial.

3. Dados Pessoais Coletados

3.1. Dados fornecidos pelo usuario:

  • Nome completo
  • Endereco de e-mail
  • Senha de acesso (armazenada com criptografia)
  • Informacoes de contato, quando fornecidas

3.2. Dados coletados automaticamente:

  • Endereco IP
  • Agente do navegador (user agent)
  • Preferencias de cookies
  • Dados de uso da plataforma
  • Data e hora das interacoes

4. Finalidades do Tratamento

  • Autenticacao e autorizacao de acesso
  • Prestacao dos servicos contratados
  • Comunicacoes sobre o servico
  • Seguranca e prevencao de fraudes
  • Cumprimento de obrigacoes legais
  • Melhoria continua dos servicos

5. Bases Legais para o Tratamento (LGPD - Art. 7o)

  • Consentimento do titular (Art. 7o, I)
  • Execucao de contrato (Art. 7o, V)
  • Cumprimento de obrigacao legal (Art. 7o, II)
  • Legitimo interesse (Art. 7o, IX)

6. Compartilhamento de Dados

6.1. Seus dados nao sao compartilhados com terceiros, exceto quando necessario para a prestacao dos servicos ou quando exigido por lei.

6.2. Nao vendemos dados pessoais a terceiros.

7. Armazenamento e Seguranca

7.1. Os dados sao armazenados em servidores seguros com acesso restrito.

7.2. Adotamos medidas tecnicas e organizacionais para proteger os dados contra acesso nao autorizado.

7.3. O periodo de armazenamento e o necessario para cumprir as finalidades descritas nesta politica.

8. Direitos do Titular (LGPD - Art. 18)

O titular dos dados tem direito a:

  • Confirmar a existencia de tratamento
  • Acessar seus dados pessoais
  • Corrigir dados incompletos ou desatualizados
  • Solicitar a eliminacao de dados desnecessarios
  • Solicitar a portabilidade dos dados
  • Revogar o consentimento a qualquer momento

9. Cookies

9.1. Utilizamos cookies necessarios para o funcionamento da plataforma.

9.2. Cookies opcionais (estatisticas, marketing, preferencias) dependem do seu consentimento.

9.3. Voce pode gerenciar suas preferencias de cookies atraves do banner de cookies.

10. Consentimento

Ao utilizar a plataforma, voce declara ter lido e compreendido esta Politica de Privacidade e autoriza o tratamento de seus dados conforme aqui descrito.

11. Alteracoes

Esta politica pode ser atualizada periodicamente. Alteracoes significativas serao comunicadas aos usuarios.

12. Contato e DPO

Para exercer seus direitos ou esclarecer duvidas sobre privacidade, entre em contato atraves dos canais oficiais da {$company}.

Prazo de resposta: ate 15 dias uteis (LGPD - Art. 19).

© {$year} {$company}. Todos os direitos reservados.

EOT; } /** * Get all standard files with their contents for the project. * * @return array */ public function getStandardFiles(PromptProject $project): array { return [ 'LICENSE' => $this->generateLicenseContent($project), 'README.md' => $this->generateReadmeContent($project), 'RULES.md' => $this->generateRulesContent($project), 'cookies.html' => $this->generateCookieConsentContent($project), 'termos-de-uso.html' => $this->generateTermsContent($project), 'privacidade.html' => $this->generatePrivacyContent($project), ]; } /** * Convert text to a URL-friendly slug. */ private function slugify(string $text): string { $text = preg_replace('/[^a-zA-Z0-9-]/', '-', $text); $text = preg_replace('/-+/', '-', $text); $text = trim($text, '-'); return strtolower($text); } }