Modelo de dados
As entidades centrais e como se relacionam. Tudo pendura em Group (o tenant).
Leitura rápida
Groupé o centro: alunos, chaves, produtos, clientes e pedidos são todos dele.ProductVarianté a unidade vendável — carregasku,priceestock, e é o que viraOrderItem.ApiKeyguarda só o hash;revokedAt = nullsignifica chave ativa. Convive com aGroup.apiKeyHash(a chave primária criada pelo professor).Reviewé a avaliação do cliente: nota, comentário e fotos. OorderIdé a prova da compra — é ele que acende o selo "compra verificada". Ocultar (hidden) tira da vitrine e da média, sem apagar o registro.PickupPointé um ponto de retirada da loja; a coordenada é obrigatória (sem ela não aparece no mapa). Um pedido compickupPointIdé retirada, não entrega.AddresseGroupConfigtambém ganharam latitude/longitude, ambas opcionais.MediaAsseté o arquivo na biblioteca da loja (o binário vive no S3, aqui fica o ponteiro);ProductImageé o vínculo desse arquivo com um produto ou variante. Por isso a mesma foto pode aparecer em vários produtos, e tirar a foto de um produto não apaga o arquivo.GroupConfigguarda a configuração da loja (identidade, contato, tema, regional).
Isolamento na prática
Nenhuma dessas tabelas é consultada sem o filtro de groupId (via tenantScope). É isso
que garante que um grupo nunca leia dados de outro.