Skip to content

Latest commit

 

History

History
149 lines (121 loc) · 6.14 KB

FireMapper-1-reflection.md

File metadata and controls

149 lines (121 loc) · 6.14 KB

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étodo GetById
  • FireIgnore - 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”
}
A classe 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.

  1. Implemente os custom attributes FireCollection, FireKey e FireIgnore.

  2. Usando a API de Reflexão implemente a classe FireDataMapper que faz o mapeamento entre objectos de domínio e dados na forma de Dictionary<string, object> manipulados por uma instância de IDataSource. 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 com FireKey; etc. Garanta o máximo de cobertura observando o coverage report obtido através do procedimento descrito no README.md.

  3. Faça uma implementação alternativa de IDataSource na classe WeakDataSource que 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 classe FireDataMapper pode funcionar com qualquer implementação de IDataSource especificada por parâmetro do construtor.

  4. 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 Classroom de um documento Student corresponde à propriedade Token de um documento Classroom semelhante 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.
  1. DataFireMapper deve suportar classes de domínio com propriedades de tipo definido por outras classes de domínio. Neste caso deve criar uma outra instância de DataFireMapper auxiliar 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)  {}
public record ClassroomInfo([property:FireKey] string Token, string Teacher) {}