Repository navigation
feat: implementa fluxo de ocupações e descanso de terrenos - #24
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Descrição
Implementação do fluxo completo de ocupação e movimentação de grupos entre terrenos, mantendo o histórico das movimentações e controlando o ciclo de ocupação, descanso e liberação dos terrenos.
A
Occupationrepresenta o período em que um grupo permaneceu em determinado terreno, utilizandostarted_ateended_at. A ocupação atual é identificada pela ausência deended_at, simplesmente.Principais alterações
Occupation, relacionandoGroupeTerrain.occupied.availableouresting.sidekiq-cronpara executar a verificação dos terrenos em descanso a cada 12 horas.Estrutura adotada no módulo
Service Objects
As operações do domínio foram separadas em serviços com responsabilidades específicas.
Entre eles:
Occupations::OpenOccupations::CloseOccupations::MoveTerrains::OccupyTerrains::StartRestTerrains::ReleaseTerrains::ReleaseRestingO
Occupations::Moveatua como orquestrador da movimentação, reutilizando os serviços menores para abertura e encerramento das ocupações e transições dos terrenos.Policy Object
Foi criado o
Occupations::MovementPolicypara concentrar as regras que determinam se uma movimentação pode ser realizada.A policy valida situações como grupo ou terreno inativo, destino já ocupado e tentativa de movimentação para o mesmo terreno, mantendo essas verificações separadas da execução da movimentação.
Background Job
Foi criado o
Terrains::ReleaseRestingJobpara executar periodicamente a verificação dos terrenos em descanso.O job delega a regra de negócio para
Terrains::ReleaseResting, enquanto Sidekiq esidekiq-cronficam responsáveis apenas pela execução assíncrona e pelo agendamento a cada 12 horas.Consistência das movimentações
As movimentações são executadas dentro de transações e utilizam locks nos registros envolvidos.
Além disso, restrições no PostgreSQL impedem que existam simultaneamente duas ocupações ativas para o mesmo grupo ou para o mesmo terreno.
Endpoint de movimentação
O mesmo endpoint é utilizado tanto para a primeira ocupação de um grupo quanto para movimentações posteriores entre terrenos.
Não existe um fluxo separado de movimentação forçada no backend. Terrenos em descanso podem receber uma nova ocupação através do mesmo endpoint, ficando a confirmação dessa decisão sob responsabilidade da interface.