rl-core-front 0.19.7 → 0.19.9

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.
@@ -4,6 +4,8 @@ import type { components } from "#core/_services/api/schema";
4
4
  /** Tipos derivados do `openapi.json` (§5) — não redigitar a forma da resposta. */
5
5
  export type QueueJob = components["schemas"]["QueueJobResponse"];
6
6
  export type QueueCounts = components["schemas"]["QueueCountsResponse"];
7
+ export type QueueStateCounts =
8
+ components["schemas"]["QueueStateCountsResponse"];
7
9
 
8
10
  export interface Paginated<T> {
9
11
  items: T[];
@@ -27,15 +29,40 @@ export enum QueueJobState {
27
29
  /**
28
30
  * As filas do sistema. Espelha o `QUEUE_NAMES` do backend.
29
31
  *
30
- * São duas porque a exportação roda em processo próprio: um worker do BullMQ
31
- * puxa qualquer job da fila em que está registrado, e misturá-las faria o
32
- * consumidor de relatórios roubar o trabalho de outra feature.
32
+ * São três porque cada consumidor isolado tem a sua: um worker do BullMQ puxa
33
+ * **qualquer** job da fila em que está registrado, sem filtrar por nome, então
34
+ * misturá-las faria o consumidor de relatórios roubar o trabalho da conversão de
35
+ * imagem e falhar por não ter handler para ele.
33
36
  */
34
37
  export enum QueueName {
35
38
  JOBS = "jobs",
36
39
  EXPORTS = "exports",
40
+ IMAGES = "images",
37
41
  }
38
42
 
43
+ /**
44
+ * "Todas as filas" — o que a tela mostra por padrão.
45
+ *
46
+ * Espelha o `ALL_QUEUES` do backend, e existe porque a fila não é um modo de
47
+ * tela: quem entra aqui quer saber o que falhou no sistema, não o que falhou em
48
+ * `exports` e depois em `images`, um par de cada vez. Vale só para ler — as
49
+ * ações mandam a fila do próprio job (`job.queue`), porque o id do BullMQ é uma
50
+ * sequência por fila.
51
+ */
52
+ export const ALL_QUEUES = "all";
53
+
54
+ /**
55
+ * A fila de um job, como a API a devolve.
56
+ *
57
+ * Vem do schema, e não do `QueueName`: quem chama passa tanto `QueueName.IMAGES`
58
+ * quanto o `job.queue` que veio da resposta, e um `enum` de string do TypeScript
59
+ * aceita o primeiro e recusa o segundo — o valor da API é um literal, e literal
60
+ * não entra em `enum`. Assim os dois servem, sem `as` em lugar nenhum.
61
+ */
62
+ export type QueueJobQueue = QueueJob["queue"];
63
+
64
+ export type QueueScope = QueueJobQueue | typeof ALL_QUEUES;
65
+
39
66
  export interface QueueJobsQuery {
40
67
  state: QueueJobState;
41
68
  page: number;
@@ -43,11 +70,18 @@ export interface QueueJobsQuery {
43
70
  /** Campo da whitelist do backend (`SORTABLE_JOB_FIELDS`). */
44
71
  sortBy?: string;
45
72
  sortDir?: "ASC" | "DESC";
46
- queue?: QueueName;
73
+ queue?: QueueScope;
47
74
  }
48
75
 
49
76
  export const queuesService = {
50
- counts(queue?: QueueName): Promise<QueueCounts> {
77
+ /**
78
+ * O total de cada estado e o recorte de cada fila, numa resposta.
79
+ *
80
+ * Os dois juntos porque a tela precisa dos dois: o total vira cartão, e o
81
+ * recorte vira o número ao lado de cada fila — que é o que diz onde está a
82
+ * falha antes de alguém clicar.
83
+ */
84
+ counts(queue?: QueueScope): Promise<QueueCounts> {
51
85
  return api
52
86
  .get<QueueCounts>("/queues/counts", { params: { queue } })
53
87
  .then((r) => r.data);
@@ -57,7 +91,8 @@ export const queuesService = {
57
91
  * Uma página de jobs de **um** estado.
58
92
  *
59
93
  * O estado é obrigatório: no Redis cada estado é uma estrutura própria, e
60
- * "todos" não é uma consulta que exista.
94
+ * "todos" não é uma consulta que exista. A fila, sim — com `all` o backend
95
+ * junta as três e intercala pelo mais recente.
61
96
  */
62
97
  list(query: QueueJobsQuery): Promise<Paginated<QueueJob>> {
63
98
  return api
@@ -65,13 +100,13 @@ export const queuesService = {
65
100
  .then((r) => r.data);
66
101
  },
67
102
 
68
- retry(id: string, queue?: QueueName): Promise<void> {
103
+ retry(id: string, queue: QueueJobQueue): Promise<void> {
69
104
  return api
70
105
  .post(`/queues/jobs/${id}/retry`, undefined, { params: { queue } })
71
106
  .then(() => undefined);
72
107
  },
73
108
 
74
- remove(id: string, queue?: QueueName): Promise<void> {
109
+ remove(id: string, queue: QueueJobQueue): Promise<void> {
75
110
  return api
76
111
  .delete(`/queues/jobs/${id}`, { params: { queue } })
77
112
  .then(() => undefined);
@@ -127,9 +127,20 @@ export const en: Messages = {
127
127
  stateFailed: "Failed",
128
128
  stateDelayed: "Delayed",
129
129
  queue: "Queue",
130
+ queueAll: "All",
130
131
  queueJobs: "General",
131
132
  queueExports: "Reports",
132
- payload: "Payload",
133
+ queueImages: "Images",
134
+ payload: "Job payload",
135
+ result: "Result",
136
+ finishedAt: "Finished at",
137
+ duration: "Duration",
138
+ attemptsOf: "{made} of {max}",
139
+ stacktrace: "Stack trace",
140
+ stacktraceAttempt: "Stack trace — attempt {n}",
141
+ copyError: "Copy error",
142
+ copied: "Error copied",
143
+ copyFailed: "Could not copy",
133
144
  },
134
145
  shortcuts: {
135
146
  title: "Keyboard shortcuts",
@@ -198,6 +209,7 @@ export const en: Messages = {
198
209
  view: "List format",
199
210
  viewList: "List",
200
211
  viewGrid: "Cards",
212
+ detail: "Show row details",
201
213
  reorder: "Drag to reorder",
202
214
  reorderSorted: "Clear the column sorting to drag rows",
203
215
  reorderGrouped: "Rows cannot be reordered while the list is grouped",
@@ -129,9 +129,20 @@ export const pt = {
129
129
  stateFailed: "Falhos",
130
130
  stateDelayed: "Agendados",
131
131
  queue: "Fila",
132
+ queueAll: "Todas",
132
133
  queueJobs: "Geral",
133
134
  queueExports: "Relatórios",
134
- payload: "Conteúdo",
135
+ queueImages: "Imagens",
136
+ payload: "Conteúdo do job",
137
+ result: "Resultado",
138
+ finishedAt: "Terminou em",
139
+ duration: "Duração",
140
+ attemptsOf: "{made} de {max}",
141
+ stacktrace: "Rastro do erro",
142
+ stacktraceAttempt: "Rastro do erro — tentativa {n}",
143
+ copyError: "Copiar erro",
144
+ copied: "Erro copiado",
145
+ copyFailed: "Não foi possível copiar",
135
146
  },
136
147
  shortcuts: {
137
148
  title: "Atalhos de teclado",
@@ -200,6 +211,7 @@ export const pt = {
200
211
  view: "Formato da listagem",
201
212
  viewList: "Lista",
202
213
  viewGrid: "Cartões",
214
+ detail: "Ver detalhes da linha",
203
215
  reorder: "Arraste para reordenar",
204
216
  reorderSorted:
205
217
  "Limpe a ordenação por coluna para arrastar as linhas",
package/src/index.ts CHANGED
@@ -24,10 +24,15 @@ export { QueuesScreen } from "#core/features/queues/queues-screen";
24
24
  export type {
25
25
  QueueCounts,
26
26
  QueueJob,
27
+ QueueJobQueue,
27
28
  QueueJobsQuery,
29
+ QueueScope,
30
+ QueueStateCounts,
28
31
  } from "#core/features/queues/services/queues.service";
29
32
  export {
33
+ ALL_QUEUES,
30
34
  QueueJobState,
35
+ QueueName,
31
36
  queuesService,
32
37
  } from "#core/features/queues/services/queues.service";
33
38
  export { RbacScreen } from "#core/features/rbac/rbac-screen";