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.
Files changed (44) hide show
  1. package/README.md +212 -0
  2. package/dist/core/entities/email.vo.d.ts +7 -0
  3. package/dist/core/entities/funcionario.entity.d.ts +7 -0
  4. package/dist/core/entities/name.vo.d.ts +7 -0
  5. package/dist/core/entities/pessoa.entity.d.ts +21 -0
  6. package/dist/core/entities/solicitacao-troca-turno.entity.d.ts +25 -0
  7. package/dist/core/entities/supervisor.entity.d.ts +7 -0
  8. package/dist/core/entities/turno.entity.d.ts +25 -0
  9. package/dist/core/ports/funcionario.repository.d.ts +5 -0
  10. package/dist/core/ports/solicitacao-troca-turno.repository.d.ts +7 -0
  11. package/dist/core/ports/supervisor.repository.d.ts +5 -0
  12. package/dist/core/ports/turno.repository.d.ts +6 -0
  13. package/dist/core/usecases/__mocks__/funcionario-in-memory.repository.d.ts +11 -0
  14. package/dist/core/usecases/__mocks__/solicitacao-troca-turno-in-memory.repository.d.ts +13 -0
  15. package/dist/core/usecases/__mocks__/supervisor-in-memory.repository.d.ts +11 -0
  16. package/dist/core/usecases/__mocks__/turno-in-memory.repository.d.ts +12 -0
  17. package/dist/core/usecases/aceitar-troca-turno.usecase.d.ts +18 -0
  18. package/dist/core/usecases/atualizar-funcionario.usecase.d.ts +15 -0
  19. package/dist/core/usecases/atualizar-turno.usecase.d.ts +16 -0
  20. package/dist/core/usecases/buscar-funcionario-por-id.usecase.d.ts +13 -0
  21. package/dist/core/usecases/buscar-solicitacao-troca-turno-por-id.usecase.d.ts +13 -0
  22. package/dist/core/usecases/buscar-turno-por-id.usecase.d.ts +13 -0
  23. package/dist/core/usecases/cancelar-troca-turno.usecase.d.ts +14 -0
  24. package/dist/core/usecases/criar-funcionario.usecase.d.ts +15 -0
  25. package/dist/core/usecases/criar-supervisor.usecase.d.ts +15 -0
  26. package/dist/core/usecases/criar-turno.usecase.d.ts +10 -0
  27. package/dist/core/usecases/listar-funcionarios.usecase.d.ts +10 -0
  28. package/dist/core/usecases/listar-solicitacoes-troca-turno.usecase.d.ts +10 -0
  29. package/dist/core/usecases/listar-turnos-disponiveis-para-troca.usecase.d.ts +13 -0
  30. package/dist/core/usecases/listar-turnos-por-funcionario-e-data.usecase.d.ts +14 -0
  31. package/dist/core/usecases/listar-turnos.usecase.d.ts +10 -0
  32. package/dist/core/usecases/remover-funcionario.usecase.d.ts +12 -0
  33. package/dist/core/usecases/remover-turno.usecase.d.ts +12 -0
  34. package/dist/core/usecases/solicitar-troca-turno.usecase.d.ts +16 -0
  35. package/dist/index.cjs +740 -0
  36. package/dist/index.d.ts +29 -0
  37. package/dist/index.js +698 -0
  38. package/dist/shared/either.d.ts +16 -0
  39. package/dist/shared/entity.d.ts +9 -0
  40. package/dist/shared/repository.d.ts +9 -0
  41. package/dist/shared/result.d.ts +13 -0
  42. package/dist/shared/use-case.d.ts +5 -0
  43. package/dist/shared/value-object.d.ts +9 -0
  44. 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 { ValueObject } from "../../shared/value-object";
3
+ declare class EmailVO extends ValueObject<string> {
4
+ private constructor();
5
+ static create(email: string): Result<EmailVO>;
6
+ }
7
+ export { EmailVO };
@@ -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,7 @@
1
+ import { Result } from "../../shared/result";
2
+ import { ValueObject } from "../../shared/value-object";
3
+ declare class NameVO extends ValueObject<string> {
4
+ private constructor();
5
+ static create(name: string): Result<NameVO>;
6
+ }
7
+ export { NameVO };
@@ -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,5 @@
1
+ import { Repository } from "../../shared/repository";
2
+ import { FuncionarioEntity } from "../entities/funcionario.entity";
3
+ declare abstract class FuncionarioRepository extends Repository<FuncionarioEntity> {
4
+ }
5
+ export { FuncionarioRepository };
@@ -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,5 @@
1
+ import { Repository } from "../../shared/repository";
2
+ import { SupervisorEntity } from "../entities/supervisor.entity";
3
+ declare abstract class SupervisorRepository extends Repository<SupervisorEntity> {
4
+ }
5
+ export { SupervisorRepository };
@@ -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 };