DATA LIMITE de entrega: 18 de Abril de 2021. Fazer push a tag trab1 no repositório do grupo.
Neste trabalho pretende-se desenvolver a biblioteca FireMapper que disponibiliza uma abstração sobre uma colecção de uma base de dados documental FireStore. Em modo resumido, o FireStore é uma base de dados NoSQL que armazena colecções de documentos JSON.
https://github.com/isel-leic-ave/FireMapper
Uma base de dados FireStore é gerida a partir de um projecto FireBase. De modo a se familiarizar com a tecnologia deve em primeiro lugar seguir os passos do guião “FireStore get started” para criar alguns documentos e uma pequena aplicação em C# que se liga a essa base de dados listando o seu conteúdo na consola.
O objectivo da biblioteca FireMapper é facilitar o acesso aos documentos
de uma colecção por via de um IDataMapper. Esta interface especifica os
métodos de acesso à coleção e que correspondem às operações CRUD.
public interface IDataMapper
{
IEnumerable GetAll();
object GetById(object keyValue);
void Add(object obj);
void Update(object obj);
void Delete(object keyValue);
}Por cada colecção deve existir uma classe de domínio com propriedades correspondentes às propriedades de um documento. Essas classes podem ter informação complementar dada na forma de anotações, por via dos seguintes custom attributes:
FireCollection- aplicado a uma classe para identificar o nome da coleção Firestore.FireKey- identifica a propriedade que é chave única na pesquisa de um documento através do métodoGetByIdFireIgnore- propriedade a ignorar no mapeamento com um documento.
Exemplo:
[FireCollection("Students")]
public record Student(
[property:FireKey] string Number,
string Name,
[property:FireIgnore] string Classroom)
{} |
Students collection: {
“Name”: “Zanda Cantanda”,
“Number”: “72538”,
“Classroom”: “TLI41D”
}
… |
FireDataMapper implementa a interface IDataMapper com um
comportamento dependente da classe de domínio (e.g. Student), cujo Type é
fornecido na sua instanciação.
IDataMapper studentsMapper = new FireDataMapper(typeof(Student), ...);A implementação de FileDataMapper deve ser feita com o suporte da classe
FireDataSource da biblioteca FireSource disponibilizado no respectivo
projecto que integra a solução.
Enquanto a classe FireDataSource lida com dados fracamente tipificados na
forma de Dictionary<string, object>, a classe FireDataMapper trata objectos
de domínio, e.g. instâncias de Student.
-
Implemente os custom attributes
FireCollection,FireKeyeFireIgnore. -
Usando a API de Reflexão implemente a classe
FireDataMapperque faz o mapeamento entre objectos de domínio e dados na forma deDictionary<string, object>manipulados por uma instância deIDataSource. Implemente os testes unitários que validem o correcto funcionamento dos métodos, incluíndo casos de excepção como por exemplo, ausência de anotações; mais que uma propriedade anotada comFireKey; etc. Garanta o máximo de cobertura observando o coverage report obtido através do procedimento descrito no README.md. -
Faça uma implementação alternativa de
IDataSourcena classeWeakDataSourceque mantém os dados apenas em memória (defina a estrutura de dados ao seu critério). Valide o funcionamento com testes unitários. Note que a classeFireDataMapperpode funcionar com qualquer implementação deIDataSourceespecificada por parâmetro do construtor. -
Defina as classes de um modelo de domínio e crie uma nova base de dados para esse modelo no FireStore e teste com a sua biblioteca FireMapper. Exemplos: carros, filmes, música, desportos, jogadores de futebol, ligas de futebol, jogadores da NBA, videogames, surfistas, lutadores, séries de TV, surf spots, praias, cidades do mundo, resorts de neve, hotéis, marcas, etc. Requisitos:
- O modelo definido deverá incluir no mínimo duas entidades (classes) com uma relação de associação.
- Use auto id nos documentos da base de dados.
- Veja o exemplo de associação criado nos testes do projecto
FireSource.Tests e como a propriedade
Classroomde um documentoStudentcorresponde à propriedadeTokende um documentoClassroomsemelhante ao comportamento de uma foreign key. - Cada grupo de trabalho deverá usar um modelo de domínio distinto.
- Modelos de domínio mais ricos em termos de dados e relações entre si, serão valorizados.
Faça um pull request para o repositório
https://github.com/isel-leic-ave/FireMapper/ para adicionar um novo ficheiro na
pasta Db que identifica o modelo domínio. Cada grupo deve escolher um domínio
diferente. Os domínios são atribuídos de acordo com a ordem dos pull request.
Cada pull request deve atender aos seguintes requisitos:
- Um novo ficheiro com o nome na forma:
<turma>-<grupo>-nome-do-dominio.txt, por exemplo: i41d-g07-surf-spots.txt - O conteúdo do ficheiro deve descrever o esquema (nomes de campo e tipo) de cada coleção. Deve ter pelo menos duas coleções distintas com uma associação (foreign key) entre elas.
- Um exemplo dos documentos.
FireDataMapperdeve suportar classes de domínio com propriedades de tipo definido por outras classes de domínio. Neste caso deve criar uma outra instância deFireDataMapperauxiliar para o respectivo tipo da propriedade que permite aceder à respectiva colecção. Valide o funcionamento da associação em testes unitários.
Exemplo a classe ClassroomInfo correspondente ao tipo da propriedade Classroom:
[FireCollection("Students")]
public record Student( [property:FireKey] string Number, string Name, ClassroomInfo Classroom) {}
[FireCollection("Classrooms")]
public record ClassroomInfo([property:FireKey] string Token, string Teacher) {}