fvi-dynamoose-core v0.0.2
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 nycnpm run release: Inicia uma nova release de versão incrementando opatch, git flow release start.npm run release:minor: Inicia uma nova release de versão incrementando ominor, git flow release start.npm run release:major: Inicia uma nova release de versão incrementando omajor, 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 ohashem um Object, e.g.{ id: 'value' }e o Object completo com as propriedades..update(hash: Object, obj: Object): Atualiza um registro passando ohashcomo um Object, e.g.{ id: 'value' }, e o Object completo com todas as propriedades..queryByHashKey(hash: Object): Consulta um registro passando ohashcomo um Object, e.g.{ id: 'value' }..query(startHashKey: String, limit: Number): Consulta um ou mais registros paginados..delete(hash: Object): Excluir um registro, passando ohashcomo 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 ohashcomo 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 ohashcomo 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 ohashcomo um Object, e.g.{ id: 'value' }..query(range: Object, startHashKey: Object, limit: Number): Consulta um ou mais registros paginados, passando orangecomo um Object, e.g.{ status: 'value' }..delete(hash: Object, range: Object): Excluir um registro, passando ohashcomo um Object, e.g.{ id: 'value'}erange, 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 oidcomo uma String, e.g.'value', e o Object completo com todas as propriedades..queryById(id: String): Consulta um registro passando oidcomo uma String, e.g.'value'..query(startHashKey: String, limit: Number): Consulta um ou mais registros paginados..delete(id: String): Excluir um registro, passando oidcomo 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 oidcomo uma String, e.g.'value'e o Object completo com todas as propriedades..queryById(id: String): Consulta um registro passando oidcomo um String, e.g.'value'..query(startKey: Object, limit: Number): Consulta um ou mais registros paginados..delete(id: String): Excluir um registro, passando oidcomo 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 criadostatus === 200: Alteração ou exclusão do registrostatus === 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 sucessostatus === 400: Erro de validação e consistência nos dados.status === 500: Erro de crítico e inesperado.