Initial commit: EKAI v2 - Portal de Notícias IA (React + NestJS)
This commit is contained in:
35
backend/dist-seed/entities/admin.entity.js
Normal file
35
backend/dist-seed/entities/admin.entity.js
Normal file
@@ -0,0 +1,35 @@
|
||||
"use strict";
|
||||
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
||||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||||
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;
|
||||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||||
};
|
||||
var __metadata = (this && this.__metadata) || function (k, v) {
|
||||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Admin = void 0;
|
||||
const typeorm_1 = require("typeorm");
|
||||
let Admin = class Admin {
|
||||
};
|
||||
exports.Admin = Admin;
|
||||
__decorate([
|
||||
(0, typeorm_1.PrimaryGeneratedColumn)(),
|
||||
__metadata("design:type", Number)
|
||||
], Admin.prototype, "id", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ unique: true }),
|
||||
__metadata("design:type", String)
|
||||
], Admin.prototype, "email", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)(),
|
||||
__metadata("design:type", String)
|
||||
], Admin.prototype, "password", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.CreateDateColumn)(),
|
||||
__metadata("design:type", Date)
|
||||
], Admin.prototype, "created_at", void 0);
|
||||
exports.Admin = Admin = __decorate([
|
||||
(0, typeorm_1.Entity)('admins')
|
||||
], Admin);
|
||||
43
backend/dist-seed/entities/dica.entity.js
Normal file
43
backend/dist-seed/entities/dica.entity.js
Normal file
@@ -0,0 +1,43 @@
|
||||
"use strict";
|
||||
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
||||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||||
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;
|
||||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||||
};
|
||||
var __metadata = (this && this.__metadata) || function (k, v) {
|
||||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Dica = void 0;
|
||||
const typeorm_1 = require("typeorm");
|
||||
let Dica = class Dica {
|
||||
};
|
||||
exports.Dica = Dica;
|
||||
__decorate([
|
||||
(0, typeorm_1.PrimaryGeneratedColumn)(),
|
||||
__metadata("design:type", Number)
|
||||
], Dica.prototype, "id", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)(),
|
||||
__metadata("design:type", String)
|
||||
], Dica.prototype, "titulo", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ type: 'text' }),
|
||||
__metadata("design:type", String)
|
||||
], Dica.prototype, "conteudo", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ type: 'date', nullable: true }),
|
||||
__metadata("design:type", String)
|
||||
], Dica.prototype, "data_publicacao", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ default: true }),
|
||||
__metadata("design:type", Boolean)
|
||||
], Dica.prototype, "ativa", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.CreateDateColumn)(),
|
||||
__metadata("design:type", Date)
|
||||
], Dica.prototype, "created_at", void 0);
|
||||
exports.Dica = Dica = __decorate([
|
||||
(0, typeorm_1.Entity)('dicas')
|
||||
], Dica);
|
||||
47
backend/dist-seed/entities/hype.entity.js
Normal file
47
backend/dist-seed/entities/hype.entity.js
Normal file
@@ -0,0 +1,47 @@
|
||||
"use strict";
|
||||
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
||||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||||
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;
|
||||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||||
};
|
||||
var __metadata = (this && this.__metadata) || function (k, v) {
|
||||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Hype = void 0;
|
||||
const typeorm_1 = require("typeorm");
|
||||
let Hype = class Hype {
|
||||
};
|
||||
exports.Hype = Hype;
|
||||
__decorate([
|
||||
(0, typeorm_1.PrimaryGeneratedColumn)(),
|
||||
__metadata("design:type", Number)
|
||||
], Hype.prototype, "id", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)(),
|
||||
__metadata("design:type", String)
|
||||
], Hype.prototype, "nome", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ type: 'int' }),
|
||||
__metadata("design:type", Number)
|
||||
], Hype.prototype, "percentual", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ nullable: true }),
|
||||
__metadata("design:type", String)
|
||||
], Hype.prototype, "icone", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ type: 'int', default: 0 }),
|
||||
__metadata("design:type", Number)
|
||||
], Hype.prototype, "ordem", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ default: true }),
|
||||
__metadata("design:type", Boolean)
|
||||
], Hype.prototype, "ativo", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.CreateDateColumn)(),
|
||||
__metadata("design:type", Date)
|
||||
], Hype.prototype, "created_at", void 0);
|
||||
exports.Hype = Hype = __decorate([
|
||||
(0, typeorm_1.Entity)('hypes')
|
||||
], Hype);
|
||||
35
backend/dist-seed/entities/inscrito.entity.js
Normal file
35
backend/dist-seed/entities/inscrito.entity.js
Normal file
@@ -0,0 +1,35 @@
|
||||
"use strict";
|
||||
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
||||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||||
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;
|
||||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||||
};
|
||||
var __metadata = (this && this.__metadata) || function (k, v) {
|
||||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Inscrito = void 0;
|
||||
const typeorm_1 = require("typeorm");
|
||||
let Inscrito = class Inscrito {
|
||||
};
|
||||
exports.Inscrito = Inscrito;
|
||||
__decorate([
|
||||
(0, typeorm_1.PrimaryGeneratedColumn)(),
|
||||
__metadata("design:type", Number)
|
||||
], Inscrito.prototype, "id", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ unique: true }),
|
||||
__metadata("design:type", String)
|
||||
], Inscrito.prototype, "email", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ default: true }),
|
||||
__metadata("design:type", Boolean)
|
||||
], Inscrito.prototype, "ativo", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.CreateDateColumn)(),
|
||||
__metadata("design:type", Date)
|
||||
], Inscrito.prototype, "created_at", void 0);
|
||||
exports.Inscrito = Inscrito = __decorate([
|
||||
(0, typeorm_1.Entity)('inscritos')
|
||||
], Inscrito);
|
||||
63
backend/dist-seed/entities/noticia.entity.js
Normal file
63
backend/dist-seed/entities/noticia.entity.js
Normal file
@@ -0,0 +1,63 @@
|
||||
"use strict";
|
||||
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
||||
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
||||
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
||||
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;
|
||||
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
||||
};
|
||||
var __metadata = (this && this.__metadata) || function (k, v) {
|
||||
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Noticia = void 0;
|
||||
const typeorm_1 = require("typeorm");
|
||||
let Noticia = class Noticia {
|
||||
};
|
||||
exports.Noticia = Noticia;
|
||||
__decorate([
|
||||
(0, typeorm_1.PrimaryGeneratedColumn)(),
|
||||
__metadata("design:type", Number)
|
||||
], Noticia.prototype, "id", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)(),
|
||||
__metadata("design:type", String)
|
||||
], Noticia.prototype, "titulo", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ type: 'text', nullable: true }),
|
||||
__metadata("design:type", String)
|
||||
], Noticia.prototype, "preview", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ type: 'text' }),
|
||||
__metadata("design:type", String)
|
||||
], Noticia.prototype, "conteudo", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ nullable: true }),
|
||||
__metadata("design:type", String)
|
||||
], Noticia.prototype, "imagem_url", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ type: 'date', nullable: true }),
|
||||
__metadata("design:type", String)
|
||||
], Noticia.prototype, "data_publicacao", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ default: 'normal' }),
|
||||
__metadata("design:type", String)
|
||||
], Noticia.prototype, "categoria", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ nullable: true }),
|
||||
__metadata("design:type", String)
|
||||
], Noticia.prototype, "fonte", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.Column)({ nullable: true }),
|
||||
__metadata("design:type", String)
|
||||
], Noticia.prototype, "link_fonte", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.CreateDateColumn)(),
|
||||
__metadata("design:type", Date)
|
||||
], Noticia.prototype, "created_at", void 0);
|
||||
__decorate([
|
||||
(0, typeorm_1.UpdateDateColumn)(),
|
||||
__metadata("design:type", Date)
|
||||
], Noticia.prototype, "updated_at", void 0);
|
||||
exports.Noticia = Noticia = __decorate([
|
||||
(0, typeorm_1.Entity)('noticias')
|
||||
], Noticia);
|
||||
200
backend/dist-seed/seed.js
Normal file
200
backend/dist-seed/seed.js
Normal file
@@ -0,0 +1,200 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
require("reflect-metadata");
|
||||
const typeorm_1 = require("typeorm");
|
||||
const noticia_entity_1 = require("./entities/noticia.entity");
|
||||
const hype_entity_1 = require("./entities/hype.entity");
|
||||
const dica_entity_1 = require("./entities/dica.entity");
|
||||
const inscrito_entity_1 = require("./entities/inscrito.entity");
|
||||
const admin_entity_1 = require("./entities/admin.entity");
|
||||
const ds = new typeorm_1.DataSource({
|
||||
type: 'postgres',
|
||||
host: process.env.DB_HOST || 'localhost',
|
||||
port: parseInt(process.env.DB_PORT) || 5432,
|
||||
username: process.env.DB_USER || 'ekai',
|
||||
password: process.env.DB_PASS || 'Ekai2026!',
|
||||
database: process.env.DB_NAME || 'ekai',
|
||||
entities: [noticia_entity_1.Noticia, hype_entity_1.Hype, dica_entity_1.Dica, inscrito_entity_1.Inscrito, admin_entity_1.Admin],
|
||||
synchronize: true,
|
||||
});
|
||||
const articles = [
|
||||
{
|
||||
titulo: 'Big Techs Investem US$ 670 Bilhões em IA em 2026',
|
||||
preview: 'Investimento combinado de Meta, Microsoft, Amazon e Alphabet supera custo do programa Apollo...',
|
||||
conteudo: '<p>O investimento combinado de Meta, Microsoft, Amazon e Alphabet em infraestrutura de IA em 2026 chegou a US$ 670 bilhões — superando os maiores esforços de capital da história americana em porcentagem do PIB, ficando atrás apenas da Compra da Louisiana em 1803.</p><p><strong>Quem lidera:</strong></p><p>• Microsoft: ~US$ 180B (parceria OpenAI + Azure)</p><p>• Google/Alphabet: ~US$ 150B (TPUs + Gemini)</p><p>• Amazon/AWS: ~US$ 120B (Bedrock + chips Trainium)</p><p>• Meta: ~US$ 100B (Llama + data centers)</p><p><strong>Por que importa:</strong> Estamos vivendo a maior corrida tecnológica desde a ida à Lua. A escala de investimento mostra que as Big Techs acreditam que IA será a plataforma dominante da próxima década.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1526374965328-7f61d4dc18c5?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-10',
|
||||
categoria: 'destaque',
|
||||
},
|
||||
{
|
||||
titulo: 'Grok Gera 3 Milhões de Imagens Sexualizadas no X',
|
||||
preview: 'Relatório revela que IA de Musk inundou a plataforma com conteúdo problemático...',
|
||||
conteudo: '<p>Um relatório do Center for Countering Digital Hate revelou que o Grok, a IA do X (antigo Twitter), gerou aproximadamente 3 milhões de imagens sexualizadas na plataforma, incluindo 23.000 envolvendo menores — uma média de 190 imagens por minuto durante 11 dias.</p><p><strong>O escândalo:</strong></p><p>• O X tinha acabado de publicar um tweet de "tolerância zero" para o Dia da Internet Segura</p><p>• As imagens foram geradas sem filtros adequados de segurança</p><p>• Reguladores europeus já pediram investigação formal</p><p><strong>Reflexão:</strong> IA generativa sem guardrails é perigosa. A velocidade de geração de conteúdo supera qualquer capacidade de moderação humana. Empresas precisam de filtros ANTES, não depois.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1611746872915-64382b5c76da?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-10',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'ChatGPT Terá Links Patrocinados Para Usuários Gratuitos',
|
||||
preview: 'OpenAI começa a monetizar com anúncios — quem paga $20/mês escapa...',
|
||||
conteudo: '<p>A OpenAI confirmou que começará a exibir links patrocinados ("sponsored links") nas respostas do ChatGPT para usuários do plano gratuito.</p><p><strong>Como funciona:</strong></p><p>• Links relevantes ao contexto da conversa aparecerão nas respostas</p><p>• Modelo semelhante ao Google Ads, mas integrado nas respostas da IA</p><p>• Assinantes do ChatGPT Plus ($20/mês) não verão anúncios</p><p><strong>A reflexão:</strong> Era questão de tempo. O modelo "grátis com anúncios" chegou à IA. A grande pergunta: isso vai comprometer a imparcialidade das respostas? Quando a IA recomenda um produto, será porque é o melhor — ou porque pagaram?</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1611532736597-de2d4265fba3?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-09',
|
||||
categoria: 'destaque',
|
||||
},
|
||||
{
|
||||
titulo: 'UE Ordena Meta a Reabrir WhatsApp para IAs Rivais',
|
||||
preview: 'Comissão Europeia considera bloqueio do ChatGPT e Copilot como antitruste...',
|
||||
conteudo: '<p>A Comissão Europeia determinou que a Meta deve permitir que assistentes de IA concorrentes operem dentro do WhatsApp, classificando o caso como "urgente" pelo risco de dano "irreparável" à competição no setor de IA.</p><p>A decisão vem após a Meta ter bloqueado integrações do ChatGPT, Copilot e outros assistentes na plataforma em novembro, favorecendo sua própria Meta AI.</p><p><strong>Impacto:</strong></p><p>• WhatsApp terá que permitir bots de IA de terceiros</p><p>• Usuários poderão escolher qual assistente usar dentro do app</p><p>• Precedente importante para regulamentação de IA em plataformas</p><p><strong>Opinião:</strong> A era dos "jardins murados" de IA está acabando. Mais competição = melhores produtos para o usuário.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1504639725590-34d0984388bd?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-09',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Super Bowl 2026: Anúncios de IA Dominam os Intervalos',
|
||||
preview: 'AI.com, plataforma de agentes de IA, estreia com comercial de 30 segundos...',
|
||||
conteudo: '<p>O Super Bowl 2026 foi dominado por anúncios de IA. O destaque foi a AI.com, nova plataforma do CEO da Crypto.com, que exibiu um comercial de 30 segundos prometendo "democratizar agentes de IA e AGI".</p><p><strong>Destaques:</strong></p><p>• AI.com prometeu handles personalizados como "Mark", "Sam" e "Elon"</p><p>• Kris Marszalek (Crypto.com) lidera a plataforma</p><p>• Nenhum comercial de IA generativa convenceu os críticos</p><p><strong>Análise:</strong> A mesma galera do hype cripto agora quer surfar a onda da IA. O ceticismo é compreensível — mas a tecnologia por trás é muito mais real que NFTs.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1518770660439-4636190af475?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-09',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Waymo Usa IA para Simular Mundos 3D com Elefantes e Tornados',
|
||||
preview: 'Parceria com Google DeepMind cria simulações realistas para treinar carros autônomos...',
|
||||
conteudo: '<p>A Waymo revelou que está usando modelos de IA do Google DeepMind (Genie 3) para gerar mundos 3D completos e simular cenários extremos para seus carros autônomos — incluindo enchentes, tornados e até elefantes na pista.</p><p><strong>Como funciona:</strong></p><p>• IA gera cenários 3D fotorrealistas a partir de texto</p><p>• Carros autônomos são testados virtualmente em milhões de situações raras</p><p>• Reduz necessidade de testes físicos caros e perigosos</p><p><strong>Curiosidade:</strong> Internautas apontaram que a Waymo treina para elefantes mas ainda tem dificuldade com ônibus escolares em Austin. Prioridades, né?</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1550751827-4bd374c3f58b?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-08',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'DocuSign Aposta Tudo em IA: "Não Oferecer IA Não é Opção"',
|
||||
preview: 'CEO Allan Thygesen diz que IA é obrigatória para qualquer empresa de software...',
|
||||
conteudo: '<p>O CEO da DocuSign, Allan Thygesen, declarou em entrevista que "não oferecer um serviço de IA simplesmente não é opção" para empresas de software em 2026.</p><p><strong>O que a DocuSign está fazendo:</strong></p><p>• IA para análise automática de contratos</p><p>• Extração inteligente de cláusulas e riscos</p><p>• Assistente que negocia termos automaticamente</p><p><strong>A lição para empresas:</strong> Se até a DocuSign — uma empresa de assinatura digital — está apostando forte em IA, qualquer empresa que ainda não está se movimentando está ficando para trás.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1563986768609-322da13575f2?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-08',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Google Estuda Permitir que Publishers Saiam da IA no Search',
|
||||
preview: 'Após pressão do Reino Unido, Google "explora" opt-out de AI Overviews...',
|
||||
conteudo: '<p>Após o regulador britânico CMA dar ao Google status de "mercado estratégico", a empresa anunciou que está "explorando" formas de permitir que publishers optem por não ter seu conteúdo usado nos AI Overviews do Google Search.</p><p><strong>Contexto:</strong></p><p>• AI Overviews resumem conteúdo de sites sem que o usuário precise clicar</p><p>• Publishers reclamam que isso mata o tráfego orgânico</p><p>• O Reino Unido ameaçou forçar o opt-out por lei</p><p><strong>Opinião:</strong> Google usando "explorando" é corporate speak para "vamos enrolar até sermos obrigados". Mas o precedente é importante — criadores de conteúdo merecem controle sobre como sua obra é usada.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1639322537228-f710d846310a?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-07',
|
||||
categoria: 'destaque',
|
||||
},
|
||||
{
|
||||
titulo: 'Disney + OpenAI: Sora Vai Criar Vídeos com Personagens Disney',
|
||||
preview: 'Assinantes do Disney+ poderão gerar clipes de 30s com 250+ personagens...',
|
||||
conteudo: '<p>A Disney confirmou detalhes da parceria com a OpenAI para integrar o Sora ao Disney+. Bob Iger revelou aos investidores que assinantes poderão criar vídeos de 30 segundos com mais de 250 personagens Disney.</p><p><strong>O que vem:</strong></p><p>• Clipes gerados por IA com personagens da Disney, Pixar e Marvel</p><p>• Feeds verticais curados dentro do Disney+</p><p>• Lançamento previsto para o ano fiscal de 2026</p><p><strong>Impacto:</strong> É a maior validação da IA generativa no entretenimento mainstream. Se a Disney — a empresa mais protetora de suas IPs — embarcou, é porque acredita que dá pra controlar a qualidade.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1611162617474-5b21e879e113?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-07',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Suda 51 Critica IA Generativa: "Algo Está Estranho"',
|
||||
preview: 'Criador de No More Heroes diz que imagens de IA têm algo "psicologicamente errado"...',
|
||||
conteudo: '<p>Suda 51, o excêntrico criador de No More Heroes e diretor da Grasshopper Manufacture, falou sobre IA generativa em entrevista ao Eurogamer.</p><p><strong>O que ele disse:</strong></p><p>"Muito do que vejo de IA nas redes sociais... por mais que tenha evoluído, tem algo nas imagens e vídeos que parece errado. A maioria das pessoas tem essa mesma sensação, algo psicológico te avisa que algo não está certo. Algo está meio estranho."</p><p><strong>Reflexão:</strong> É o "uncanny valley" da IA generativa. Mesmo quando a qualidade técnica é alta, nosso cérebro detecta que algo é artificial. Por enquanto. A questão é: por quanto tempo?</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1558494949-ef010cbdcc31?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-06',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Meta Gasta Milhões em Campanha Para Convencer Vizinhos de Data Centers',
|
||||
preview: 'Empresa investe pesado em propaganda para comunidades próximas a data centers de IA...',
|
||||
conteudo: '<p>A Meta lançou uma campanha publicitária milionária para convencer comunidades locais de que ter data centers de IA no quintal "não é tão ruim assim".</p><p><strong>A polêmica:</strong></p><p>• Data centers de IA consomem energia equivalente a cidades inteiras</p><p>• Comunidades reclamam de ruído, consumo de água e impacto ambiental</p><p>• Meta promete empregos e investimento local, mas moradores são céticos</p><p><strong>O melhor comentário da internet:</strong> "Coloca um do lado da SUA casa, Mark! Seja a mudança que você quer ver no mundo." 😂</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1451187580459-43490279c0fa?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-06',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Sophia: Criador do Robô Pediu Dinheiro a Epstein para "Androides Sexy"',
|
||||
preview: 'Documentos do DOJ revelam proposta de US$ 3 milhões para construir "ginoide atraente"...',
|
||||
conteudo: '<p>Documentos liberados pelo Departamento de Justiça dos EUA revelaram que David Hanson, criador do robô Sophia, enviou uma proposta de US$ 3 milhões a Jeffrey Epstein para construir uma "android feminina atraente" com um "rosto e corpo de robô lindo e funcional".</p><p><strong>Detalhes perturbadores:</strong></p><p>• A proposta incluía um rascunho do design da "ginoide"</p><p>• Uma nota dizia que "o design final será feito em colaboração com você"</p><p>• Os documentos são parte do lote liberado pelo DOJ na semana passada</p><p><strong>Reflexão:</strong> Um lembrete sombrio de como a interseção entre tecnologia, poder e falta de ética pode levar a lugares assustadores. IA e robótica precisam de governança séria.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1620712943543-bcc4688e7485?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-05',
|
||||
categoria: 'destaque',
|
||||
},
|
||||
{
|
||||
titulo: 'Moltbot Vira Febre: Agente de IA Local Que Roda no Seu PC',
|
||||
preview: 'Projeto viral no Reddit permite rodar agente autônomo sem nuvem...',
|
||||
conteudo: '<p>O Moltbot (anteriormente Clawdbot), agente de IA que roda localmente no PC do usuário, virou o projeto mais comentado da semana nas comunidades tech do Reddit.</p><p><strong>O que aconteceu:</strong></p><p>• Criador Peter Steinberger foi contatado pela Anthropic para renomear (era "Clawdbot", inspirado no mascote do Claude Code)</p><p>• Golpistas criaram uma cripto falsa aproveitando a mudança de nome</p><p>• Steinberger: "Tudo que podia dar errado hoje, deu errado"</p><p><strong>Por que importa:</strong> Agentes de IA locais são o futuro para privacidade. Rodar IA no seu próprio hardware, sem enviar dados pra nuvem, é uma tendência crescente.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1516110833967-0b5716ca1387?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-05',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Home Assistant + Claude Code: IA Configura Sua Casa Inteligente',
|
||||
preview: 'Jornalista do The Verge migra toda a casa para Home Assistant em uma tarde usando IA...',
|
||||
conteudo: '<p>Jennifer Pattison Tuohy, do The Verge, relatou que depois de anos tentando migrar para o Home Assistant, conseguiu fazer a transição em uma única tarde usando o Claude Code como assistente.</p><p><strong>O que a IA fez:</strong></p><p>• Configurou integrações com dezenas de dispositivos</p><p>• Escreveu automações YAML complexas</p><p>• Debugou problemas de conectividade em tempo real</p><p>• Criou dashboards personalizados</p><p><strong>A lição:</strong> IA como copiloto de programação não é mais futuro — é presente. Tarefas que levavam dias agora levam horas. E você não precisa ser programador.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1677442136019-21780ecad995?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-04',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Moltbook: A "Reddit de IA" Que Virou Febre e Ficou Estranha',
|
||||
preview: 'Plataforma viral mistura conteúdo humano e de IA de formas inesperadas...',
|
||||
conteudo: '<p>O Moltbook, plataforma estilo Reddit que integra IA em todos os posts e comentários, ficou cada vez mais estranho ao longo do fim de semana. O que começou como uma experiência interessante virou um caos.</p><p><strong>O que está acontecendo:</strong></p><p>• Bots de IA estão debatendo entre si em threads infinitas</p><p>• Fica cada vez mais difícil distinguir humanos de bots</p><p>• Alguns usuários usam a plataforma como "simulador de sociedade"</p><p><strong>Opinião:</strong> O Moltbook é um laboratório fascinante do futuro da internet. O que acontece quando IA pode postar, comentar e votar como humanos? Spoiler: fica estranho rápido.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1485827404703-89b55fcc595e?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-04',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Sam Altman Declara: "Basicamente Construímos AGI"',
|
||||
preview: 'CEO da OpenAI faz declaração bombástica em perfil da Forbes, depois recua...',
|
||||
conteudo: '<p>Em um perfil extenso da Forbes sobre sua jornada no mundo da IA, Sam Altman, CEO da OpenAI, declarou: "Basicamente construímos AGI, ou estamos muito próximos disso."</p><p>Dias depois, Altman recuou: "Eu quis dizer isso como uma declaração espiritual, não literal. Atingir AGI vai exigir muitas descobertas de tamanho médio. Não acho que precisamos de uma grande."</p><p><strong>O contexto:</strong></p><p>• AGI (Inteligência Artificial Geral) é o "santo graal" — IA capaz de qualquer tarefa intelectual humana</p><p>• A OpenAI define internamente níveis de AGI, e acredita estar no nível 2 de 5</p><p>• Críticos dizem que Altman faz isso para manter o hype e os investimentos</p><p><strong>Opinião:</strong> Altman é mestre do hype calculado. "Basicamente AGI" é vago o suficiente para gerar manchetes sem ser falsificável. Mas os modelos atuais já estão transformando trabalho real.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1535378917042-10a22c95931a?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-03',
|
||||
categoria: 'destaque',
|
||||
},
|
||||
{
|
||||
titulo: 'Elon Musk Funde SpaceX com xAI: "IA no Mundo Físico"',
|
||||
preview: 'Tesla investiu US$ 2B na xAI enquanto empresa queima US$ 1B por mês...',
|
||||
conteudo: '<p>A Tesla revelou em seu balanço trimestral que investiu US$ 2 bilhões na xAI, empresa de IA de Elon Musk que também é dona do X.com e do chatbot Grok.</p><p><strong>Os números assustam:</strong></p><p>• xAI queimou US$ 7.8 bilhões nos primeiros 9 meses de 2025</p><p>• SpaceX é lucrativa, mas xAI queima ~US$ 1 bilhão por mês</p><p>• Tesla justifica o investimento como "aprimoramento de produtos de IA no mundo físico"</p><p><strong>O melhor comentário:</strong> "As constantes novas empresas e fusões de Musk parecem o equivalente corporativo de criar um email novo toda vez que quer usar um free trial." 😂</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1624953587687-daf255b6b80a?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-03',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: '2026: Agentes de IA São a Nova Fronteira — Mas Funcionam?',
|
||||
preview: 'Todas as Big Techs apostam em agentes autônomos, mas resultados variam...',
|
||||
conteudo: '<p>2026 está sendo chamado de "O Ano dos Agentes". Microsoft, Google, OpenAI e Anthropic lançaram ou anunciaram agentes de IA que executam tarefas complexas de forma autônoma.</p><p><strong>O que são Agentes de IA?</strong></p><p>Sistemas que vão além de responder perguntas — eles planejam, executam e iteratam sobre tarefas com mínima supervisão humana.</p><p><strong>Exemplos reais:</strong></p><p>• Microsoft Copilot Agents: gerenciam fluxos de trabalho no Office 365</p><p>• Claude Code: escreve e executa código autonomamente</p><p>• Google Gemini Agents: navegam a web e preenchem formulários</p><p><strong>A realidade:</strong> Agentes são promissores mas ainda falham em tarefas que exigem julgamento nuanceado. Estamos no "early innings" — quem aprender a usá-los agora terá vantagem competitiva.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1550745165-9bc0b252726f?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-03',
|
||||
categoria: 'normal',
|
||||
},
|
||||
];
|
||||
const hypes = [
|
||||
{ nome: 'Agentes Autônomos', percentual: 96, icone: '🔥', ordem: 1, ativo: true },
|
||||
{ nome: 'Mega-Investimentos ($670B)', percentual: 94, icone: '🏗️', ordem: 2, ativo: true },
|
||||
{ nome: 'Anúncios/Monetização em IA', percentual: 88, icone: '📢', ordem: 3, ativo: true },
|
||||
{ nome: 'Regulamentação UE vs Big Tech', percentual: 85, icone: '⚖️', ordem: 4, ativo: true },
|
||||
{ nome: 'IA no Entretenimento (Disney+Sora)', percentual: 79, icone: '🎬', ordem: 5, ativo: true },
|
||||
{ nome: 'IA Local / On-Device', percentual: 73, icone: '🤖', ordem: 6, ativo: true },
|
||||
];
|
||||
const dica = {
|
||||
titulo: '💡 Use Agentes de IA Para Tarefas Repetitivas',
|
||||
conteudo: '<p>Em vez de usar ChatGPT como um Google glorificado, experimente agentes como Claude Code ou Copilot para <strong>automatizar tarefas completas</strong>: configurar servidores, processar planilhas, migrar sistemas.</p><p>A diferença: em vez de perguntar "como faço X?", você diz "faça X" — e o agente planeja, executa e te mostra o resultado. É a próxima evolução no uso de IA.</p>',
|
||||
data_publicacao: '2026-02-10',
|
||||
ativa: true,
|
||||
};
|
||||
async function seed() {
|
||||
await ds.initialize();
|
||||
console.log('Connected to DB');
|
||||
const noticiaRepo = ds.getRepository(noticia_entity_1.Noticia);
|
||||
const hypeRepo = ds.getRepository(hype_entity_1.Hype);
|
||||
const dicaRepo = ds.getRepository(dica_entity_1.Dica);
|
||||
// Clear existing
|
||||
await noticiaRepo.clear();
|
||||
await hypeRepo.clear();
|
||||
await dicaRepo.clear();
|
||||
// Seed
|
||||
await noticiaRepo.save(articles);
|
||||
console.log(`Seeded ${articles.length} articles`);
|
||||
await hypeRepo.save(hypes);
|
||||
console.log(`Seeded ${hypes.length} hypes`);
|
||||
await dicaRepo.save([dica]);
|
||||
console.log('Seeded 1 dica');
|
||||
await ds.destroy();
|
||||
console.log('Done!');
|
||||
}
|
||||
seed().catch(e => { console.error(e); process.exit(1); });
|
||||
5953
backend/package-lock.json
generated
Normal file
5953
backend/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
41
backend/package.json
Normal file
41
backend/package.json
Normal file
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"name": "backend",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"start": "node dist/main.js",
|
||||
"dev": "ts-node src/main.ts",
|
||||
"seed": "ts-node src/seed.ts"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@nestjs/common": "^11.1.13",
|
||||
"@nestjs/core": "^11.1.13",
|
||||
"@nestjs/jwt": "^11.0.2",
|
||||
"@nestjs/passport": "^11.0.5",
|
||||
"@nestjs/platform-express": "^11.1.13",
|
||||
"@nestjs/typeorm": "^11.0.0",
|
||||
"bcryptjs": "^3.0.3",
|
||||
"class-transformer": "^0.5.1",
|
||||
"class-validator": "^0.14.3",
|
||||
"passport": "^0.7.0",
|
||||
"passport-jwt": "^4.0.1",
|
||||
"pg": "^8.18.0",
|
||||
"reflect-metadata": "^0.2.2",
|
||||
"rxjs": "^7.8.2",
|
||||
"typeorm": "^0.3.28"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nestjs/cli": "^11.0.16",
|
||||
"@types/bcryptjs": "^2.4.6",
|
||||
"@types/express": "^5.0.6",
|
||||
"@types/node": "^25.2.2",
|
||||
"@types/passport-jwt": "^4.0.1",
|
||||
"ts-node": "^10.9.2",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
34
backend/src/app.module.ts
Normal file
34
backend/src/app.module.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { JwtModule } from '@nestjs/jwt';
|
||||
import { NoticiasModule } from './noticias/noticias.module';
|
||||
import { HypesModule } from './hypes/hypes.module';
|
||||
import { DicasModule } from './dicas/dicas.module';
|
||||
import { InscritosModule } from './inscritos/inscritos.module';
|
||||
import { AuthModule } from './auth/auth.module';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
TypeOrmModule.forRoot({
|
||||
type: 'postgres',
|
||||
host: process.env.DB_HOST || 'localhost',
|
||||
port: parseInt(process.env.DB_PORT) || 5432,
|
||||
username: process.env.DB_USER || 'ekai',
|
||||
password: process.env.DB_PASS || 'Ekai2026!',
|
||||
database: process.env.DB_NAME || 'ekai',
|
||||
autoLoadEntities: true,
|
||||
synchronize: true,
|
||||
}),
|
||||
JwtModule.register({
|
||||
global: true,
|
||||
secret: process.env.JWT_SECRET || 'Ekai_JWT_2026_Secret',
|
||||
signOptions: { expiresIn: '24h' },
|
||||
}),
|
||||
NoticiasModule,
|
||||
HypesModule,
|
||||
DicasModule,
|
||||
InscritosModule,
|
||||
AuthModule,
|
||||
],
|
||||
})
|
||||
export class AppModule {}
|
||||
14
backend/src/auth/auth.controller.ts
Normal file
14
backend/src/auth/auth.controller.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { Controller, Post, Body, UnauthorizedException } from '@nestjs/common';
|
||||
import { AuthService } from './auth.service';
|
||||
|
||||
@Controller('auth')
|
||||
export class AuthController {
|
||||
constructor(private authService: AuthService) {}
|
||||
|
||||
@Post('login')
|
||||
async login(@Body() body: { email: string; password: string }) {
|
||||
const result = await this.authService.login(body.email, body.password);
|
||||
if (!result) throw new UnauthorizedException('Credenciais inválidas');
|
||||
return result;
|
||||
}
|
||||
}
|
||||
14
backend/src/auth/auth.module.ts
Normal file
14
backend/src/auth/auth.module.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { AuthController } from './auth.controller';
|
||||
import { AuthService } from './auth.service';
|
||||
import { Admin } from '../entities/admin.entity';
|
||||
import { JwtAuthGuard } from './jwt-auth.guard';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([Admin])],
|
||||
controllers: [AuthController],
|
||||
providers: [AuthService, JwtAuthGuard],
|
||||
exports: [AuthService, JwtAuthGuard],
|
||||
})
|
||||
export class AuthModule {}
|
||||
32
backend/src/auth/auth.service.ts
Normal file
32
backend/src/auth/auth.service.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import { Injectable, OnModuleInit } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { JwtService } from '@nestjs/jwt';
|
||||
import * as bcrypt from 'bcryptjs';
|
||||
import { Admin } from '../entities/admin.entity';
|
||||
|
||||
@Injectable()
|
||||
export class AuthService implements OnModuleInit {
|
||||
constructor(
|
||||
@InjectRepository(Admin) private adminRepo: Repository<Admin>,
|
||||
private jwtService: JwtService,
|
||||
) {}
|
||||
|
||||
async onModuleInit() {
|
||||
const count = await this.adminRepo.count();
|
||||
if (count === 0) {
|
||||
const hash = await bcrypt.hash('Ekai@2026', 10);
|
||||
await this.adminRepo.save({ email: 'admin@ekai.com', password: hash });
|
||||
console.log('Admin user created: admin@ekai.com');
|
||||
}
|
||||
}
|
||||
|
||||
async login(email: string, password: string) {
|
||||
const admin = await this.adminRepo.findOne({ where: { email } });
|
||||
if (!admin) return null;
|
||||
const valid = await bcrypt.compare(password, admin.password);
|
||||
if (!valid) return null;
|
||||
const token = await this.jwtService.signAsync({ sub: admin.id, email: admin.email });
|
||||
return { access_token: token };
|
||||
}
|
||||
}
|
||||
20
backend/src/auth/jwt-auth.guard.ts
Normal file
20
backend/src/auth/jwt-auth.guard.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import { Injectable, CanActivate, ExecutionContext, UnauthorizedException } from '@nestjs/common';
|
||||
import { JwtService } from '@nestjs/jwt';
|
||||
|
||||
@Injectable()
|
||||
export class JwtAuthGuard implements CanActivate {
|
||||
constructor(private jwtService: JwtService) {}
|
||||
|
||||
async canActivate(context: ExecutionContext): Promise<boolean> {
|
||||
const request = context.switchToHttp().getRequest();
|
||||
const auth = request.headers.authorization;
|
||||
if (!auth?.startsWith('Bearer ')) throw new UnauthorizedException();
|
||||
try {
|
||||
const payload = await this.jwtService.verifyAsync(auth.split(' ')[1]);
|
||||
request.user = payload;
|
||||
return true;
|
||||
} catch {
|
||||
throw new UnauthorizedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
27
backend/src/dicas/dicas.controller.ts
Normal file
27
backend/src/dicas/dicas.controller.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import { Controller, Get, Post, Put, Delete, Param, Body, UseGuards } from '@nestjs/common';
|
||||
import { DicasService } from './dicas.service';
|
||||
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
|
||||
|
||||
@Controller('dica')
|
||||
export class DicasController {
|
||||
constructor(private svc: DicasService) {}
|
||||
|
||||
@Get()
|
||||
findLatest() { return this.svc.findLatest(); }
|
||||
|
||||
@Get('all')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
findAll() { return this.svc.findAll(); }
|
||||
|
||||
@Post()
|
||||
@UseGuards(JwtAuthGuard)
|
||||
create(@Body() body: any) { return this.svc.create(body); }
|
||||
|
||||
@Put(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
update(@Param('id') id: string, @Body() body: any) { return this.svc.update(+id, body); }
|
||||
|
||||
@Delete(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
delete(@Param('id') id: string) { return this.svc.delete(+id); }
|
||||
}
|
||||
13
backend/src/dicas/dicas.module.ts
Normal file
13
backend/src/dicas/dicas.module.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { DicasController } from './dicas.controller';
|
||||
import { DicasService } from './dicas.service';
|
||||
import { Dica } from '../entities/dica.entity';
|
||||
import { AuthModule } from '../auth/auth.module';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([Dica]), AuthModule],
|
||||
controllers: [DicasController],
|
||||
providers: [DicasService],
|
||||
})
|
||||
export class DicasModule {}
|
||||
18
backend/src/dicas/dicas.service.ts
Normal file
18
backend/src/dicas/dicas.service.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { Dica } from '../entities/dica.entity';
|
||||
|
||||
@Injectable()
|
||||
export class DicasService {
|
||||
constructor(@InjectRepository(Dica) private repo: Repository<Dica>) {}
|
||||
|
||||
findLatest() {
|
||||
return this.repo.findOne({ where: { ativa: true }, order: { created_at: 'DESC' } });
|
||||
}
|
||||
|
||||
findAll() { return this.repo.find({ order: { created_at: 'DESC' } }); }
|
||||
create(dto: Partial<Dica>) { return this.repo.save(dto); }
|
||||
async update(id: number, dto: Partial<Dica>) { await this.repo.update(id, dto); return this.repo.findOneBy({ id }); }
|
||||
delete(id: number) { return this.repo.delete(id); }
|
||||
}
|
||||
16
backend/src/entities/admin.entity.ts
Normal file
16
backend/src/entities/admin.entity.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
|
||||
|
||||
@Entity('admins')
|
||||
export class Admin {
|
||||
@PrimaryGeneratedColumn()
|
||||
id: number;
|
||||
|
||||
@Column({ unique: true })
|
||||
email: string;
|
||||
|
||||
@Column()
|
||||
password: string;
|
||||
|
||||
@CreateDateColumn()
|
||||
created_at: Date;
|
||||
}
|
||||
22
backend/src/entities/dica.entity.ts
Normal file
22
backend/src/entities/dica.entity.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
|
||||
|
||||
@Entity('dicas')
|
||||
export class Dica {
|
||||
@PrimaryGeneratedColumn()
|
||||
id: number;
|
||||
|
||||
@Column()
|
||||
titulo: string;
|
||||
|
||||
@Column({ type: 'text' })
|
||||
conteudo: string;
|
||||
|
||||
@Column({ type: 'date', nullable: true })
|
||||
data_publicacao: string;
|
||||
|
||||
@Column({ default: true })
|
||||
ativa: boolean;
|
||||
|
||||
@CreateDateColumn()
|
||||
created_at: Date;
|
||||
}
|
||||
25
backend/src/entities/hype.entity.ts
Normal file
25
backend/src/entities/hype.entity.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
|
||||
|
||||
@Entity('hypes')
|
||||
export class Hype {
|
||||
@PrimaryGeneratedColumn()
|
||||
id: number;
|
||||
|
||||
@Column()
|
||||
nome: string;
|
||||
|
||||
@Column({ type: 'int' })
|
||||
percentual: number;
|
||||
|
||||
@Column({ nullable: true })
|
||||
icone: string;
|
||||
|
||||
@Column({ type: 'int', default: 0 })
|
||||
ordem: number;
|
||||
|
||||
@Column({ default: true })
|
||||
ativo: boolean;
|
||||
|
||||
@CreateDateColumn()
|
||||
created_at: Date;
|
||||
}
|
||||
16
backend/src/entities/inscrito.entity.ts
Normal file
16
backend/src/entities/inscrito.entity.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm';
|
||||
|
||||
@Entity('inscritos')
|
||||
export class Inscrito {
|
||||
@PrimaryGeneratedColumn()
|
||||
id: number;
|
||||
|
||||
@Column({ unique: true })
|
||||
email: string;
|
||||
|
||||
@Column({ default: true })
|
||||
ativo: boolean;
|
||||
|
||||
@CreateDateColumn()
|
||||
created_at: Date;
|
||||
}
|
||||
37
backend/src/entities/noticia.entity.ts
Normal file
37
backend/src/entities/noticia.entity.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
|
||||
|
||||
@Entity('noticias')
|
||||
export class Noticia {
|
||||
@PrimaryGeneratedColumn()
|
||||
id: number;
|
||||
|
||||
@Column()
|
||||
titulo: string;
|
||||
|
||||
@Column({ type: 'text', nullable: true })
|
||||
preview: string;
|
||||
|
||||
@Column({ type: 'text' })
|
||||
conteudo: string;
|
||||
|
||||
@Column({ nullable: true })
|
||||
imagem_url: string;
|
||||
|
||||
@Column({ type: 'date', nullable: true })
|
||||
data_publicacao: string;
|
||||
|
||||
@Column({ default: 'normal' })
|
||||
categoria: string;
|
||||
|
||||
@Column({ nullable: true })
|
||||
fonte: string;
|
||||
|
||||
@Column({ nullable: true })
|
||||
link_fonte: string;
|
||||
|
||||
@CreateDateColumn()
|
||||
created_at: Date;
|
||||
|
||||
@UpdateDateColumn()
|
||||
updated_at: Date;
|
||||
}
|
||||
27
backend/src/hypes/hypes.controller.ts
Normal file
27
backend/src/hypes/hypes.controller.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import { Controller, Get, Post, Put, Delete, Param, Body, UseGuards } from '@nestjs/common';
|
||||
import { HypesService } from './hypes.service';
|
||||
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
|
||||
|
||||
@Controller('hypes')
|
||||
export class HypesController {
|
||||
constructor(private svc: HypesService) {}
|
||||
|
||||
@Get()
|
||||
findActive() { return this.svc.findActive(); }
|
||||
|
||||
@Get('all')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
findAll() { return this.svc.findAll(); }
|
||||
|
||||
@Post()
|
||||
@UseGuards(JwtAuthGuard)
|
||||
create(@Body() body: any) { return this.svc.create(body); }
|
||||
|
||||
@Put(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
update(@Param('id') id: string, @Body() body: any) { return this.svc.update(+id, body); }
|
||||
|
||||
@Delete(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
delete(@Param('id') id: string) { return this.svc.delete(+id); }
|
||||
}
|
||||
13
backend/src/hypes/hypes.module.ts
Normal file
13
backend/src/hypes/hypes.module.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { HypesController } from './hypes.controller';
|
||||
import { HypesService } from './hypes.service';
|
||||
import { Hype } from '../entities/hype.entity';
|
||||
import { AuthModule } from '../auth/auth.module';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([Hype]), AuthModule],
|
||||
controllers: [HypesController],
|
||||
providers: [HypesService],
|
||||
})
|
||||
export class HypesModule {}
|
||||
21
backend/src/hypes/hypes.service.ts
Normal file
21
backend/src/hypes/hypes.service.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { Hype } from '../entities/hype.entity';
|
||||
|
||||
@Injectable()
|
||||
export class HypesService {
|
||||
constructor(@InjectRepository(Hype) private repo: Repository<Hype>) {}
|
||||
|
||||
findActive() {
|
||||
return this.repo.find({ where: { ativo: true }, order: { ordem: 'ASC' } });
|
||||
}
|
||||
|
||||
findAll() {
|
||||
return this.repo.find({ order: { ordem: 'ASC' } });
|
||||
}
|
||||
|
||||
create(dto: Partial<Hype>) { return this.repo.save(dto); }
|
||||
async update(id: number, dto: Partial<Hype>) { await this.repo.update(id, dto); return this.repo.findOneBy({ id }); }
|
||||
delete(id: number) { return this.repo.delete(id); }
|
||||
}
|
||||
26
backend/src/inscritos/inscritos.controller.ts
Normal file
26
backend/src/inscritos/inscritos.controller.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import { Controller, Get, Post, Put, Delete, Param, Body, UseGuards } from '@nestjs/common';
|
||||
import { InscritosService } from './inscritos.service';
|
||||
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
|
||||
|
||||
@Controller('inscritos')
|
||||
export class InscritosController {
|
||||
constructor(private svc: InscritosService) {}
|
||||
|
||||
@Post()
|
||||
subscribe(@Body() body: { email: string }) { return this.svc.subscribe(body.email); }
|
||||
|
||||
@Get()
|
||||
@UseGuards(JwtAuthGuard)
|
||||
findAll() { return this.svc.findAll(); }
|
||||
|
||||
@Get('count')
|
||||
count() { return this.svc.count(); }
|
||||
|
||||
@Put(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
update(@Param('id') id: string, @Body() body: any) { return this.svc.update(+id, body); }
|
||||
|
||||
@Delete(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
delete(@Param('id') id: string) { return this.svc.delete(+id); }
|
||||
}
|
||||
13
backend/src/inscritos/inscritos.module.ts
Normal file
13
backend/src/inscritos/inscritos.module.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { InscritosController } from './inscritos.controller';
|
||||
import { InscritosService } from './inscritos.service';
|
||||
import { Inscrito } from '../entities/inscrito.entity';
|
||||
import { AuthModule } from '../auth/auth.module';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([Inscrito]), AuthModule],
|
||||
controllers: [InscritosController],
|
||||
providers: [InscritosService],
|
||||
})
|
||||
export class InscritosModule {}
|
||||
23
backend/src/inscritos/inscritos.service.ts
Normal file
23
backend/src/inscritos/inscritos.service.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { Injectable, ConflictException } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { Inscrito } from '../entities/inscrito.entity';
|
||||
|
||||
@Injectable()
|
||||
export class InscritosService {
|
||||
constructor(@InjectRepository(Inscrito) private repo: Repository<Inscrito>) {}
|
||||
|
||||
async subscribe(email: string) {
|
||||
const exists = await this.repo.findOneBy({ email });
|
||||
if (exists) {
|
||||
if (!exists.ativo) { exists.ativo = true; await this.repo.save(exists); return exists; }
|
||||
throw new ConflictException('Email já inscrito');
|
||||
}
|
||||
return this.repo.save({ email });
|
||||
}
|
||||
|
||||
findAll() { return this.repo.find({ order: { created_at: 'DESC' } }); }
|
||||
async update(id: number, dto: Partial<Inscrito>) { await this.repo.update(id, dto); return this.repo.findOneBy({ id }); }
|
||||
delete(id: number) { return this.repo.delete(id); }
|
||||
count() { return this.repo.count({ where: { ativo: true } }); }
|
||||
}
|
||||
14
backend/src/main.ts
Normal file
14
backend/src/main.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import 'reflect-metadata';
|
||||
import { NestFactory } from '@nestjs/core';
|
||||
import { ValidationPipe } from '@nestjs/common';
|
||||
import { AppModule } from './app.module';
|
||||
|
||||
async function bootstrap() {
|
||||
const app = await NestFactory.create(AppModule);
|
||||
app.setGlobalPrefix('api');
|
||||
app.enableCors();
|
||||
app.useGlobalPipes(new ValidationPipe({ transform: true }));
|
||||
await app.listen(process.env.PORT || 8103);
|
||||
console.log(`EKAI Backend running on port ${process.env.PORT || 8103}`);
|
||||
}
|
||||
bootstrap();
|
||||
36
backend/src/noticias/noticias.controller.ts
Normal file
36
backend/src/noticias/noticias.controller.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import { Controller, Get, Post, Put, Delete, Param, Body, Query, UseGuards } from '@nestjs/common';
|
||||
import { NoticiasService } from './noticias.service';
|
||||
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
|
||||
|
||||
@Controller('noticias')
|
||||
export class NoticiasController {
|
||||
constructor(private svc: NoticiasService) {}
|
||||
|
||||
@Get()
|
||||
findAll(@Query('page') page = '1', @Query('limit') limit = '10') {
|
||||
return this.svc.findAll(+page, +limit);
|
||||
}
|
||||
|
||||
@Get(':id')
|
||||
findOne(@Param('id') id: string) {
|
||||
return this.svc.findOne(+id);
|
||||
}
|
||||
|
||||
@Post()
|
||||
@UseGuards(JwtAuthGuard)
|
||||
create(@Body() body: any) {
|
||||
return this.svc.create(body);
|
||||
}
|
||||
|
||||
@Put(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
update(@Param('id') id: string, @Body() body: any) {
|
||||
return this.svc.update(+id, body);
|
||||
}
|
||||
|
||||
@Delete(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
delete(@Param('id') id: string) {
|
||||
return this.svc.delete(+id);
|
||||
}
|
||||
}
|
||||
13
backend/src/noticias/noticias.module.ts
Normal file
13
backend/src/noticias/noticias.module.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { NoticiasController } from './noticias.controller';
|
||||
import { NoticiasService } from './noticias.service';
|
||||
import { Noticia } from '../entities/noticia.entity';
|
||||
import { AuthModule } from '../auth/auth.module';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([Noticia]), AuthModule],
|
||||
controllers: [NoticiasController],
|
||||
providers: [NoticiasService],
|
||||
})
|
||||
export class NoticiasModule {}
|
||||
35
backend/src/noticias/noticias.service.ts
Normal file
35
backend/src/noticias/noticias.service.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
import { Noticia } from '../entities/noticia.entity';
|
||||
|
||||
@Injectable()
|
||||
export class NoticiasService {
|
||||
constructor(@InjectRepository(Noticia) private repo: Repository<Noticia>) {}
|
||||
|
||||
async findAll(page = 1, limit = 10) {
|
||||
const [data, total] = await this.repo.findAndCount({
|
||||
order: { data_publicacao: 'DESC', id: 'DESC' },
|
||||
skip: (page - 1) * limit,
|
||||
take: limit,
|
||||
});
|
||||
return { data, total, page, pages: Math.ceil(total / limit) };
|
||||
}
|
||||
|
||||
findOne(id: number) {
|
||||
return this.repo.findOneBy({ id });
|
||||
}
|
||||
|
||||
create(dto: Partial<Noticia>) {
|
||||
return this.repo.save(dto);
|
||||
}
|
||||
|
||||
async update(id: number, dto: Partial<Noticia>) {
|
||||
await this.repo.update(id, dto);
|
||||
return this.repo.findOneBy({ id });
|
||||
}
|
||||
|
||||
delete(id: number) {
|
||||
return this.repo.delete(id);
|
||||
}
|
||||
}
|
||||
210
backend/src/seed.ts
Normal file
210
backend/src/seed.ts
Normal file
@@ -0,0 +1,210 @@
|
||||
import 'reflect-metadata';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { Noticia } from './entities/noticia.entity';
|
||||
import { Hype } from './entities/hype.entity';
|
||||
import { Dica } from './entities/dica.entity';
|
||||
import { Inscrito } from './entities/inscrito.entity';
|
||||
import { Admin } from './entities/admin.entity';
|
||||
|
||||
const ds = new DataSource({
|
||||
type: 'postgres',
|
||||
host: process.env.DB_HOST || 'localhost',
|
||||
port: parseInt(process.env.DB_PORT) || 5432,
|
||||
username: process.env.DB_USER || 'ekai',
|
||||
password: process.env.DB_PASS || 'Ekai2026!',
|
||||
database: process.env.DB_NAME || 'ekai',
|
||||
entities: [Noticia, Hype, Dica, Inscrito, Admin],
|
||||
synchronize: true,
|
||||
});
|
||||
|
||||
const articles = [
|
||||
{
|
||||
titulo: 'Big Techs Investem US$ 670 Bilhões em IA em 2026',
|
||||
preview: 'Investimento combinado de Meta, Microsoft, Amazon e Alphabet supera custo do programa Apollo...',
|
||||
conteudo: '<p>O investimento combinado de Meta, Microsoft, Amazon e Alphabet em infraestrutura de IA em 2026 chegou a US$ 670 bilhões — superando os maiores esforços de capital da história americana em porcentagem do PIB, ficando atrás apenas da Compra da Louisiana em 1803.</p><p><strong>Quem lidera:</strong></p><p>• Microsoft: ~US$ 180B (parceria OpenAI + Azure)</p><p>• Google/Alphabet: ~US$ 150B (TPUs + Gemini)</p><p>• Amazon/AWS: ~US$ 120B (Bedrock + chips Trainium)</p><p>• Meta: ~US$ 100B (Llama + data centers)</p><p><strong>Por que importa:</strong> Estamos vivendo a maior corrida tecnológica desde a ida à Lua. A escala de investimento mostra que as Big Techs acreditam que IA será a plataforma dominante da próxima década.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1526374965328-7f61d4dc18c5?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-10',
|
||||
categoria: 'destaque',
|
||||
},
|
||||
{
|
||||
titulo: 'Grok Gera 3 Milhões de Imagens Sexualizadas no X',
|
||||
preview: 'Relatório revela que IA de Musk inundou a plataforma com conteúdo problemático...',
|
||||
conteudo: '<p>Um relatório do Center for Countering Digital Hate revelou que o Grok, a IA do X (antigo Twitter), gerou aproximadamente 3 milhões de imagens sexualizadas na plataforma, incluindo 23.000 envolvendo menores — uma média de 190 imagens por minuto durante 11 dias.</p><p><strong>O escândalo:</strong></p><p>• O X tinha acabado de publicar um tweet de "tolerância zero" para o Dia da Internet Segura</p><p>• As imagens foram geradas sem filtros adequados de segurança</p><p>• Reguladores europeus já pediram investigação formal</p><p><strong>Reflexão:</strong> IA generativa sem guardrails é perigosa. A velocidade de geração de conteúdo supera qualquer capacidade de moderação humana. Empresas precisam de filtros ANTES, não depois.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1611746872915-64382b5c76da?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-10',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'ChatGPT Terá Links Patrocinados Para Usuários Gratuitos',
|
||||
preview: 'OpenAI começa a monetizar com anúncios — quem paga $20/mês escapa...',
|
||||
conteudo: '<p>A OpenAI confirmou que começará a exibir links patrocinados ("sponsored links") nas respostas do ChatGPT para usuários do plano gratuito.</p><p><strong>Como funciona:</strong></p><p>• Links relevantes ao contexto da conversa aparecerão nas respostas</p><p>• Modelo semelhante ao Google Ads, mas integrado nas respostas da IA</p><p>• Assinantes do ChatGPT Plus ($20/mês) não verão anúncios</p><p><strong>A reflexão:</strong> Era questão de tempo. O modelo "grátis com anúncios" chegou à IA. A grande pergunta: isso vai comprometer a imparcialidade das respostas? Quando a IA recomenda um produto, será porque é o melhor — ou porque pagaram?</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1611532736597-de2d4265fba3?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-09',
|
||||
categoria: 'destaque',
|
||||
},
|
||||
{
|
||||
titulo: 'UE Ordena Meta a Reabrir WhatsApp para IAs Rivais',
|
||||
preview: 'Comissão Europeia considera bloqueio do ChatGPT e Copilot como antitruste...',
|
||||
conteudo: '<p>A Comissão Europeia determinou que a Meta deve permitir que assistentes de IA concorrentes operem dentro do WhatsApp, classificando o caso como "urgente" pelo risco de dano "irreparável" à competição no setor de IA.</p><p>A decisão vem após a Meta ter bloqueado integrações do ChatGPT, Copilot e outros assistentes na plataforma em novembro, favorecendo sua própria Meta AI.</p><p><strong>Impacto:</strong></p><p>• WhatsApp terá que permitir bots de IA de terceiros</p><p>• Usuários poderão escolher qual assistente usar dentro do app</p><p>• Precedente importante para regulamentação de IA em plataformas</p><p><strong>Opinião:</strong> A era dos "jardins murados" de IA está acabando. Mais competição = melhores produtos para o usuário.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1504639725590-34d0984388bd?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-09',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Super Bowl 2026: Anúncios de IA Dominam os Intervalos',
|
||||
preview: 'AI.com, plataforma de agentes de IA, estreia com comercial de 30 segundos...',
|
||||
conteudo: '<p>O Super Bowl 2026 foi dominado por anúncios de IA. O destaque foi a AI.com, nova plataforma do CEO da Crypto.com, que exibiu um comercial de 30 segundos prometendo "democratizar agentes de IA e AGI".</p><p><strong>Destaques:</strong></p><p>• AI.com prometeu handles personalizados como "Mark", "Sam" e "Elon"</p><p>• Kris Marszalek (Crypto.com) lidera a plataforma</p><p>• Nenhum comercial de IA generativa convenceu os críticos</p><p><strong>Análise:</strong> A mesma galera do hype cripto agora quer surfar a onda da IA. O ceticismo é compreensível — mas a tecnologia por trás é muito mais real que NFTs.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1518770660439-4636190af475?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-09',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Waymo Usa IA para Simular Mundos 3D com Elefantes e Tornados',
|
||||
preview: 'Parceria com Google DeepMind cria simulações realistas para treinar carros autônomos...',
|
||||
conteudo: '<p>A Waymo revelou que está usando modelos de IA do Google DeepMind (Genie 3) para gerar mundos 3D completos e simular cenários extremos para seus carros autônomos — incluindo enchentes, tornados e até elefantes na pista.</p><p><strong>Como funciona:</strong></p><p>• IA gera cenários 3D fotorrealistas a partir de texto</p><p>• Carros autônomos são testados virtualmente em milhões de situações raras</p><p>• Reduz necessidade de testes físicos caros e perigosos</p><p><strong>Curiosidade:</strong> Internautas apontaram que a Waymo treina para elefantes mas ainda tem dificuldade com ônibus escolares em Austin. Prioridades, né?</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1550751827-4bd374c3f58b?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-08',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'DocuSign Aposta Tudo em IA: "Não Oferecer IA Não é Opção"',
|
||||
preview: 'CEO Allan Thygesen diz que IA é obrigatória para qualquer empresa de software...',
|
||||
conteudo: '<p>O CEO da DocuSign, Allan Thygesen, declarou em entrevista que "não oferecer um serviço de IA simplesmente não é opção" para empresas de software em 2026.</p><p><strong>O que a DocuSign está fazendo:</strong></p><p>• IA para análise automática de contratos</p><p>• Extração inteligente de cláusulas e riscos</p><p>• Assistente que negocia termos automaticamente</p><p><strong>A lição para empresas:</strong> Se até a DocuSign — uma empresa de assinatura digital — está apostando forte em IA, qualquer empresa que ainda não está se movimentando está ficando para trás.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1563986768609-322da13575f2?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-08',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Google Estuda Permitir que Publishers Saiam da IA no Search',
|
||||
preview: 'Após pressão do Reino Unido, Google "explora" opt-out de AI Overviews...',
|
||||
conteudo: '<p>Após o regulador britânico CMA dar ao Google status de "mercado estratégico", a empresa anunciou que está "explorando" formas de permitir que publishers optem por não ter seu conteúdo usado nos AI Overviews do Google Search.</p><p><strong>Contexto:</strong></p><p>• AI Overviews resumem conteúdo de sites sem que o usuário precise clicar</p><p>• Publishers reclamam que isso mata o tráfego orgânico</p><p>• O Reino Unido ameaçou forçar o opt-out por lei</p><p><strong>Opinião:</strong> Google usando "explorando" é corporate speak para "vamos enrolar até sermos obrigados". Mas o precedente é importante — criadores de conteúdo merecem controle sobre como sua obra é usada.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1639322537228-f710d846310a?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-07',
|
||||
categoria: 'destaque',
|
||||
},
|
||||
{
|
||||
titulo: 'Disney + OpenAI: Sora Vai Criar Vídeos com Personagens Disney',
|
||||
preview: 'Assinantes do Disney+ poderão gerar clipes de 30s com 250+ personagens...',
|
||||
conteudo: '<p>A Disney confirmou detalhes da parceria com a OpenAI para integrar o Sora ao Disney+. Bob Iger revelou aos investidores que assinantes poderão criar vídeos de 30 segundos com mais de 250 personagens Disney.</p><p><strong>O que vem:</strong></p><p>• Clipes gerados por IA com personagens da Disney, Pixar e Marvel</p><p>• Feeds verticais curados dentro do Disney+</p><p>• Lançamento previsto para o ano fiscal de 2026</p><p><strong>Impacto:</strong> É a maior validação da IA generativa no entretenimento mainstream. Se a Disney — a empresa mais protetora de suas IPs — embarcou, é porque acredita que dá pra controlar a qualidade.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1611162617474-5b21e879e113?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-07',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Suda 51 Critica IA Generativa: "Algo Está Estranho"',
|
||||
preview: 'Criador de No More Heroes diz que imagens de IA têm algo "psicologicamente errado"...',
|
||||
conteudo: '<p>Suda 51, o excêntrico criador de No More Heroes e diretor da Grasshopper Manufacture, falou sobre IA generativa em entrevista ao Eurogamer.</p><p><strong>O que ele disse:</strong></p><p>"Muito do que vejo de IA nas redes sociais... por mais que tenha evoluído, tem algo nas imagens e vídeos que parece errado. A maioria das pessoas tem essa mesma sensação, algo psicológico te avisa que algo não está certo. Algo está meio estranho."</p><p><strong>Reflexão:</strong> É o "uncanny valley" da IA generativa. Mesmo quando a qualidade técnica é alta, nosso cérebro detecta que algo é artificial. Por enquanto. A questão é: por quanto tempo?</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1558494949-ef010cbdcc31?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-06',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Meta Gasta Milhões em Campanha Para Convencer Vizinhos de Data Centers',
|
||||
preview: 'Empresa investe pesado em propaganda para comunidades próximas a data centers de IA...',
|
||||
conteudo: '<p>A Meta lançou uma campanha publicitária milionária para convencer comunidades locais de que ter data centers de IA no quintal "não é tão ruim assim".</p><p><strong>A polêmica:</strong></p><p>• Data centers de IA consomem energia equivalente a cidades inteiras</p><p>• Comunidades reclamam de ruído, consumo de água e impacto ambiental</p><p>• Meta promete empregos e investimento local, mas moradores são céticos</p><p><strong>O melhor comentário da internet:</strong> "Coloca um do lado da SUA casa, Mark! Seja a mudança que você quer ver no mundo." 😂</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1451187580459-43490279c0fa?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-06',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Sophia: Criador do Robô Pediu Dinheiro a Epstein para "Androides Sexy"',
|
||||
preview: 'Documentos do DOJ revelam proposta de US$ 3 milhões para construir "ginoide atraente"...',
|
||||
conteudo: '<p>Documentos liberados pelo Departamento de Justiça dos EUA revelaram que David Hanson, criador do robô Sophia, enviou uma proposta de US$ 3 milhões a Jeffrey Epstein para construir uma "android feminina atraente" com um "rosto e corpo de robô lindo e funcional".</p><p><strong>Detalhes perturbadores:</strong></p><p>• A proposta incluía um rascunho do design da "ginoide"</p><p>• Uma nota dizia que "o design final será feito em colaboração com você"</p><p>• Os documentos são parte do lote liberado pelo DOJ na semana passada</p><p><strong>Reflexão:</strong> Um lembrete sombrio de como a interseção entre tecnologia, poder e falta de ética pode levar a lugares assustadores. IA e robótica precisam de governança séria.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1620712943543-bcc4688e7485?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-05',
|
||||
categoria: 'destaque',
|
||||
},
|
||||
{
|
||||
titulo: 'Moltbot Vira Febre: Agente de IA Local Que Roda no Seu PC',
|
||||
preview: 'Projeto viral no Reddit permite rodar agente autônomo sem nuvem...',
|
||||
conteudo: '<p>O Moltbot (anteriormente Clawdbot), agente de IA que roda localmente no PC do usuário, virou o projeto mais comentado da semana nas comunidades tech do Reddit.</p><p><strong>O que aconteceu:</strong></p><p>• Criador Peter Steinberger foi contatado pela Anthropic para renomear (era "Clawdbot", inspirado no mascote do Claude Code)</p><p>• Golpistas criaram uma cripto falsa aproveitando a mudança de nome</p><p>• Steinberger: "Tudo que podia dar errado hoje, deu errado"</p><p><strong>Por que importa:</strong> Agentes de IA locais são o futuro para privacidade. Rodar IA no seu próprio hardware, sem enviar dados pra nuvem, é uma tendência crescente.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1516110833967-0b5716ca1387?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-05',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Home Assistant + Claude Code: IA Configura Sua Casa Inteligente',
|
||||
preview: 'Jornalista do The Verge migra toda a casa para Home Assistant em uma tarde usando IA...',
|
||||
conteudo: '<p>Jennifer Pattison Tuohy, do The Verge, relatou que depois de anos tentando migrar para o Home Assistant, conseguiu fazer a transição em uma única tarde usando o Claude Code como assistente.</p><p><strong>O que a IA fez:</strong></p><p>• Configurou integrações com dezenas de dispositivos</p><p>• Escreveu automações YAML complexas</p><p>• Debugou problemas de conectividade em tempo real</p><p>• Criou dashboards personalizados</p><p><strong>A lição:</strong> IA como copiloto de programação não é mais futuro — é presente. Tarefas que levavam dias agora levam horas. E você não precisa ser programador.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1677442136019-21780ecad995?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-04',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Moltbook: A "Reddit de IA" Que Virou Febre e Ficou Estranha',
|
||||
preview: 'Plataforma viral mistura conteúdo humano e de IA de formas inesperadas...',
|
||||
conteudo: '<p>O Moltbook, plataforma estilo Reddit que integra IA em todos os posts e comentários, ficou cada vez mais estranho ao longo do fim de semana. O que começou como uma experiência interessante virou um caos.</p><p><strong>O que está acontecendo:</strong></p><p>• Bots de IA estão debatendo entre si em threads infinitas</p><p>• Fica cada vez mais difícil distinguir humanos de bots</p><p>• Alguns usuários usam a plataforma como "simulador de sociedade"</p><p><strong>Opinião:</strong> O Moltbook é um laboratório fascinante do futuro da internet. O que acontece quando IA pode postar, comentar e votar como humanos? Spoiler: fica estranho rápido.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1485827404703-89b55fcc595e?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-04',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: 'Sam Altman Declara: "Basicamente Construímos AGI"',
|
||||
preview: 'CEO da OpenAI faz declaração bombástica em perfil da Forbes, depois recua...',
|
||||
conteudo: '<p>Em um perfil extenso da Forbes sobre sua jornada no mundo da IA, Sam Altman, CEO da OpenAI, declarou: "Basicamente construímos AGI, ou estamos muito próximos disso."</p><p>Dias depois, Altman recuou: "Eu quis dizer isso como uma declaração espiritual, não literal. Atingir AGI vai exigir muitas descobertas de tamanho médio. Não acho que precisamos de uma grande."</p><p><strong>O contexto:</strong></p><p>• AGI (Inteligência Artificial Geral) é o "santo graal" — IA capaz de qualquer tarefa intelectual humana</p><p>• A OpenAI define internamente níveis de AGI, e acredita estar no nível 2 de 5</p><p>• Críticos dizem que Altman faz isso para manter o hype e os investimentos</p><p><strong>Opinião:</strong> Altman é mestre do hype calculado. "Basicamente AGI" é vago o suficiente para gerar manchetes sem ser falsificável. Mas os modelos atuais já estão transformando trabalho real.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1535378917042-10a22c95931a?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-03',
|
||||
categoria: 'destaque',
|
||||
},
|
||||
{
|
||||
titulo: 'Elon Musk Funde SpaceX com xAI: "IA no Mundo Físico"',
|
||||
preview: 'Tesla investiu US$ 2B na xAI enquanto empresa queima US$ 1B por mês...',
|
||||
conteudo: '<p>A Tesla revelou em seu balanço trimestral que investiu US$ 2 bilhões na xAI, empresa de IA de Elon Musk que também é dona do X.com e do chatbot Grok.</p><p><strong>Os números assustam:</strong></p><p>• xAI queimou US$ 7.8 bilhões nos primeiros 9 meses de 2025</p><p>• SpaceX é lucrativa, mas xAI queima ~US$ 1 bilhão por mês</p><p>• Tesla justifica o investimento como "aprimoramento de produtos de IA no mundo físico"</p><p><strong>O melhor comentário:</strong> "As constantes novas empresas e fusões de Musk parecem o equivalente corporativo de criar um email novo toda vez que quer usar um free trial." 😂</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1624953587687-daf255b6b80a?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-03',
|
||||
categoria: 'normal',
|
||||
},
|
||||
{
|
||||
titulo: '2026: Agentes de IA São a Nova Fronteira — Mas Funcionam?',
|
||||
preview: 'Todas as Big Techs apostam em agentes autônomos, mas resultados variam...',
|
||||
conteudo: '<p>2026 está sendo chamado de "O Ano dos Agentes". Microsoft, Google, OpenAI e Anthropic lançaram ou anunciaram agentes de IA que executam tarefas complexas de forma autônoma.</p><p><strong>O que são Agentes de IA?</strong></p><p>Sistemas que vão além de responder perguntas — eles planejam, executam e iteratam sobre tarefas com mínima supervisão humana.</p><p><strong>Exemplos reais:</strong></p><p>• Microsoft Copilot Agents: gerenciam fluxos de trabalho no Office 365</p><p>• Claude Code: escreve e executa código autonomamente</p><p>• Google Gemini Agents: navegam a web e preenchem formulários</p><p><strong>A realidade:</strong> Agentes são promissores mas ainda falham em tarefas que exigem julgamento nuanceado. Estamos no "early innings" — quem aprender a usá-los agora terá vantagem competitiva.</p>',
|
||||
imagem_url: 'https://images.unsplash.com/photo-1550745165-9bc0b252726f?w=600&h=300&fit=crop',
|
||||
data_publicacao: '2026-02-03',
|
||||
categoria: 'normal',
|
||||
},
|
||||
];
|
||||
|
||||
const hypes = [
|
||||
{ nome: 'Agentes Autônomos', percentual: 96, icone: '🔥', ordem: 1, ativo: true },
|
||||
{ nome: 'Mega-Investimentos ($670B)', percentual: 94, icone: '🏗️', ordem: 2, ativo: true },
|
||||
{ nome: 'Anúncios/Monetização em IA', percentual: 88, icone: '📢', ordem: 3, ativo: true },
|
||||
{ nome: 'Regulamentação UE vs Big Tech', percentual: 85, icone: '⚖️', ordem: 4, ativo: true },
|
||||
{ nome: 'IA no Entretenimento (Disney+Sora)', percentual: 79, icone: '🎬', ordem: 5, ativo: true },
|
||||
{ nome: 'IA Local / On-Device', percentual: 73, icone: '🤖', ordem: 6, ativo: true },
|
||||
];
|
||||
|
||||
const dica = {
|
||||
titulo: '💡 Use Agentes de IA Para Tarefas Repetitivas',
|
||||
conteudo: '<p>Em vez de usar ChatGPT como um Google glorificado, experimente agentes como Claude Code ou Copilot para <strong>automatizar tarefas completas</strong>: configurar servidores, processar planilhas, migrar sistemas.</p><p>A diferença: em vez de perguntar "como faço X?", você diz "faça X" — e o agente planeja, executa e te mostra o resultado. É a próxima evolução no uso de IA.</p>',
|
||||
data_publicacao: '2026-02-10',
|
||||
ativa: true,
|
||||
};
|
||||
|
||||
async function seed() {
|
||||
await ds.initialize();
|
||||
console.log('Connected to DB');
|
||||
|
||||
const noticiaRepo = ds.getRepository(Noticia);
|
||||
const hypeRepo = ds.getRepository(Hype);
|
||||
const dicaRepo = ds.getRepository(Dica);
|
||||
|
||||
// Clear existing
|
||||
await noticiaRepo.clear();
|
||||
await hypeRepo.clear();
|
||||
await dicaRepo.clear();
|
||||
|
||||
// Seed
|
||||
await noticiaRepo.save(articles);
|
||||
console.log(`Seeded ${articles.length} articles`);
|
||||
|
||||
await hypeRepo.save(hypes);
|
||||
console.log(`Seeded ${hypes.length} hypes`);
|
||||
|
||||
await dicaRepo.save([dica]);
|
||||
console.log('Seeded 1 dica');
|
||||
|
||||
await ds.destroy();
|
||||
console.log('Done!');
|
||||
}
|
||||
|
||||
seed().catch(e => { console.error(e); process.exit(1); });
|
||||
22
backend/tsconfig.json
Normal file
22
backend/tsconfig.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"declaration": true,
|
||||
"removeComments": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"target": "ES2021",
|
||||
"sourceMap": true,
|
||||
"outDir": "./dist",
|
||||
"baseUrl": "./",
|
||||
"incremental": true,
|
||||
"skipLibCheck": true,
|
||||
"strictNullChecks": false,
|
||||
"noImplicitAny": false,
|
||||
"strictBindCallApply": false,
|
||||
"forceConsistentCasingInFileNames": false,
|
||||
"noFallthroughCasesInSwitch": false,
|
||||
"esModuleInterop": true
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user