shift-swap 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +212 -0
- package/dist/core/entities/email.vo.d.ts +7 -0
- package/dist/core/entities/funcionario.entity.d.ts +7 -0
- package/dist/core/entities/name.vo.d.ts +7 -0
- package/dist/core/entities/pessoa.entity.d.ts +21 -0
- package/dist/core/entities/solicitacao-troca-turno.entity.d.ts +25 -0
- package/dist/core/entities/supervisor.entity.d.ts +7 -0
- package/dist/core/entities/turno.entity.d.ts +25 -0
- package/dist/core/ports/funcionario.repository.d.ts +5 -0
- package/dist/core/ports/solicitacao-troca-turno.repository.d.ts +7 -0
- package/dist/core/ports/supervisor.repository.d.ts +5 -0
- package/dist/core/ports/turno.repository.d.ts +6 -0
- package/dist/core/usecases/__mocks__/funcionario-in-memory.repository.d.ts +11 -0
- package/dist/core/usecases/__mocks__/solicitacao-troca-turno-in-memory.repository.d.ts +13 -0
- package/dist/core/usecases/__mocks__/supervisor-in-memory.repository.d.ts +11 -0
- package/dist/core/usecases/__mocks__/turno-in-memory.repository.d.ts +12 -0
- package/dist/core/usecases/aceitar-troca-turno.usecase.d.ts +18 -0
- package/dist/core/usecases/atualizar-funcionario.usecase.d.ts +15 -0
- package/dist/core/usecases/atualizar-turno.usecase.d.ts +16 -0
- package/dist/core/usecases/buscar-funcionario-por-id.usecase.d.ts +13 -0
- package/dist/core/usecases/buscar-solicitacao-troca-turno-por-id.usecase.d.ts +13 -0
- package/dist/core/usecases/buscar-turno-por-id.usecase.d.ts +13 -0
- package/dist/core/usecases/cancelar-troca-turno.usecase.d.ts +14 -0
- package/dist/core/usecases/criar-funcionario.usecase.d.ts +15 -0
- package/dist/core/usecases/criar-supervisor.usecase.d.ts +15 -0
- package/dist/core/usecases/criar-turno.usecase.d.ts +10 -0
- package/dist/core/usecases/listar-funcionarios.usecase.d.ts +10 -0
- package/dist/core/usecases/listar-solicitacoes-troca-turno.usecase.d.ts +10 -0
- package/dist/core/usecases/listar-turnos-disponiveis-para-troca.usecase.d.ts +13 -0
- package/dist/core/usecases/listar-turnos-por-funcionario-e-data.usecase.d.ts +14 -0
- package/dist/core/usecases/listar-turnos.usecase.d.ts +10 -0
- package/dist/core/usecases/remover-funcionario.usecase.d.ts +12 -0
- package/dist/core/usecases/remover-turno.usecase.d.ts +12 -0
- package/dist/core/usecases/solicitar-troca-turno.usecase.d.ts +16 -0
- package/dist/index.cjs +740 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +698 -0
- package/dist/shared/either.d.ts +16 -0
- package/dist/shared/entity.d.ts +9 -0
- package/dist/shared/repository.d.ts +9 -0
- package/dist/shared/result.d.ts +13 -0
- package/dist/shared/use-case.d.ts +5 -0
- package/dist/shared/value-object.d.ts +9 -0
- package/package.json +25 -0
package/README.md
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# shift-swap — Domínio de Troca de Turnos (DDD)
|
|
2
|
+
|
|
3
|
+
Biblioteca TypeScript com a lógica de domínio de um sistema de troca de turnos entre
|
|
4
|
+
funcionários, modelada com DDD e Clean Architecture. Não tem dependências de runtime,
|
|
5
|
+
não faz I/O e não lança exceções para erros de negócio — tudo é comunicado através do
|
|
6
|
+
padrão `Result`.
|
|
7
|
+
|
|
8
|
+
## Instalação
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install shift-swap
|
|
12
|
+
# ou
|
|
13
|
+
bun add shift-swap
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
(Ajuste `shift-swap` para o nome real do pacote publicado, se for diferente.)
|
|
17
|
+
|
|
18
|
+
## Ideia geral
|
|
19
|
+
|
|
20
|
+
- **Entidades** (`FuncionarioEntity`, `SupervisorEntity`, `Turno`, `SolicitacaoTrocaTurno`)
|
|
21
|
+
concentram as regras de negócio e são sempre criadas por um `static create(...)` que
|
|
22
|
+
retorna `Result<T>` — nunca lançam exceção.
|
|
23
|
+
- **Use-cases** (`CriarFuncionarioUseCase`, `SolicitarTrocaTurnoUseCase`, etc.) orquestram
|
|
24
|
+
entidades + repositórios e são o ponto de entrada que qualquer cliente (API REST,
|
|
25
|
+
GraphQL, CLI, job) deve chamar. Todos retornam `Promise<Result<Output>>`.
|
|
26
|
+
- **Ports** (`FuncionarioRepository`, `TurnoRepository`, `SupervisorRepository`,
|
|
27
|
+
`SolicitacaoTrocaTurnoRepository`) são contratos abstratos de persistência. A lib não
|
|
28
|
+
implementa nenhum banco — quem consome implementa esses contratos (Postgres, Prisma,
|
|
29
|
+
Mongo, um array em memória, o que for). Isso é inversão de dependência: o domínio não
|
|
30
|
+
conhece a infraestrutura.
|
|
31
|
+
- **`Result<T>`** é o canal padrão de erro: `isSuccess`/`isFailure`, `error` (mensagem) e
|
|
32
|
+
`getValue()` (lança só se você chamar num resultado falho — é um erro de programação,
|
|
33
|
+
não uma regra de negócio).
|
|
34
|
+
|
|
35
|
+
A lib não usa nenhuma API exclusiva de Node — nem `fs`, nem `process` — e
|
|
36
|
+
`crypto.randomUUID()` também existe em navegadores modernos, então ela roda sem
|
|
37
|
+
problema num bundle de frontend (Vite, webpack, etc.). A distinção importante não é
|
|
38
|
+
"onde roda", e sim **o que** faz sentido importar em cada lado:
|
|
39
|
+
|
|
40
|
+
- **Backend (sempre)**: use-cases e ports. Eles pressupõem um repositório de verdade
|
|
41
|
+
(banco de dados) e são a autoridade final — validação e autorização client-side nunca
|
|
42
|
+
substituem o que roda aqui.
|
|
43
|
+
- **Frontend (opcional, com moderação)**: as entidades/Value Objects (`FuncionarioEntity`,
|
|
44
|
+
`NameVO`, `EmailVO`, etc.) e `Result<T>` podem ser reaproveitados para rodar a *mesma*
|
|
45
|
+
validação num formulário antes de enviar, dando feedback instantâneo sem duplicar as
|
|
46
|
+
regras (`"Nome deve ter pelo menos 3 caracteres"` escrito uma vez só). Isso é só UX —
|
|
47
|
+
o backend sempre revalida.
|
|
48
|
+
|
|
49
|
+
Importar **use-cases** ou **ports** (`*Repository`) no frontend é a parte que eu evitaria:
|
|
50
|
+
não existe repositório de verdade num navegador, e "implementar" um que só chama sua API
|
|
51
|
+
é uma indireção sem ganho, além de sugerir (errado) que a regra de negócio já foi
|
|
52
|
+
aplicada do lado do cliente.
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
// num formulário React, por exemplo
|
|
56
|
+
import { EmailVO } from "shift-swap";
|
|
57
|
+
|
|
58
|
+
function validarEmail(email: string): string | null {
|
|
59
|
+
const result = EmailVO.create(email);
|
|
60
|
+
return result.isFailure ? (result.error as string) : null;
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
A exceção de "onde roda" é um framework fullstack cujo código de "frontend" na verdade
|
|
65
|
+
executa em servidor/edge (ex.: Route Handlers ou Server Actions do Next.js) — aí use-cases
|
|
66
|
+
e ports funcionam normalmente, como em qualquer backend.
|
|
67
|
+
|
|
68
|
+
## Integrando num backend
|
|
69
|
+
|
|
70
|
+
### 1. Implemente os repositórios com seu banco de dados
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import { FuncionarioRepository, FuncionarioEntity } from "shift-swap";
|
|
74
|
+
import { PrismaClient } from "@prisma/client";
|
|
75
|
+
|
|
76
|
+
class PrismaFuncionarioRepository extends FuncionarioRepository {
|
|
77
|
+
constructor(private readonly prisma: PrismaClient) {
|
|
78
|
+
super();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
async save(entity: FuncionarioEntity): Promise<void> {
|
|
82
|
+
await this.prisma.funcionario.create({
|
|
83
|
+
data: { id: entity.id, name: entity.name.value, email: entity.email.value },
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async update(entity: FuncionarioEntity): Promise<void> {
|
|
88
|
+
await this.prisma.funcionario.update({
|
|
89
|
+
where: { id: entity.id },
|
|
90
|
+
data: { name: entity.name.value, email: entity.email.value },
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async delete(id: string): Promise<void> {
|
|
95
|
+
await this.prisma.funcionario.delete({ where: { id } });
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async findById(id: string): Promise<FuncionarioEntity | null> {
|
|
99
|
+
const row = await this.prisma.funcionario.findUnique({ where: { id } });
|
|
100
|
+
if (!row) return null;
|
|
101
|
+
return FuncionarioEntity.create({ name: row.name, email: row.email }, row.id).getValue();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async findAll(): Promise<FuncionarioEntity[]> {
|
|
105
|
+
const rows = await this.prisma.funcionario.findMany();
|
|
106
|
+
return rows.map((row) =>
|
|
107
|
+
FuncionarioEntity.create({ name: row.name, email: row.email }, row.id).getValue()
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Repita o mesmo padrão para `TurnoRepository`, `SupervisorRepository` e
|
|
114
|
+
`SolicitacaoTrocaTurnoRepository` (essas duas últimas têm métodos extras — veja a
|
|
115
|
+
tabela de exports abaixo).
|
|
116
|
+
|
|
117
|
+
### 2. Monte e chame os use-cases
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
import { CriarFuncionarioUseCase } from "shift-swap";
|
|
121
|
+
|
|
122
|
+
const funcionarioRepository = new PrismaFuncionarioRepository(prisma);
|
|
123
|
+
const criarFuncionario = new CriarFuncionarioUseCase(funcionarioRepository);
|
|
124
|
+
|
|
125
|
+
app.post("/funcionarios", async (req, res) => {
|
|
126
|
+
const result = await criarFuncionario.execute(req.body); // { name, email }
|
|
127
|
+
|
|
128
|
+
if (result.isFailure) {
|
|
129
|
+
return res.status(400).json({ error: result.error });
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const funcionario = result.getValue();
|
|
133
|
+
return res.status(201).json({
|
|
134
|
+
id: funcionario.id,
|
|
135
|
+
name: funcionario.name.value,
|
|
136
|
+
email: funcionario.email.value,
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Esse é o formato geral de **todo** use-case: monte com os repositórios via construtor,
|
|
142
|
+
chame `execute(input)`, trate `isSuccess`/`isFailure`. Nenhum deles lança exceção para
|
|
143
|
+
erro de validação ou de regra de negócio.
|
|
144
|
+
|
|
145
|
+
### 3. Autenticação (ex.: BetterAuth)
|
|
146
|
+
|
|
147
|
+
As entidades aceitam um `id` explícito na criação justamente para permitir reaproveitar
|
|
148
|
+
o id gerado pelo seu provedor de autenticação, evitando uma tabela de vínculo extra:
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
const { user } = await auth.api.signUpEmail({
|
|
152
|
+
body: { email, password, name },
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
const result = await criarFuncionario.execute({
|
|
156
|
+
id: user.id, // mesmo id do usuário autenticado
|
|
157
|
+
name: user.name,
|
|
158
|
+
email: user.email,
|
|
159
|
+
});
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
A partir daí, `FuncionarioEntity.id === authUser.id`, e a API decide qual conjunto de
|
|
163
|
+
use-cases expor com base no papel do usuário logado (ex.: um `Funcionario` só pode
|
|
164
|
+
chamar `ListarTurnosPorFuncionarioEDataUseCase`/`ListarTurnosDisponiveisParaTrocaUseCase`,
|
|
165
|
+
enquanto um `Supervisor` pode chamar `ListarTurnosUseCase` para ver tudo).
|
|
166
|
+
|
|
167
|
+
## O que a lib exporta
|
|
168
|
+
|
|
169
|
+
### Domínio compartilhado
|
|
170
|
+
| Export | Descrição |
|
|
171
|
+
| --- | --- |
|
|
172
|
+
| `Result<T>` | Canal de erro/sucesso usado por toda a lib |
|
|
173
|
+
|
|
174
|
+
### Entidades e Value Objects
|
|
175
|
+
| Export | Descrição |
|
|
176
|
+
| --- | --- |
|
|
177
|
+
| `FuncionarioEntity` | Pessoa que executa turnos e solicita trocas |
|
|
178
|
+
| `SupervisorEntity` | Pessoa com visão de todos os turnos |
|
|
179
|
+
| `Turno` | Um turno de trabalho (`data`, `horaInicio`, `horaFim`, dono atual) |
|
|
180
|
+
| `SolicitacaoTrocaTurno`, `StatusSolicitacaoTrocaTurno` | Pedido de troca de um turno, com ciclo de vida `pendente` → `aceita`/`cancelada` |
|
|
181
|
+
| `NameVO`, `EmailVO` | Value Objects usados internamente por `FuncionarioEntity`/`SupervisorEntity` |
|
|
182
|
+
|
|
183
|
+
### Ports (implemente com seu banco)
|
|
184
|
+
| Export | Métodos extras além do CRUD básico |
|
|
185
|
+
| --- | --- |
|
|
186
|
+
| `FuncionarioRepository` | — |
|
|
187
|
+
| `SupervisorRepository` | — |
|
|
188
|
+
| `TurnoRepository` | `findByFuncionarioIdAndData(funcionarioId, data)` |
|
|
189
|
+
| `SolicitacaoTrocaTurnoRepository` | `findPendentesByTurnoId(turnoId)`, `findPendentesExcetoSolicitante(solicitanteId)` |
|
|
190
|
+
|
|
191
|
+
### Use-cases
|
|
192
|
+
| Funcionário | Supervisor | Turno | Troca de turno |
|
|
193
|
+
| --- | --- | --- | --- |
|
|
194
|
+
| `CriarFuncionarioUseCase` | `CriarSupervisorUseCase` | `CriarTurnoUseCase` | `SolicitarTrocaTurnoUseCase` |
|
|
195
|
+
| `BuscarFuncionarioPorIdUseCase` | | `BuscarTurnoPorIdUseCase` | `AceitarTrocaTurnoUseCase` |
|
|
196
|
+
| `ListarFuncionariosUseCase` | | `ListarTurnosUseCase` | `CancelarTrocaTurnoUseCase` |
|
|
197
|
+
| `AtualizarFuncionarioUseCase` | | `AtualizarTurnoUseCase` | `BuscarSolicitacaoTrocaTurnoPorIdUseCase` |
|
|
198
|
+
| `RemoverFuncionarioUseCase` | | `RemoverTurnoUseCase` | `ListarSolicitacoesTrocaTurnoUseCase` |
|
|
199
|
+
| | | `ListarTurnosPorFuncionarioEDataUseCase` | `ListarTurnosDisponiveisParaTrocaUseCase` |
|
|
200
|
+
|
|
201
|
+
> `SolicitacaoTrocaTurno` propositalmente não tem update/delete genérico — só
|
|
202
|
+
> `create`/`read` e as transições de estado (`aceitar`/`cancelar`), para preservar o
|
|
203
|
+
> histórico da troca.
|
|
204
|
+
|
|
205
|
+
## Scripts (para desenvolver a própria lib)
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
bun test # roda a suíte de testes
|
|
209
|
+
bun run build # gera dist/ (ESM + CJS + .d.ts)
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Para contribuir com a lib, veja as convenções em [CLAUDE.md](./CLAUDE.md).
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { CreatePessoaProps, PessoaEntity } from "./pessoa.entity";
|
|
3
|
+
declare class FuncionarioEntity extends PessoaEntity {
|
|
4
|
+
private constructor();
|
|
5
|
+
static create(props: CreatePessoaProps, id?: string): Result<FuncionarioEntity>;
|
|
6
|
+
}
|
|
7
|
+
export { FuncionarioEntity };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Entity } from "../../shared/entity";
|
|
2
|
+
import { Result } from "../../shared/result";
|
|
3
|
+
import { EmailVO } from "./email.vo";
|
|
4
|
+
import { NameVO } from "./name.vo";
|
|
5
|
+
interface PessoaProps {
|
|
6
|
+
name: NameVO;
|
|
7
|
+
email: EmailVO;
|
|
8
|
+
}
|
|
9
|
+
interface CreatePessoaProps {
|
|
10
|
+
name: string;
|
|
11
|
+
email: string;
|
|
12
|
+
}
|
|
13
|
+
declare class PessoaEntity extends Entity<PessoaProps> {
|
|
14
|
+
protected constructor(props: PessoaProps, id?: string);
|
|
15
|
+
get name(): NameVO;
|
|
16
|
+
get email(): EmailVO;
|
|
17
|
+
atualizarDados(props: CreatePessoaProps): Result<void>;
|
|
18
|
+
protected static buildProps(props: CreatePessoaProps): Result<PessoaProps>;
|
|
19
|
+
static create(props: CreatePessoaProps, id?: string): Result<PessoaEntity>;
|
|
20
|
+
}
|
|
21
|
+
export { PessoaEntity, PessoaProps, CreatePessoaProps };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Entity } from "../../shared/entity";
|
|
2
|
+
import { Result } from "../../shared/result";
|
|
3
|
+
import { Turno } from "./turno.entity";
|
|
4
|
+
type StatusSolicitacaoTrocaTurno = "pendente" | "aceita" | "cancelada";
|
|
5
|
+
interface SolicitacaoTrocaTurnoProps {
|
|
6
|
+
turno: Turno;
|
|
7
|
+
solicitanteId: string;
|
|
8
|
+
destinatarioId?: string;
|
|
9
|
+
status: StatusSolicitacaoTrocaTurno;
|
|
10
|
+
}
|
|
11
|
+
interface CreateSolicitacaoTrocaTurnoProps {
|
|
12
|
+
turno: Turno;
|
|
13
|
+
solicitanteId: string;
|
|
14
|
+
}
|
|
15
|
+
declare class SolicitacaoTrocaTurno extends Entity<SolicitacaoTrocaTurnoProps> {
|
|
16
|
+
private constructor();
|
|
17
|
+
get turno(): Turno;
|
|
18
|
+
get solicitanteId(): string;
|
|
19
|
+
get destinatarioId(): string | undefined;
|
|
20
|
+
get status(): StatusSolicitacaoTrocaTurno;
|
|
21
|
+
aceitar(funcionarioId: string): Result<void>;
|
|
22
|
+
cancelar(): Result<void>;
|
|
23
|
+
static create(props: CreateSolicitacaoTrocaTurnoProps, id?: string): Result<SolicitacaoTrocaTurno>;
|
|
24
|
+
}
|
|
25
|
+
export { SolicitacaoTrocaTurno, StatusSolicitacaoTrocaTurno };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { CreatePessoaProps, PessoaEntity } from "./pessoa.entity";
|
|
3
|
+
declare class SupervisorEntity extends PessoaEntity {
|
|
4
|
+
private constructor();
|
|
5
|
+
static create(props: CreatePessoaProps, id?: string): Result<SupervisorEntity>;
|
|
6
|
+
}
|
|
7
|
+
export { SupervisorEntity };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Entity } from "../../shared/entity";
|
|
2
|
+
import { Result } from "../../shared/result";
|
|
3
|
+
interface TurnoProps {
|
|
4
|
+
data: string;
|
|
5
|
+
horaInicio: string;
|
|
6
|
+
horaFim: string;
|
|
7
|
+
funcionarioId: string;
|
|
8
|
+
}
|
|
9
|
+
interface HorarioTurno {
|
|
10
|
+
data: string;
|
|
11
|
+
horaInicio: string;
|
|
12
|
+
horaFim: string;
|
|
13
|
+
}
|
|
14
|
+
declare class Turno extends Entity<TurnoProps> {
|
|
15
|
+
private constructor();
|
|
16
|
+
get data(): string;
|
|
17
|
+
get horaInicio(): string;
|
|
18
|
+
get horaFim(): string;
|
|
19
|
+
get funcionarioId(): string;
|
|
20
|
+
reatribuir(novoFuncionarioId: string): Result<void>;
|
|
21
|
+
atualizarHorario(horario: HorarioTurno): Result<void>;
|
|
22
|
+
private static validarHorario;
|
|
23
|
+
static create(props: TurnoProps, id?: string): Result<Turno>;
|
|
24
|
+
}
|
|
25
|
+
export { Turno, TurnoProps };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Repository } from "../../shared/repository";
|
|
2
|
+
import { SolicitacaoTrocaTurno } from "../entities/solicitacao-troca-turno.entity";
|
|
3
|
+
declare abstract class SolicitacaoTrocaTurnoRepository extends Repository<SolicitacaoTrocaTurno> {
|
|
4
|
+
abstract findPendentesByTurnoId(turnoId: string): Promise<SolicitacaoTrocaTurno[]>;
|
|
5
|
+
abstract findPendentesExcetoSolicitante(solicitanteId: string): Promise<SolicitacaoTrocaTurno[]>;
|
|
6
|
+
}
|
|
7
|
+
export { SolicitacaoTrocaTurnoRepository };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Repository } from "../../shared/repository";
|
|
2
|
+
import { Turno } from "../entities/turno.entity";
|
|
3
|
+
declare abstract class TurnoRepository extends Repository<Turno> {
|
|
4
|
+
abstract findByFuncionarioIdAndData(funcionarioId: string, data: string): Promise<Turno[]>;
|
|
5
|
+
}
|
|
6
|
+
export { TurnoRepository };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FuncionarioEntity } from "../../entities/funcionario.entity";
|
|
2
|
+
import { FuncionarioRepository } from "../../ports/funcionario.repository";
|
|
3
|
+
declare class FuncionarioInMemoryRepository extends FuncionarioRepository {
|
|
4
|
+
private readonly items;
|
|
5
|
+
save(entity: FuncionarioEntity): Promise<void>;
|
|
6
|
+
update(entity: FuncionarioEntity): Promise<void>;
|
|
7
|
+
delete(id: string): Promise<void>;
|
|
8
|
+
findById(id: string): Promise<FuncionarioEntity | null>;
|
|
9
|
+
findAll(): Promise<FuncionarioEntity[]>;
|
|
10
|
+
}
|
|
11
|
+
export { FuncionarioInMemoryRepository };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SolicitacaoTrocaTurno } from "../../entities/solicitacao-troca-turno.entity";
|
|
2
|
+
import { SolicitacaoTrocaTurnoRepository } from "../../ports/solicitacao-troca-turno.repository";
|
|
3
|
+
declare class SolicitacaoTrocaTurnoInMemoryRepository extends SolicitacaoTrocaTurnoRepository {
|
|
4
|
+
private readonly items;
|
|
5
|
+
save(entity: SolicitacaoTrocaTurno): Promise<void>;
|
|
6
|
+
update(entity: SolicitacaoTrocaTurno): Promise<void>;
|
|
7
|
+
delete(id: string): Promise<void>;
|
|
8
|
+
findById(id: string): Promise<SolicitacaoTrocaTurno | null>;
|
|
9
|
+
findAll(): Promise<SolicitacaoTrocaTurno[]>;
|
|
10
|
+
findPendentesByTurnoId(turnoId: string): Promise<SolicitacaoTrocaTurno[]>;
|
|
11
|
+
findPendentesExcetoSolicitante(solicitanteId: string): Promise<SolicitacaoTrocaTurno[]>;
|
|
12
|
+
}
|
|
13
|
+
export { SolicitacaoTrocaTurnoInMemoryRepository };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { SupervisorEntity } from "../../entities/supervisor.entity";
|
|
2
|
+
import { SupervisorRepository } from "../../ports/supervisor.repository";
|
|
3
|
+
declare class SupervisorInMemoryRepository extends SupervisorRepository {
|
|
4
|
+
private readonly items;
|
|
5
|
+
save(entity: SupervisorEntity): Promise<void>;
|
|
6
|
+
update(entity: SupervisorEntity): Promise<void>;
|
|
7
|
+
delete(id: string): Promise<void>;
|
|
8
|
+
findById(id: string): Promise<SupervisorEntity | null>;
|
|
9
|
+
findAll(): Promise<SupervisorEntity[]>;
|
|
10
|
+
}
|
|
11
|
+
export { SupervisorInMemoryRepository };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Turno } from "../../entities/turno.entity";
|
|
2
|
+
import { TurnoRepository } from "../../ports/turno.repository";
|
|
3
|
+
declare class TurnoInMemoryRepository extends TurnoRepository {
|
|
4
|
+
private readonly items;
|
|
5
|
+
save(entity: Turno): Promise<void>;
|
|
6
|
+
update(entity: Turno): Promise<void>;
|
|
7
|
+
delete(id: string): Promise<void>;
|
|
8
|
+
findById(id: string): Promise<Turno | null>;
|
|
9
|
+
findAll(): Promise<Turno[]>;
|
|
10
|
+
findByFuncionarioIdAndData(funcionarioId: string, data: string): Promise<Turno[]>;
|
|
11
|
+
}
|
|
12
|
+
export { TurnoInMemoryRepository };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { SolicitacaoTrocaTurno } from "../entities/solicitacao-troca-turno.entity";
|
|
4
|
+
import { FuncionarioRepository } from "../ports/funcionario.repository";
|
|
5
|
+
import { SolicitacaoTrocaTurnoRepository } from "../ports/solicitacao-troca-turno.repository";
|
|
6
|
+
import { TurnoRepository } from "../ports/turno.repository";
|
|
7
|
+
interface AceitarTrocaTurnoInput {
|
|
8
|
+
solicitacaoId: string;
|
|
9
|
+
funcionarioId: string;
|
|
10
|
+
}
|
|
11
|
+
declare class AceitarTrocaTurnoUseCase extends UseCase<AceitarTrocaTurnoInput, SolicitacaoTrocaTurno> {
|
|
12
|
+
private readonly funcionarioRepository;
|
|
13
|
+
private readonly turnoRepository;
|
|
14
|
+
private readonly solicitacaoRepository;
|
|
15
|
+
constructor(funcionarioRepository: FuncionarioRepository, turnoRepository: TurnoRepository, solicitacaoRepository: SolicitacaoTrocaTurnoRepository);
|
|
16
|
+
execute(input: AceitarTrocaTurnoInput): Promise<Result<SolicitacaoTrocaTurno>>;
|
|
17
|
+
}
|
|
18
|
+
export { AceitarTrocaTurnoUseCase };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { FuncionarioEntity } from "../entities/funcionario.entity";
|
|
4
|
+
import { FuncionarioRepository } from "../ports/funcionario.repository";
|
|
5
|
+
interface AtualizarFuncionarioInput {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
email: string;
|
|
9
|
+
}
|
|
10
|
+
declare class AtualizarFuncionarioUseCase extends UseCase<AtualizarFuncionarioInput, FuncionarioEntity> {
|
|
11
|
+
private readonly funcionarioRepository;
|
|
12
|
+
constructor(funcionarioRepository: FuncionarioRepository);
|
|
13
|
+
execute(input: AtualizarFuncionarioInput): Promise<Result<FuncionarioEntity>>;
|
|
14
|
+
}
|
|
15
|
+
export { AtualizarFuncionarioUseCase };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { Turno } from "../entities/turno.entity";
|
|
4
|
+
import { TurnoRepository } from "../ports/turno.repository";
|
|
5
|
+
interface AtualizarTurnoInput {
|
|
6
|
+
id: string;
|
|
7
|
+
data: string;
|
|
8
|
+
horaInicio: string;
|
|
9
|
+
horaFim: string;
|
|
10
|
+
}
|
|
11
|
+
declare class AtualizarTurnoUseCase extends UseCase<AtualizarTurnoInput, Turno> {
|
|
12
|
+
private readonly turnoRepository;
|
|
13
|
+
constructor(turnoRepository: TurnoRepository);
|
|
14
|
+
execute(input: AtualizarTurnoInput): Promise<Result<Turno>>;
|
|
15
|
+
}
|
|
16
|
+
export { AtualizarTurnoUseCase };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { FuncionarioEntity } from "../entities/funcionario.entity";
|
|
4
|
+
import { FuncionarioRepository } from "../ports/funcionario.repository";
|
|
5
|
+
interface BuscarFuncionarioPorIdInput {
|
|
6
|
+
id: string;
|
|
7
|
+
}
|
|
8
|
+
declare class BuscarFuncionarioPorIdUseCase extends UseCase<BuscarFuncionarioPorIdInput, FuncionarioEntity> {
|
|
9
|
+
private readonly funcionarioRepository;
|
|
10
|
+
constructor(funcionarioRepository: FuncionarioRepository);
|
|
11
|
+
execute(input: BuscarFuncionarioPorIdInput): Promise<Result<FuncionarioEntity>>;
|
|
12
|
+
}
|
|
13
|
+
export { BuscarFuncionarioPorIdUseCase };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { SolicitacaoTrocaTurno } from "../entities/solicitacao-troca-turno.entity";
|
|
4
|
+
import { SolicitacaoTrocaTurnoRepository } from "../ports/solicitacao-troca-turno.repository";
|
|
5
|
+
interface BuscarSolicitacaoTrocaTurnoPorIdInput {
|
|
6
|
+
id: string;
|
|
7
|
+
}
|
|
8
|
+
declare class BuscarSolicitacaoTrocaTurnoPorIdUseCase extends UseCase<BuscarSolicitacaoTrocaTurnoPorIdInput, SolicitacaoTrocaTurno> {
|
|
9
|
+
private readonly solicitacaoRepository;
|
|
10
|
+
constructor(solicitacaoRepository: SolicitacaoTrocaTurnoRepository);
|
|
11
|
+
execute(input: BuscarSolicitacaoTrocaTurnoPorIdInput): Promise<Result<SolicitacaoTrocaTurno>>;
|
|
12
|
+
}
|
|
13
|
+
export { BuscarSolicitacaoTrocaTurnoPorIdUseCase };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { Turno } from "../entities/turno.entity";
|
|
4
|
+
import { TurnoRepository } from "../ports/turno.repository";
|
|
5
|
+
interface BuscarTurnoPorIdInput {
|
|
6
|
+
id: string;
|
|
7
|
+
}
|
|
8
|
+
declare class BuscarTurnoPorIdUseCase extends UseCase<BuscarTurnoPorIdInput, Turno> {
|
|
9
|
+
private readonly turnoRepository;
|
|
10
|
+
constructor(turnoRepository: TurnoRepository);
|
|
11
|
+
execute(input: BuscarTurnoPorIdInput): Promise<Result<Turno>>;
|
|
12
|
+
}
|
|
13
|
+
export { BuscarTurnoPorIdUseCase };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { SolicitacaoTrocaTurno } from "../entities/solicitacao-troca-turno.entity";
|
|
4
|
+
import { SolicitacaoTrocaTurnoRepository } from "../ports/solicitacao-troca-turno.repository";
|
|
5
|
+
interface CancelarTrocaTurnoInput {
|
|
6
|
+
solicitacaoId: string;
|
|
7
|
+
solicitanteId: string;
|
|
8
|
+
}
|
|
9
|
+
declare class CancelarTrocaTurnoUseCase extends UseCase<CancelarTrocaTurnoInput, SolicitacaoTrocaTurno> {
|
|
10
|
+
private readonly solicitacaoRepository;
|
|
11
|
+
constructor(solicitacaoRepository: SolicitacaoTrocaTurnoRepository);
|
|
12
|
+
execute(input: CancelarTrocaTurnoInput): Promise<Result<SolicitacaoTrocaTurno>>;
|
|
13
|
+
}
|
|
14
|
+
export { CancelarTrocaTurnoUseCase };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { FuncionarioEntity } from "../entities/funcionario.entity";
|
|
4
|
+
import { FuncionarioRepository } from "../ports/funcionario.repository";
|
|
5
|
+
interface CriarFuncionarioInput {
|
|
6
|
+
id?: string;
|
|
7
|
+
name: string;
|
|
8
|
+
email: string;
|
|
9
|
+
}
|
|
10
|
+
declare class CriarFuncionarioUseCase extends UseCase<CriarFuncionarioInput, FuncionarioEntity> {
|
|
11
|
+
private readonly funcionarioRepository;
|
|
12
|
+
constructor(funcionarioRepository: FuncionarioRepository);
|
|
13
|
+
execute(input: CriarFuncionarioInput): Promise<Result<FuncionarioEntity>>;
|
|
14
|
+
}
|
|
15
|
+
export { CriarFuncionarioUseCase };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { SupervisorEntity } from "../entities/supervisor.entity";
|
|
4
|
+
import { SupervisorRepository } from "../ports/supervisor.repository";
|
|
5
|
+
interface CriarSupervisorInput {
|
|
6
|
+
id?: string;
|
|
7
|
+
name: string;
|
|
8
|
+
email: string;
|
|
9
|
+
}
|
|
10
|
+
declare class CriarSupervisorUseCase extends UseCase<CriarSupervisorInput, SupervisorEntity> {
|
|
11
|
+
private readonly supervisorRepository;
|
|
12
|
+
constructor(supervisorRepository: SupervisorRepository);
|
|
13
|
+
execute(input: CriarSupervisorInput): Promise<Result<SupervisorEntity>>;
|
|
14
|
+
}
|
|
15
|
+
export { CriarSupervisorUseCase };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { Turno, TurnoProps } from "../entities/turno.entity";
|
|
4
|
+
import { TurnoRepository } from "../ports/turno.repository";
|
|
5
|
+
declare class CriarTurnoUseCase extends UseCase<TurnoProps, Turno> {
|
|
6
|
+
private readonly turnoRepository;
|
|
7
|
+
constructor(turnoRepository: TurnoRepository);
|
|
8
|
+
execute(input: TurnoProps): Promise<Result<Turno>>;
|
|
9
|
+
}
|
|
10
|
+
export { CriarTurnoUseCase };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { FuncionarioEntity } from "../entities/funcionario.entity";
|
|
4
|
+
import { FuncionarioRepository } from "../ports/funcionario.repository";
|
|
5
|
+
declare class ListarFuncionariosUseCase extends UseCase<void, FuncionarioEntity[]> {
|
|
6
|
+
private readonly funcionarioRepository;
|
|
7
|
+
constructor(funcionarioRepository: FuncionarioRepository);
|
|
8
|
+
execute(): Promise<Result<FuncionarioEntity[]>>;
|
|
9
|
+
}
|
|
10
|
+
export { ListarFuncionariosUseCase };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { SolicitacaoTrocaTurno } from "../entities/solicitacao-troca-turno.entity";
|
|
4
|
+
import { SolicitacaoTrocaTurnoRepository } from "../ports/solicitacao-troca-turno.repository";
|
|
5
|
+
declare class ListarSolicitacoesTrocaTurnoUseCase extends UseCase<void, SolicitacaoTrocaTurno[]> {
|
|
6
|
+
private readonly solicitacaoRepository;
|
|
7
|
+
constructor(solicitacaoRepository: SolicitacaoTrocaTurnoRepository);
|
|
8
|
+
execute(): Promise<Result<SolicitacaoTrocaTurno[]>>;
|
|
9
|
+
}
|
|
10
|
+
export { ListarSolicitacoesTrocaTurnoUseCase };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { SolicitacaoTrocaTurno } from "../entities/solicitacao-troca-turno.entity";
|
|
4
|
+
import { SolicitacaoTrocaTurnoRepository } from "../ports/solicitacao-troca-turno.repository";
|
|
5
|
+
interface ListarTurnosDisponiveisParaTrocaInput {
|
|
6
|
+
funcionarioId: string;
|
|
7
|
+
}
|
|
8
|
+
declare class ListarTurnosDisponiveisParaTrocaUseCase extends UseCase<ListarTurnosDisponiveisParaTrocaInput, SolicitacaoTrocaTurno[]> {
|
|
9
|
+
private readonly solicitacaoRepository;
|
|
10
|
+
constructor(solicitacaoRepository: SolicitacaoTrocaTurnoRepository);
|
|
11
|
+
execute(input: ListarTurnosDisponiveisParaTrocaInput): Promise<Result<SolicitacaoTrocaTurno[]>>;
|
|
12
|
+
}
|
|
13
|
+
export { ListarTurnosDisponiveisParaTrocaUseCase };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { Turno } from "../entities/turno.entity";
|
|
4
|
+
import { TurnoRepository } from "../ports/turno.repository";
|
|
5
|
+
interface ListarTurnosPorFuncionarioEDataInput {
|
|
6
|
+
funcionarioId: string;
|
|
7
|
+
data: string;
|
|
8
|
+
}
|
|
9
|
+
declare class ListarTurnosPorFuncionarioEDataUseCase extends UseCase<ListarTurnosPorFuncionarioEDataInput, Turno[]> {
|
|
10
|
+
private readonly turnoRepository;
|
|
11
|
+
constructor(turnoRepository: TurnoRepository);
|
|
12
|
+
execute(input: ListarTurnosPorFuncionarioEDataInput): Promise<Result<Turno[]>>;
|
|
13
|
+
}
|
|
14
|
+
export { ListarTurnosPorFuncionarioEDataUseCase };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { Turno } from "../entities/turno.entity";
|
|
4
|
+
import { TurnoRepository } from "../ports/turno.repository";
|
|
5
|
+
declare class ListarTurnosUseCase extends UseCase<void, Turno[]> {
|
|
6
|
+
private readonly turnoRepository;
|
|
7
|
+
constructor(turnoRepository: TurnoRepository);
|
|
8
|
+
execute(): Promise<Result<Turno[]>>;
|
|
9
|
+
}
|
|
10
|
+
export { ListarTurnosUseCase };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Result } from "../../shared/result";
|
|
2
|
+
import { UseCase } from "../../shared/use-case";
|
|
3
|
+
import { FuncionarioRepository } from "../ports/funcionario.repository";
|
|
4
|
+
interface RemoverFuncionarioInput {
|
|
5
|
+
id: string;
|
|
6
|
+
}
|
|
7
|
+
declare class RemoverFuncionarioUseCase extends UseCase<RemoverFuncionarioInput, void> {
|
|
8
|
+
private readonly funcionarioRepository;
|
|
9
|
+
constructor(funcionarioRepository: FuncionarioRepository);
|
|
10
|
+
execute(input: RemoverFuncionarioInput): Promise<Result<void>>;
|
|
11
|
+
}
|
|
12
|
+
export { RemoverFuncionarioUseCase };
|