0.0.2 • Published 4 years ago

fvi-dynamoose-core v0.0.2

Weekly downloads
1
License
MIT
Repository
github
Last release
4 years ago

fvi-dynamoose-core

  • npm run compile: Executa a limpeza dos arquivos e diretorios.
  • npm run debug-test: Executa os testes unitários com o DEBUG ativo.
  • npm run test: Executa os testes unitários.
  • npm run debug-dev: Executa os testes unitários e espera por alterações com o DEBUG ativo.
  • npm run dev: Executa os testes unitários e espera por alterçãoes.
  • npm run prod: Executa o código com NODE_ENV=production.
  • npm run coverage: Executa os testes unitários e retorna a cobertura dos códigos através do nyc
  • npm run release: Inicia uma nova release de versão incrementando o patch, git flow release start.
  • npm run release:minor: Inicia uma nova release de versão incrementando o minor, git flow release start.
  • npm run release:major: Inicia uma nova release de versão incrementando o major, git flow release start.
  • npm run release:finish: Finaliza a release, ou seja, realiza o git flow release finish.

FVI - Dynamoose Core

Biblioteca que disponibiliza um serviços CRUD para acessar e alterar dados no AWS DynamoDB através da interface Model do dynamoose.js.

Configuração

A configuração é na verdade o Model do dynamoose que já possui os métodos necessários para a implementação dos serviçoes auxiliares de CRUD. Podemos considerar a utilização da lib fvi-dynamoose-repository para mapear e retornar o Model do dynamoose para uma instância AWS DynamoDB.

  • Exemplo utilizando a lib fvi-dynamoose-repository
const app = require('fvi-dynamoose-core')
const repository = require('fvi-dynamoose-repository')

repo = repository()

repo = repo.map(
    'model1',
    {
        id: hashKeyString(),
        tenantId: rangeKeyString(),
        prop1: requiredString(),
        prop2: optionalString(),
    },
    { saveUnknown: true },
    { update: true }
)

const model = repo.get('model1')

const services = app(model)

Mode de Usar

const app = require('fvi-dynamoose-core')

// Passing Dynamoose.Model Object
const services = app(model)

services.['hashWithRange'|'hashLikeId'|'hashLikeIdRangeLikeTenant']
    .['create'|'update'|'query'|'queryByHashKey'|'queryById'|'delete']
    (
        {...params}
    )
    .then(console.log)
    .catch(console.error)

Somente usando o hash key

{ 'any_hashkey-name': 'value' }

Neste serviço podemos ter um CRUD onde a tabela dynamodb sendo tratada terá em seu schema um HashKey configurado. Seguem métodos disponívels:

`services.hashOnly

  • .create(hash: Object, obj: Object): Cria um novo registro passando o hash em um Object, e.g. { id: 'value' } e o Object completo com as propriedades.
  • .update(hash: Object, obj: Object): Atualiza um registro passando o hash como um Object, e.g. { id: 'value' }, e o Object completo com todas as propriedades.
  • .queryByHashKey(hash: Object): Consulta um registro passando o hash como um Object, e.g. { id: 'value' }.
  • .query(startHashKey: String, limit: Number): Consulta um ou mais registros paginados.
  • .delete(hash: Object): Excluir um registro, passando o hash como uma Object, e.g. { id: 'value' } .

Tabela dynamo com hash key e range key

{ 'qualquer-hask-key-name': 'value', 'qualquer-range-key-name': 'value' }

Neste serviço podemos ter um CRUD onde a tabela dynamodb sendo tratada terá em seu schema um HashKey e um RangeKey configurados. Estão disponíveis os seguintes métodos:

services.hashWithRange

  • .create(hash: Object, range: Object, obj: Object): Cria um novo registro passando o hash como um Object, e.g. { id: 'value' }, o range, e.g. { status: 'value' } e o Object completo com todas as propriedades.
  • .update(hash: Object, range: Object, obj: Object): Atualiza um registro passando o hash como um Object, e.g. { id: 'value' }, o range, e.g. { status: 'value' } e o Object completo com todas as propriedades.
  • .queryByHashKey(hash: Object): Consulta um registro passando o hash como um Object, e.g. { id: 'value' }.
  • .query(range: Object, startHashKey: Object, limit: Number): Consulta um ou mais registros paginados, passando o range como um Object, e.g. { status: 'value' }.
  • .delete(hash: Object, range: Object): Excluir um registro, passando o hash como um Object, e.g. { id: 'value'} e range, e.g. { status: 'value' }.

Tabela dynamo com HashKey como 'id'

{ id: 'hashKey' }

Neste serviço podemos ter um CRUD onde a tabela dynamodb sendo tratada terá em seu schema um HashKey já configurado como a propriedade id. Estão disponíveis os seguintes métodos:

services.hashLikeId

  • .create(obj: Object): Cria um novo registro passando um Object, e.g. { id: 'value', prop1: 'value', etc: 'etc...' }.
  • .update(id: String, obj: Object): Atualiza um registro passando o id como uma String, e.g. 'value', e o Object completo com todas as propriedades.
  • .queryById(id: String): Consulta um registro passando o id como uma String, e.g. 'value'.
  • .query(startHashKey: String, limit: Number): Consulta um ou mais registros paginados.
  • .delete(id: String): Excluir um registro, passando o id como uma String, e.g. 'value' .

Tabela dynamo com hash key como 'id' e range key como 'tenantId'

{ id: 'hashKey', tenantId: 'rangeKey' }

Neste serviço podemos ter um CRUD onde a tabela dynamodb sendo tratada terá em seu schema um HashKey já configurado como a propriedade id e o . configurado para a propriedade tenantId, ajudando a implementar o padrão arquitetural de software chamado multi-tenancy.

Neste serviço temos a necessidade de chamar ele passado o valor do tenantId para que retorne os métodos do serviço, o CRUD. Este serviço vai gerenciar o tenantId, ou seja, tem um comportamento diferente dos serviços anteriores, onde, não passamos informação alguma à ser gerenciada. Segu um exemplo:

const services = app(model)

const tenant1 = service.hashLikeIdRangeLikeTenant('tenant-1')

tenant1.update('id-value', { prop1: 'xxx' }) // then().catch()

const tenant2 = service.hashLikeIdRangeLikeTenant('tenant-1')

tenant2.create({ id: 'id-value', prop2: 'yyy' }) // then().catch()

services.hashLikeIdRangeLikeTenant('tenant-id')

  • .create(obj: Object): Cria um novo registro passando um Object, e.g. { id: 'value', prop: 'xxx' }.
  • .update(id: String, obj: Object): Atualiza um registro passando o id como uma String, e.g. 'value' e o Object completo com todas as propriedades.
  • .queryById(id: String): Consulta um registro passando o id como um String, e.g. 'value'.
  • .query(startKey: Object, limit: Number): Consulta um ou mais registros paginados.
  • .delete(id: String): Excluir um registro, passando o id como um String, e.g. 'value'.

Padrões de retorno

Para funções de mutação de dados, que modificam de alguma maneira o DynamodDB retornam no formato abaixo:

{
    "status": 200,
    "data": {
        "id": "value",
        "status": "value"
    }
}
  • status === 201: Novo registro criado
  • status === 200: Alteração ou exclusão do registro
  • status === 400: Erro de validação e consistência nos dados.
  • status === 500: Erro de crítico e inesperado.

Para funções de consulta de dados, que não modificam o DynamodDB retornam no formato abaixo:

{
    "status": 200,
    "data": {
        "LastKey": { "id": "prox-value" },
        "Count": 1,
        "Items": [
            {
                "id": "value",
                "status": "value"
            }
        ]
    }
}
  • status === 200: Consulta realizada com sucesso
  • status === 400: Erro de validação e consistência nos dados.
  • status === 500: Erro de crítico e inesperado.