Diagrama

Diagrama.

Notação usada: Peter Chen

Entidades

Tabela de users:

Essa tabela é fundamental para controle de acesso e gerenciamento de perfis na plataforma.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, UNIQUE, PRIMARY KEY

Identificador único do usuário, gerado automaticamente.

name

VARCHAR(255)

NOT NULL

Nome completo do usuário.

username

VARCHAR(255)

NOT NULL, UNIQUE

Nome de usuário exclusivo, usado para login. Não pode conter espaços e deve ser único.

password

VARCHAR(255)

NOT NULL

Senha do usuário.

email

VARCHAR(255)

NOT NULL, UNIQUE

Endereço de e-mail exclusivo do usuário.

created_at

TIMESTAMP

NOT NULL

Data e hora em que o registro foi criado.

updated_at

TIMESTAMP

Data e hora da última atualização do registro.

description

TEXT

Descrição ou biografia do usuário.

institution

TEXT

Instituição a que o usuário está associado.

birthday

TIMESTAMP

NOT NULL

Data de nascimento do usuário.

cpf

VARCHAR(255)

UNIQUE

Cadastro de Pessoa Física (CPF) do usuário.

confirmed_at

TIMESTAMP

Data e hora em que o e-mail foi confirmado pelo usuário.

confirmation_sent_at

TIMESTAMP

Data e hora em que a confirmação do e-mail foi enviada.

deleted_at

TIMESTAMP

Data e hora em que o registro foi marcado como excluído .

active

BOOLEAN

Indica se o usuário está ativo ou inativo.

reactivated_at

TIMESTAMP

Data e hora em que o usuário foi reativado após estar inativo.

user_stats_id

INTEGER

NOT NULL, UNIQUE, FK(user_stats)

Estabelece a relação entre um usuário e seu conjunto de estatísticas de atividades, que está armazenado na tabela user_stats.

Tabela user_stats:

Essa tabela permite o acompanhamento do engajamento e atividades de cada usuário.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, PRIMARY KEY

Identificador único para as estatísticas do usuário, gerado automaticamente.

score

NUMERIC

NOT NULL

Pontuação acumulada do usuário baseada em atividades na plataforma.

likes

INTEGER

Número de “likes” que o usuário deu em conteúdos de outros usuários.

likes_received

INTEGER

Quantidade de “likes” recebidos pelo conteúdo do usuário.

follows

INTEGER

Número de perfis que o usuário segue.

followers

INTEGER

Quantidade de seguidores que o usuário tem.

collections

INTEGER

Número de coleções de conteúdo criadas pelo usuário.

submitted_resources

INTEGER

Quantidade de recursos submetidos pelo usuário para a plataforma.

approved_resources

INTEGER

Número de recursos submetidos pelo usuário que foram aprovados.

reviewd_resources

INTEGER

Quantidade de recursos revisados pelo usuário.

comments

INTEGER

Número de comentários feitos pelo usuário em conteúdos da plataforma.

Tabela resources

Essa tabela é essencial para organizar e gerenciar os recursos educacionais disponibilizados na plataforma.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, PRIMARY KEY, UNIQUE

Identificador único do recurso, gerado automaticamente.

bucket_key

VARCHAR(255)

UNIQUE

Chave exclusiva que identifica o recurso no sistema de armazenamento.

link

VARCHAR(255)

Link externo para o recurso (se houver).

thumbnail

VARCHAR(255)

URL da imagem de miniatura do recurso.

name

VARCHAR(255)

NOT NULL

Nome do recurso educacional.

author

VARCHAR(255)

NOT NULL

Nome do autor do recurso.

description

TEXT

Descrição detalhada do recurso educacional.

created_at

TIMESTAMP

Data e hora em que o recurso foi criado no sistema.

updated_at

TIMESTAMP

Data e hora da última atualização do recurso.

submited_at

TIMESTAMP

Data e hora em que o recurso foi submetido para aprovação.

published_at

TIMESTAMP

Data e hora em que o recurso foi publicado e disponibilizado aos usuários.

deleted_at

TIMESTAMP

Data e hora em que o recurso foi excluído.

user_id

INTEGER

UNIQUE, NOT NULL, FK(users.id)

Chave estrangeira que faz referência a tabela users; Define o criador do recurso.

object_type_id

INTEGER

UNIQUE, NOT NULL, FK(object_types.id)

Chave estrangeira que faz referência a tabela object_type; Define o tipo de objeto educacional do recurso.

license_id

INTEGER

UNIQUE, NOT NULL, FK(licenses.id)

Chave estrangeira que faz referência a tabela licenses. Indica a licença associada ao recurso, descrevendo como ele pode ser utilizado ou distribuído.

resource_stats_id

INTEGER

NOT NULL, UNIQUE, FK(user_stats)

Estabelece a relação entre um recurso e seu conjunto de estatísticas de atividades, que está armazenado na tabela resource_stats.

Tabela resource_stats

Essas estatísticas permitem acompanhar o engajamento e a popularidade de cada recurso educacional.

Atributo

Tipo

Restrições

Descrição

id

INTEGER

NOT NULL, UNIQUE, PRIMARY KEY

Identificador único das estatísticas de um recurso educacional.

user_id

INTEGER

NOT NULL

Identificador do usuário relacionado ao recurso.

views

INTEGER

Número de visualizações que o recurso recebeu.

download

INTEGER

Quantidade de downloads do recurso.

likes

INTEGER

Número de “likes” que o recurso recebeu dos usuários.

shares

INTEGER

Número de vezes que o recurso foi compartilhado.

score

NUMERIC

Pontuação acumulada do recurso com base nas interações (likes, views, etc.).

Tabela collections

A tabela de coleções armazena informações sobre agrupamentos de recursos educacionais criados pelos usuários. Essa tabela permite que os usuários organizem e compartilhem recursos em grupo personalizados.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, UNIQUE, PRIMARY KEY

Identificador único da coleção, gerado automaticamente.

name

VARCHAR(255)

NOT NULL

Nome da coleção.

description

TEXT

Descrição detalhada da coleção.

is_private

BOOLEAN

Indica se a coleção é privada ou pública.

created_at

TIMESTAMP

NOT NULL

Data e hora em que a coleção foi criada.

updated_at

TIMESTAMP

Data e hora da última atualização na coleção.

deleted_at

TIMESTAMP

Data e hora em que a coleção foi marcada como excluída.

thumbnail

VARCHAR(255)

URL da imagem que representa visualmente a coleção.

user_id

INTEGER

NOT NULL, UNIQUE, FK(users.id)

Criador da coleção. Associa cada coleção a um usuário específico na plataforma.

colletion_stats_id

INTEGER

NOT NULL, UNIQUE, FK(user_stats)

Estabelece a relação entre uma coleção e seu conjunto de estatísticas de atividades, que está armazenado na tabela collection_stats.

Tabela collection_stats

A tabela de estatísticas da coleção armazena dados sobre o desempenho e a interação dos usuários com as coleções de recursos educacionais. Essas estatísticas permitem monitorar a popularidade e o engajamento das coleções, ajudando a entender como os usuários interagem com os recursos agrupados.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, UNIQUE, PRIMARY KEY

Identificador único das estatísticas da coleção, gerado automaticamente.

views

INTEGER

Número de visualizações que a coleção recebeu.

downloads

INTEGER

Número de downloads dos itens da coleção.

likes

INTEGER

Número de “likes” que a coleção recebeu.

shares

INTEGER

Número de vezes que a coleção foi compartilhada.

score

NUMERIC

Pontuação atribuída à coleção com base nas interações (likes, views, etc.).

follows

INTEGER

Número de usuários que seguem ou acompanham a coleção.

Tabela subjects

A tabela de subjects armazena os nomes das disciplinas ou áreas de conhecimento associadas aos recursos educacionais na plataforma. Essa tabela serve para classificar e organizar os recursos educacionais por área, facilitando a busca e o acesso a conteúdos específicos relacionados a diferentes campos do conhecimento.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, PRIMARY KEY, UNIQUE

Identificador único da matéria gerado automaticamente.

name

VARCHAR(255)

NOT NULL

Nome da matéria, como “Matemática” ou “Língua Portuguesa”.

Tabela licenses

A tabela de licenses armazena informações sobre as licenças aplicáveis aos conteúdos (recursos) postados pelos usuários na plataforma. Essa tabela é essencial para garantir que os usuários compreendam as condições de uso dos recursos.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, PRIMARY KEY

Identificador único da licença gerado automaticamente.

name

VARCHAR(255)

NOT NULL

Nome da licença

descrição

TEXT

Descrição detalhada sobre a licença e suas permissões/restrições.

url

VARCHAR(255)

URL que aponta para a página da licença.

Tabela languages

A tabela de languages armazena informações sobre as línguas disponíveis na plataforma. Essa tabela é útil para categorizar e identificar o idioma dos recursos educacionais postados pelos usuários, facilitando a busca e a organização do conteúdo.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, PRIMARY KEY, UNIQUE

Identificador único da linguagem gerado automaticamente.

name

VARCHAR(255)

NOT NULL

Nome da linguagem.

code

VARCHAR(10)

NOT NULL, UNIQUE

Código da linguagem (ex: pt(Português), fr(Francês), etc…).

Tabela educational_stages

A tabela de educational_stages armazena as diferentes níveis associados aos recursos educacionais na plataforma.Essa tabela é usada para categorizar recursos conforme o nível de ensino, como Ensino Fundamental I, Ensino Fundamental II, Ensino Médio, entre outros.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, PRIMARY KEY

Identificador único da etapa educacional, gerado automaticamente.

name

VARCHAR(255)

NOT NULL

Nome da etapa educacional

Tabela object_types

A tabela de object_types armazena os diferentes tipos de objetos que podem ser associados aos recursos educacionais na plataforma. Esta tabela permite a categorização dos recursos de acordo com o tipo de mídia ou formato, como vídeo, documento, imagem, entre outros.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, PRIMARY KEY

Identificador único do tipo de objeto, gerado automaticamente.

name

VARCHAR(255)

NOT NULL

Nome do tipo de objeto.

Tabela submission

A tabela submission contém a avaliação de submissões de recursos educacionais, os quais podem ser aceitos ou rejeitados, justificando essa decisão. Além disso, ela vincula as submissões a um conjunto fixo de perguntas e registra os momentos no ciclo de vida de uma submissão, como a criação e a resposta.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, PRIMARY KEY

Identificador único da submissão.

is_accepted

BOOLEAN

NOT NULL

Indica se a submissão foi aceita ou não.

justification

TEXT

Justificativa para o resultado da avaliação (aceitação ou rejeição).

resource_id

INTEGER

NOT NULL, FOREIGN KEY(resources.id)

Referência ao id do recurso a ser submetido.

submitter_id

INTEGER

NOT NULL, FOREIGN KEY(users.id)

Referência ao id do usuário que fez a submissão.

curator_id

INTEGER

FOREIGN KEY(users.id)

Referência ao id do usuário que avaliou a submissão.

created_at

TIMESTAMP

NOT NULL

Data e hora em que a submissão foi criada.

updated_at

TIMESTAMP

Data e hora da última atualização da submissão.

answered_at

TIMESTAMP

Data e hora em que a submissão foi respondida (aceita ou rejeitada).

q1

BOOLEAN

Resposta à primeira pergunta da avaliação.

q2

BOOLEAN

Resposta à segunda pergunta da avaliação.

q3

BOOLEAN

Resposta à terceira pergunta da avaliação.

q4

BOOLEAN

Resposta à quarta pergunta da avaliação.

Tabela complaints

A tabela Complaints armazena as denúncias feitas pelos usuários relacionadas a diferentes tipos de objetos (usuário, coleção, ou recurso). Ela registra o estado da denúncia, que pode estar pendente (não visto), aceita ou rejeitada, e inclui uma descrição fornecida pelo denunciante. Além disso, a tabela rastreia quando a denúncia foi feita e quando foi avaliada, bem como o motivo específico da denúncia, selecionado a partir de uma lista enumerada.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, PRIMARY KEY

Identificador único da denúncia.

state

ENUM

NOT NULL

Estado do item: ‘active’ , ‘inactive’, ‘under_review’.

description

TEXT

Motivo detalhado da denúncia.

denoucer_id

INTEGER

NOT NULL, FOREIGN KEY(users.id)

Referência ao id do usuário que submeteu a denúncia.

resource_id

INTEGER

FOREIGN KEY(resources.id)

id do recurso denunciado.

collection_id

INTEGER

FOREIGN KEY(collections.id)

id da coleção denunciada.

user_id

INTEGER

FOREIGN_KEY(users.id)

id do usuário denunciado.

evaluated_at

TIMESTAMP

Data e hora em que a denúncia foi avaliada.

created_at

TIMESTAMP

NOT NULL

Data e hora em que a denúncia foi criada.

q1

BOOLEAN

Resposta à primeira pergunta da avaliação.

q2

BOOLEAN

Resposta à segunda pergunta da avaliação.

q3

BOOLEAN

Resposta à terceira pergunta da avaliação.

q4

BOOLEAN

Resposta à quarta pergunta da avaliação.

Tabela roles

Essa tabela define diferentes papéis que podem ser atribuídos aos usuários, ajudando a controlar permissões e acesso a diferentes partes do sistema.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

PRIMARY KEY, NOT NULL

Identificador único da função.

name

VARCHAR(255)

NOT NULL, UNIQUE

Nome da função (por exemplo, student, teacher, submitter…).

description

TEXT

Descrição detalhada do papel dessa função.

created_at

TIMESTAMP WITHOUT TIME ZONE

NOT NULL

Data e hora de criação da função.

updated_at

TIMESTAMP WITHOUT TIME ZONE

Data e hora da última atualização da função.

Tabela items

A tabela items armazena informações sobre os itens disponíveis na plataforma, incluindo seu nome, preço, descontos, descrições e tipo.

Atributo

Tipo

Restrições

Descrição

id

BIGINT

PRIMARY KEY, NOT NULL

Identificador único do item.

name

VARCHAR(255)

NOT NULL

Nome do item.

price

NUMERIC

Preço do item.

discount

NUMERIC

Desconto aplicado ao item.

description

TEXT

Descrição detalhada do item.

is_active

BOOLEAN

Estado do item, ativo ou inativo.

created_at

TIMESTAMP WITHOUT TIME ZONE

NOT NULL

Data e hora de criação do item.

updated_at

TIMESTAMP WITHOUT TIME ZONE

NOT NULL

Data e hora da última atualização do item.

Tabela achievements

A tabela achievements armazena informações sobre conquistas que os usuários podem obter.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

PRIMARY KEY, NOT NULL

Identificador único da conquista.

name

VARCHAR(255)

NOT NULL

Nome da conquista.

description

TEXT

Descrição detalhada da conquista.

reward_experience

NUMERIC

Quantidade de experiência concedida ao completar a conquista.

reward_points

NUMERIC

Pontos de recompensa concedidos ao completar a conquista.

state

ENUM

NOT NULL

estado do item: ‘active’ , ‘inactive’, ‘under_review’.

repeatable

INTEGER

NOT NULL

Número de vezes que a conquista pode ser repetida.

is_resettable

BOOLEAN

NOT NULL

Define se a conquista é sazonal e pode ser redefinida.

created_at

TIMESTAMP WITHOUT TIME ZONE

NOT NULL

Data e hora de criação da conquista.

updated_at

TIMESTAMP WITHOUT TIME ZONE

NOT NULL

Data e hora da última atualização da conquista.

Tabela notifications

A tabela notifications registra as notificações geradas por ações realizadas na plataforma, informando os usuários sobre interações relacionadas a recursos educacionais, coleções ou outros usuários.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

PRIMARY KEY, NOT NULL

Identificador único da notificação.

action_id

INTEGER

NOT NULL, FOREIGN KEY(actions.id)

ID da ação realizada, referenciando a tabela de ações.

actor_user_id

INTEGER

NOT NULL, FOREIGN KEY(users.id)

ID do usuário que realizou a ação.

target_user_id

INTEGER

FOREIGN KEY(users.id)

ID do usuário que foi o alvo da ação, se aplicável.

target_resource_id

INTEGER

FOREIGN KEY(resources.id)

ID do recurso educacional que foi o alvo da ação, se aplicável.

target_collection_id

INTEGER

FOREIGN KEY(collections.id)

ID da coleção que foi o alvo da ação, se aplicável.

created_at

TIMESTAMP

NOT NULL

Data e hora em que a notificação foi criada.

updated_at

TIMESTAMP

Data e hora da última atualização da notificação.

Tabela institutions

A tabela institutions armazena informações sobre instituições, incluindo nome, localização (estado e cidade), permitindo o gerenciamento e a identificação dessas entidades em um sistema.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

PRIMARY KEY, NOT NULL

Identificador único da instituição.

name

VARCHAR(255)

NOT NULL

Nome da instituição.

uf

VARCHAR(2)

Unidade Federativa (estado) da instituição.

city

VARCHAR(255)

Cidade onde a instituição está localizada.

cep

VARCHAR(10)

Código de Endereçamento Postal da instituição.

created_at

TIMESTAMP

NOT NULL

Data e hora em que a instituição foi criada.

updated_at

TIMESTAMP

Data e hora da última atualização da instituição.

Tabela actions

A tabela actions armazena informações sobre diferentes ações que os usuários podem realizar.

Atributo

Tipo

Restrições

Descrição

id

SERIAL

NOT NULL, PRIMARY KEY, UNIQUE

Identificador único da ação gerado automaticamente.

name

VARCHAR(255)

NOT NULL

Nome da ação (ex: curtir, compartilhar, baixar, etc.).

created_at

TIMESTAMP

NOT NULL

Data e hora em que a ação foi criada.

updated_at

TIMESTAMP

Data e hora da última atualização da ação.

Relações

Tabela intermediária follow

Tabela intermediária entre tabela users e a própria tabela users.

Atributo

Tipo

Restrições

Descrição

user_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela users.

follower_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela users.

Tabela intermediária collection_likes

Tabela intermediária entre tabela users e a própria tabela users.

Atributo

Tipo

Restrições

Descrição

user_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela users.

follower_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela users.

Tabela intermediária resource_languagues

Tabela intermediária entre tabela resources e tabela languages.

Atributo

Tipo

Restrições

Descrição

resource_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela resources.

language_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela languages.

Tabela intermediária user_items

Tabela intermediária entre tabela users e tabela items.

Atributo

Tipo

Restrições

Descrição

user_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela users.

item_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela items.

Tabela intermediária user_achievements

Tabela intermediária entre tabela users e tabela achievements.

Atributo

Tipo

Restrições

Descrição

user_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela users.

achievement_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela achievements.

Tabela intermediária user_roles

Tabela intermediária entre tabela users e tabela roles.

Atributo

Tipo

Restrições

Descrição

user_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela users.

role_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela roles.

Tabela intermediária user_institutions

Tabela intermediária entre users e institutions.

Atributo

Tipo

Restrições

Descrição

user_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela user.

institution_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela `institution

Tabela intermediária resource_likes

Tabela intermediária entre tabela users e tabela resources. Tabela rastreia qual usuário deu like no recurso.

Atributo

Tipo

Restrições

Descrição

user_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela users.

resource_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela resources.

Tabela intermediária resource_subjects

Tabela intermediária entre tabela users e tabela resources. Tabela rastreia qual usuário deu like no recurso.

Atributo

Tipo

Restrições

Descrição

user_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela users.

resource_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela resources.

Tabela intermediária resource_educational_stages

Tabela intermediária entre resources e tablea educational_stages.

Atributo

Tipo

Restrições

Descrição

resource_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela resources.

educational_stage_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela educational_stages.

Tabela intermediária collection_resources

Tabela intermediária entre tabela collections e tabela resources.

Atributo

Tipo

Restrições

Descrição

collection_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela collections.

resource_id

INTEGER

NOT NULL, FOREIGN KEY

Referência ao identificador único da tabela resources.

SQL

-- Criar tabela de instituições
CREATE TABLE institutions (
    id SERIAL PRIMARY KEY NOT NULL,                                 
    name VARCHAR(255) NOT NULL,                                     
    uf VARCHAR(2),                                                  
    city VARCHAR(255),                                      
    cep VARCHAR(10),                                               
    created_at TIMESTAMP NOT NULL,                                 
    updated_at TIMESTAMP                                            
);

-- Criar tabela de estatísticas de usuários
CREATE TABLE user_stats (
    id SERIAL PRIMARY KEY,                                
    score NUMERIC NOT NULL,                               
    likes INTEGER,                                        
    likes_received INTEGER,                               
    follows INTEGER,                                      
    followers INTEGER,                                    
    collections INTEGER,                                  
    submitted_resources INTEGER,                          
    approved_resources INTEGER,                           
    reviewed_resources INTEGER,                           
    comments INTEGER                                    
);

-- Criar tabela de usuários
CREATE TABLE users (
    id SERIAL PRIMARY KEY,                                  
    name VARCHAR(255) NOT NULL,                             
    username VARCHAR(255) NOT NULL UNIQUE,                  
    password VARCHAR(255) NOT NULL,                         
    email VARCHAR(255) NOT NULL UNIQUE,                     
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,         
    description TEXT,                                       
    institution TEXT,                                       
    birthday TIMESTAMP NOT NULL,                            
    cpf VARCHAR(255) UNIQUE,                                
    confirmed_at TIMESTAMP,                                 
    confirmation_sent_at TIMESTAMP,                         
    deleted_at TIMESTAMP,                               
    active BOOLEAN,                                         
    reactivated_at TIMESTAMP,                               
    user_stats_id INTEGER NOT NULL UNIQUE,              
    CONSTRAINT fk_user_stats FOREIGN KEY (user_stats_id) 
        REFERENCES user_stats(id)                       
);

-- Criar tabela de disciplinas
CREATE TABLE subjects (
    id SERIAL PRIMARY KEY UNIQUE NOT NULL,              
    name VARCHAR(255) NOT NULL                          
);

-- Criar tabela de licenças
CREATE TABLE licenses (
    id SERIAL PRIMARY KEY NOT NULL,                     
    name VARCHAR(255) NOT NULL,                         
    descricao TEXT,                                       
    url VARCHAR(255)                                    
);

-- Criar tabela de línguas
CREATE TABLE languages (
    id SERIAL PRIMARY KEY UNIQUE NOT NULL,              
    name VARCHAR(255) NOT NULL,                         
    code VARCHAR(10) NOT NULL UNIQUE            
);

-- Criar tabela de etapas educacionais
CREATE TABLE educational_stages (
    id SERIAL PRIMARY KEY NOT NULL,                 
    name VARCHAR(255) NOT NULL              
);

-- Criar tabela de tipos de objetos
CREATE TABLE object_types (
    id SERIAL PRIMARY KEY NOT NULL,                 
    name VARCHAR(255) NOT NULL                      
);

-- Criar tabela de estatísticas de recursos
CREATE TABLE resource_stats (
    id INTEGER PRIMARY KEY UNIQUE NOT NULL,              
    user_id INTEGER NOT NULL,                             
    views INTEGER,                                      
    download INTEGER,                                   
    likes INTEGER,                                       
    shares INTEGER,                                      
    score NUMERIC                               
);

-- Criar tabela de recursos
CREATE TABLE resources (
    id SERIAL PRIMARY KEY UNIQUE,                         
    bucket_key VARCHAR(255) UNIQUE,                       
    link VARCHAR(255),                                    
    thumbnail VARCHAR(255),                               
    name VARCHAR(255) NOT NULL,                           
    author VARCHAR(255) NOT NULL,                         
    description TEXT,                                    
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,      
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,      
    submitted_at TIMESTAMP,                               
    published_at TIMESTAMP,                               
    deleted_at TIMESTAMP,                                 
    user_id INTEGER NOT NULL UNIQUE,                      
    object_type_id INTEGER NOT NULL UNIQUE,              
    license_id INTEGER NOT NULL UNIQUE,                  
    resource_stats_id INTEGER NOT NULL UNIQUE,              
    CONSTRAINT fk_user FOREIGN KEY (user_id) 
        REFERENCES users(id),                             
    CONSTRAINT fk_object_type FOREIGN KEY (object_type_id) 
        REFERENCES object_types(id),                      
    CONSTRAINT fk_license FOREIGN KEY (license_id) 
        REFERENCES licenses(id),                         
    CONSTRAINT fk_resource_stats FOREIGN KEY (resource_stats_id) 
        REFERENCES resource_stats(id)
);

-- Criar tabela de estatísticas da coleção
CREATE TABLE collection_stats (
    id SERIAL PRIMARY KEY UNIQUE NOT NULL,              
    views INTEGER,                                        
    downloads INTEGER,                                    
    likes INTEGER,                                       
    shares INTEGER,                                      
    score NUMERIC,                                      
    follows INTEGER                                     
);

-- Criar tabela de coleções
CREATE TABLE collections (
    id SERIAL PRIMARY KEY UNIQUE NOT NULL,                
    name VARCHAR(255) NOT NULL,                           
    description TEXT,                                     
    is_private BOOLEAN,                                   
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,  
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,      
    deleted_at TIMESTAMP,                                 
    thumbnail VARCHAR(255),                             
    user_id INTEGER NOT NULL UNIQUE,                    
    collection_stats_id INTEGER NOT NULL UNIQUE,              
    CONSTRAINT fk_user FOREIGN KEY (user_id) 
        REFERENCES users(id),             
    CONSTRAINT fk_collection_stats FOREIGN KEY (collection_stats_id) 
        REFERENCES collection_stats(id)
);

-- Criar tabela de submissões
CREATE TABLE submissions (
    id SERIAL PRIMARY KEY NOT NULL,                                  
    is_accepted BOOLEAN NOT NULL,                                    
    justification TEXT,                                             
    resource_id INTEGER NOT NULL,                                   
    submitter_id INTEGER NOT NULL,                                  
    curator_id INTEGER,                                             
    created_at TIMESTAMP NOT NULL,                                 
    updated_at TIMESTAMP,                                          
    answered_at TIMESTAMP,                                         
    q1 BOOLEAN,                                                 
    q2 BOOLEAN,                                                 
    q3 BOOLEAN,                                                 
    q4 BOOLEAN,                                                    
    CONSTRAINT fk_resource FOREIGN KEY (resource_id) 
        REFERENCES resources(id),  
    CONSTRAINT fk_submitter FOREIGN KEY (submitter_id) 
        REFERENCES users(id),    
    CONSTRAINT fk_curator FOREIGN KEY (curator_id) 
        REFERENCES users(id)         
);


CREATE TYPE review_state AS ENUM ('active', 'inactive', 'under_review');

-- Criar tabela de denúncias
CREATE TABLE complaints (
    id SERIAL PRIMARY KEY NOT NULL,     
    state review_state NOT NULL DEFAULT 'under_review',
    description TEXT,                                               
    denoucer_id INTEGER NOT NULL,                                   
    resource_id INTEGER,                                            
    collection_id INTEGER,                                      
    user_id INTEGER,                                           
    evaluated_at TIMESTAMP,                                        
    created_at TIMESTAMP NOT NULL,                                 
    q1 BOOLEAN,                                                    
    q2 BOOLEAN,                                                    
    q3 BOOLEAN,                                                    
    q4 BOOLEAN,                                                    
    CONSTRAINT fk_denoucer FOREIGN KEY (denoucer_id)
        REFERENCES users(id),          
    CONSTRAINT fk_resource FOREIGN KEY (resource_id) 
        REFERENCES resources(id),  
    CONSTRAINT fk_collection FOREIGN KEY (collection_id) 
        REFERENCES collections(id),  
    CONSTRAINT fk_user FOREIGN KEY (user_id) 
        REFERENCES users(id)           
);

-- Criar tabela de papéis
CREATE TABLE roles (
    id SERIAL PRIMARY KEY NOT NULL,                             
    name VARCHAR(255) NOT NULL UNIQUE,                          
    description TEXT,                                           
    created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,             
    updated_at TIMESTAMP WITHOUT TIME ZONE                  
);

-- Criar tabela de conquistas
CREATE TABLE achievements (
    id SERIAL PRIMARY KEY NOT NULL,                             
    name VARCHAR(255) NOT NULL,                                 
    description TEXT,                                           
    reward_experience NUMERIC,                              
    reward_points NUMERIC,                              
    state review_state NOT NULL DEFAULT 'under_review',
    repeatable INTEGER NOT NULL,                                  
    is_resettable BOOLEAN NOT NULL,                               
    created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,        
    updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL             
);

-- Criar tabela de itens
CREATE TABLE items (
    id BIGINT PRIMARY KEY NOT NULL,                                  
    name VARCHAR(255) NOT NULL,                                     
    price NUMERIC,                                                  
    discount NUMERIC,                                               
    description TEXT,                                              
    is_active BOOLEAN,                                             
    created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,            
    updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL   
);

-- Criar tabela de ações
CREATE TABLE actions (
    id SERIAL NOT NULL PRIMARY KEY UNIQUE,                  
    name VARCHAR(255) NOT NULL,                                   
    created_at TIMESTAMP NOT NULL,                              
    updated_at TIMESTAMP                                
);

-- Criar tabela de notificações
CREATE TABLE notifications (
    id SERIAL PRIMARY KEY NOT NULL,                                 
    action_id INTEGER NOT NULL,                                       
    actor_user_id INTEGER NOT NULL,                                   
    target_user_id INTEGER,                                           
    target_resource_id INTEGER,                                       
    target_collection_id INTEGER,                                   
    created_at TIMESTAMP NOT NULL,                                   
    updated_at TIMESTAMP,                                            
    CONSTRAINT fk_action FOREIGN KEY (action_id) 
        REFERENCES actions(id),  
    CONSTRAINT fk_actor_user FOREIGN KEY (actor_user_id) 
        REFERENCES users(id),  
    CONSTRAINT fk_target_user FOREIGN KEY (target_user_id) 
        REFERENCES users(id),   
    CONSTRAINT fk_target_resource FOREIGN KEY (target_resource_id) 
        REFERENCES resources(id),  
    CONSTRAINT fk_target_collection FOREIGN KEY (target_collection_id) 
        REFERENCES collections(id)
);

CREATE TABLE followers (
    user_id INTEGER NOT NULL,
    follower_id INTEGER NOT NULL
);

CREATE TABLE collection_likes (
    user_id INTEGER NOT NULL,
    collection_id INTEGER NOT NULL
);

CREATE TABLE resource_languages (
    resource_id INTEGER NOT NULL,
    language_id INTEGER NOT NULL
);

CREATE TABLE user_items (
    id SERIAL NOT NULL PRIMARY KEY UNIQUE,                  
    user_id INTEGER NOT NULL,
    item_id INTEGER NOT NULL
);

CREATE TABLE user_achievements (
    id SERIAL NOT NULL PRIMARY KEY UNIQUE,                  
    user_id INTEGER NOT NULL,
    achievement_id INTEGER NOT NULL
);

CREATE TABLE user_roles (
    user_id INTEGER NOT NULL,
    role_id INTEGER NOT NULL
);

CREATE TABLE user_institutions (
    user_id INTEGER NOT NULL,
    institution_id INTEGER NOT NULL
);

CREATE TABLE resource_likes (
    user_id INTEGER NOT NULL,
    resource_id INTEGER NOT NULL
);

CREATE TABLE resource_subjects (
    user_id INTEGER NOT NULL,
    resource_id INTEGER NOT NULL
);

CREATE TABLE resource_educational_stages (
    resource_id INTEGER NOT NULL,
    educational_stage_id INTEGER NOT NULL
);

CREATE TABLE collection_resources (
    collection_id INTEGER NOT NULL,
    resource_id INTEGER NOT NULL
);