@nextsparkjs/core 0.1.0-beta.97 → 0.1.0-beta.98
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/dist/components/media/MediaCard.d.ts +2 -1
- package/dist/components/media/MediaCard.d.ts.map +1 -1
- package/dist/components/media/MediaCard.js +13 -9
- package/dist/components/media/MediaDetailPanel.d.ts +2 -1
- package/dist/components/media/MediaDetailPanel.d.ts.map +1 -1
- package/dist/components/media/MediaDetailPanel.js +22 -10
- package/dist/components/media/MediaGrid.d.ts +3 -2
- package/dist/components/media/MediaGrid.d.ts.map +1 -1
- package/dist/components/media/MediaGrid.js +3 -1
- package/dist/components/media/MediaList.d.ts +3 -2
- package/dist/components/media/MediaList.d.ts.map +1 -1
- package/dist/components/media/MediaList.js +10 -6
- package/dist/contexts/TeamContext.d.ts.map +1 -1
- package/dist/contexts/TeamContext.js +9 -5
- package/dist/hooks/useMedia.d.ts.map +1 -1
- package/dist/hooks/useMedia.js +20 -14
- package/dist/lib/api/api-error.d.ts +41 -0
- package/dist/lib/api/api-error.d.ts.map +1 -0
- package/dist/lib/api/api-error.js +61 -0
- package/dist/lib/api/auth/dual-auth.d.ts +15 -0
- package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
- package/dist/lib/api/auth/dual-auth.js +21 -1
- package/dist/lib/api/index.d.ts +2 -0
- package/dist/lib/api/index.d.ts.map +1 -1
- package/dist/lib/api/index.js +5 -0
- package/dist/lib/api/permission-middleware.d.ts.map +1 -1
- package/dist/lib/api/permission-middleware.js +2 -1
- package/dist/lib/services/media.service.d.ts +30 -56
- package/dist/lib/services/media.service.d.ts.map +1 -1
- package/dist/lib/services/media.service.js +63 -77
- package/dist/lib/teams/schema.d.ts +6 -34
- package/dist/lib/teams/schema.d.ts.map +1 -1
- package/dist/lib/teams/schema.js +14 -7
- package/dist/messages/de/index.d.ts +2 -0
- package/dist/messages/de/index.d.ts.map +1 -1
- package/dist/messages/de/permissions.json +2 -0
- package/dist/messages/en/index.d.ts +3 -0
- package/dist/messages/en/index.d.ts.map +1 -1
- package/dist/messages/en/media.json +1 -0
- package/dist/messages/en/permissions.json +2 -0
- package/dist/messages/es/index.d.ts +3 -0
- package/dist/messages/es/index.d.ts.map +1 -1
- package/dist/messages/es/media.json +1 -0
- package/dist/messages/es/permissions.json +2 -0
- package/dist/messages/fr/index.d.ts +2 -0
- package/dist/messages/fr/index.d.ts.map +1 -1
- package/dist/messages/fr/permissions.json +2 -0
- package/dist/messages/it/index.d.ts +2 -0
- package/dist/messages/it/index.d.ts.map +1 -1
- package/dist/messages/it/permissions.json +2 -0
- package/dist/messages/pt/index.d.ts +2 -0
- package/dist/messages/pt/index.d.ts.map +1 -1
- package/dist/messages/pt/permissions.json +2 -0
- package/dist/migrations/021_media.sql +53 -0
- package/dist/providers/query-provider.d.ts +0 -1
- package/dist/providers/query-provider.d.ts.map +1 -1
- package/dist/providers/query-provider.js +26 -3
- package/dist/styles/classes.json +2 -3
- package/dist/templates/app/api/v1/media/[id]/route.ts +50 -14
- package/dist/templates/app/api/v1/media/[id]/tags/route.ts +75 -9
- package/dist/templates/app/api/v1/media/check-duplicates/route.ts +14 -2
- package/dist/templates/app/api/v1/media/route.ts +17 -5
- package/dist/templates/app/api/v1/media/upload/route.ts +22 -10
- package/dist/templates/app/api/v1/media-tags/route.ts +27 -7
- package/dist/templates/app/dashboard/(main)/media/page.tsx +35 -23
- package/dist/templates/instrumentation.ts +18 -12
- package/migrations/021_media.sql +53 -0
- package/package.json +15 -15
- package/scripts/build/registry/discovery/permissions.mjs +79 -2
- package/templates/app/api/v1/media/[id]/route.ts +50 -14
- package/templates/app/api/v1/media/[id]/tags/route.ts +75 -9
- package/templates/app/api/v1/media/check-duplicates/route.ts +14 -2
- package/templates/app/api/v1/media/route.ts +17 -5
- package/templates/app/api/v1/media/upload/route.ts +22 -10
- package/templates/app/api/v1/media-tags/route.ts +27 -7
- package/templates/app/dashboard/(main)/media/page.tsx +35 -23
- package/templates/instrumentation.ts +18 -12
- package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +28 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/de/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/de/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,wBAoBU"}
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
"allPermissions": "Alle Berechtigungen",
|
|
7
7
|
"permission": "Berechtigung",
|
|
8
8
|
"dangerousAction": "Dies ist eine potenziell gefaehrliche Aktion",
|
|
9
|
+
"roleChanged": "Berechtigung aktualisiert",
|
|
10
|
+
"roleChangedDescription": "Ihre Berechtigungen wurden aktualisiert. Die Seite wird aktualisiert, um die Aenderungen widerzuspiegeln.",
|
|
9
11
|
"roles": {
|
|
10
12
|
"owner": {
|
|
11
13
|
"title": "Eigentuemer",
|
|
@@ -1372,6 +1372,7 @@ declare const _default: {
|
|
|
1372
1372
|
};
|
|
1373
1373
|
actions: {
|
|
1374
1374
|
edit: string;
|
|
1375
|
+
viewDetails: string;
|
|
1375
1376
|
delete: string;
|
|
1376
1377
|
select: string;
|
|
1377
1378
|
cancel: string;
|
|
@@ -1514,6 +1515,8 @@ declare const _default: {
|
|
|
1514
1515
|
allPermissions: string;
|
|
1515
1516
|
permission: string;
|
|
1516
1517
|
dangerousAction: string;
|
|
1518
|
+
roleChanged: string;
|
|
1519
|
+
roleChangedDescription: string;
|
|
1517
1520
|
roles: {
|
|
1518
1521
|
owner: {
|
|
1519
1522
|
title: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/en/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/en/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,wBAqBU"}
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
"allPermissions": "All Permissions",
|
|
7
7
|
"permission": "Permission",
|
|
8
8
|
"dangerousAction": "This is a potentially dangerous action",
|
|
9
|
+
"roleChanged": "Permission Updated",
|
|
10
|
+
"roleChangedDescription": "Your permissions have been updated. The page will refresh to reflect the changes.",
|
|
9
11
|
"roles": {
|
|
10
12
|
"owner": {
|
|
11
13
|
"title": "Owner",
|
|
@@ -1360,6 +1360,7 @@ declare const _default: {
|
|
|
1360
1360
|
};
|
|
1361
1361
|
actions: {
|
|
1362
1362
|
edit: string;
|
|
1363
|
+
viewDetails: string;
|
|
1363
1364
|
delete: string;
|
|
1364
1365
|
select: string;
|
|
1365
1366
|
cancel: string;
|
|
@@ -1502,6 +1503,8 @@ declare const _default: {
|
|
|
1502
1503
|
allPermissions: string;
|
|
1503
1504
|
permission: string;
|
|
1504
1505
|
dangerousAction: string;
|
|
1506
|
+
roleChanged: string;
|
|
1507
|
+
roleChangedDescription: string;
|
|
1505
1508
|
roles: {
|
|
1506
1509
|
owner: {
|
|
1507
1510
|
title: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/es/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/es/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,wBAqBU"}
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
"allPermissions": "Todos los Permisos",
|
|
7
7
|
"permission": "Permiso",
|
|
8
8
|
"dangerousAction": "Esta es una acción potencialmente peligrosa",
|
|
9
|
+
"roleChanged": "Permiso Actualizado",
|
|
10
|
+
"roleChangedDescription": "Tus permisos han sido actualizados. La página se actualizará para reflejar los cambios.",
|
|
9
11
|
"roles": {
|
|
10
12
|
"owner": {
|
|
11
13
|
"title": "Propietario",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/fr/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/fr/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,wBAoBU"}
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
"allPermissions": "Toutes les permissions",
|
|
7
7
|
"permission": "Permission",
|
|
8
8
|
"dangerousAction": "Ceci est une action potentiellement dangereuse",
|
|
9
|
+
"roleChanged": "Permission mise a jour",
|
|
10
|
+
"roleChangedDescription": "Vos permissions ont ete mises a jour. La page va se rafraichir pour refleter les changements.",
|
|
9
11
|
"roles": {
|
|
10
12
|
"owner": {
|
|
11
13
|
"title": "Proprietaire",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/it/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/it/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,wBAoBU"}
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
"allPermissions": "Tutti i Permessi",
|
|
7
7
|
"permission": "Permesso",
|
|
8
8
|
"dangerousAction": "Questa e un'azione potenzialmente pericolosa",
|
|
9
|
+
"roleChanged": "Permesso aggiornato",
|
|
10
|
+
"roleChangedDescription": "I tuoi permessi sono stati aggiornati. La pagina si aggiornera per riflettere le modifiche.",
|
|
9
11
|
"roles": {
|
|
10
12
|
"owner": {
|
|
11
13
|
"title": "Proprietario",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/pt/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messages/pt/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,wBAoBU"}
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
"allPermissions": "Todas as Permissoes",
|
|
7
7
|
"permission": "Permissao",
|
|
8
8
|
"dangerousAction": "Esta e uma acao potencialmente perigosa",
|
|
9
|
+
"roleChanged": "Permissao atualizada",
|
|
10
|
+
"roleChangedDescription": "Suas permissoes foram atualizadas. A pagina sera atualizada para refletir as alteracoes.",
|
|
9
11
|
"roles": {
|
|
10
12
|
"owner": {
|
|
11
13
|
"title": "Proprietario",
|
|
@@ -152,3 +152,56 @@ END $$;
|
|
|
152
152
|
-- ============================================
|
|
153
153
|
-- No default media tags are seeded.
|
|
154
154
|
-- Users create their own tags on-the-fly via the media detail panel.
|
|
155
|
+
|
|
156
|
+
-- ============================================
|
|
157
|
+
-- TAXONOMIES: ADD teamId FOR TEAM-SCOPED TAGS
|
|
158
|
+
-- ============================================
|
|
159
|
+
-- Media tags need team isolation. This extends the existing taxonomies
|
|
160
|
+
-- table (006) to support both global and team-scoped taxonomies.
|
|
161
|
+
|
|
162
|
+
ALTER TABLE public.taxonomies
|
|
163
|
+
ADD COLUMN IF NOT EXISTS "teamId" TEXT REFERENCES public."teams"(id) ON DELETE CASCADE;
|
|
164
|
+
|
|
165
|
+
-- Update unique constraints to support both global and team-scoped taxonomies
|
|
166
|
+
-- Old: UNIQUE(type, slug) - global uniqueness
|
|
167
|
+
-- New: Two partial unique indexes:
|
|
168
|
+
-- 1. Global taxonomies (teamId IS NULL): unique by (type, slug)
|
|
169
|
+
-- 2. Team-scoped taxonomies (teamId IS NOT NULL): unique by (type, slug, teamId)
|
|
170
|
+
|
|
171
|
+
ALTER TABLE public.taxonomies
|
|
172
|
+
DROP CONSTRAINT IF EXISTS unique_taxonomy_type_slug;
|
|
173
|
+
|
|
174
|
+
-- Global taxonomies: unique slug per type
|
|
175
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_taxonomies_unique_global
|
|
176
|
+
ON public.taxonomies(type, slug)
|
|
177
|
+
WHERE "teamId" IS NULL;
|
|
178
|
+
|
|
179
|
+
-- Team-scoped taxonomies: unique slug per type per team
|
|
180
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_taxonomies_unique_team
|
|
181
|
+
ON public.taxonomies(type, slug, "teamId")
|
|
182
|
+
WHERE "teamId" IS NOT NULL;
|
|
183
|
+
|
|
184
|
+
-- Indexes for team queries
|
|
185
|
+
CREATE INDEX IF NOT EXISTS idx_taxonomies_team_id
|
|
186
|
+
ON public.taxonomies("teamId");
|
|
187
|
+
|
|
188
|
+
CREATE INDEX IF NOT EXISTS idx_taxonomies_type_team
|
|
189
|
+
ON public.taxonomies(type, "teamId")
|
|
190
|
+
WHERE "teamId" IS NOT NULL;
|
|
191
|
+
|
|
192
|
+
-- Update RLS: team members can see their team's taxonomies
|
|
193
|
+
DROP POLICY IF EXISTS "taxonomies auth can do all" ON public.taxonomies;
|
|
194
|
+
|
|
195
|
+
CREATE POLICY "taxonomies auth can do all"
|
|
196
|
+
ON public.taxonomies
|
|
197
|
+
FOR ALL TO authenticated
|
|
198
|
+
USING (
|
|
199
|
+
"teamId" IS NULL -- Global taxonomies visible to all authenticated
|
|
200
|
+
OR "teamId" = ANY(public.get_user_team_ids()) -- Team-scoped visible to members
|
|
201
|
+
OR public.is_superadmin()
|
|
202
|
+
)
|
|
203
|
+
WITH CHECK (
|
|
204
|
+
"teamId" IS NULL
|
|
205
|
+
OR "teamId" = ANY(public.get_user_team_ids())
|
|
206
|
+
OR public.is_superadmin()
|
|
207
|
+
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-provider.d.ts","sourceRoot":"","sources":["../../src/providers/query-provider.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query-provider.d.ts","sourceRoot":"","sources":["../../src/providers/query-provider.tsx"],"names":[],"mappings":"AASA,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CA0CxE"}
|
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
3
|
+
import { useState, useRef, useCallback, useEffect } from "react";
|
|
4
|
+
import { QueryClient, QueryClientProvider, MutationCache } from "@tanstack/react-query";
|
|
4
5
|
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
|
|
5
|
-
import {
|
|
6
|
+
import { useTranslations } from "next-intl";
|
|
7
|
+
import { toast } from "sonner";
|
|
8
|
+
import { ApiError } from "../lib/api/api-error.js";
|
|
6
9
|
function QueryProvider({ children }) {
|
|
10
|
+
const t = useTranslations("permissions");
|
|
11
|
+
const tRef = useRef(t);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
tRef.current = t;
|
|
14
|
+
}, [t]);
|
|
15
|
+
const handlePermissionDenied = useCallback(() => {
|
|
16
|
+
toast.info(tRef.current("roleChanged"), {
|
|
17
|
+
description: tRef.current("roleChangedDescription")
|
|
18
|
+
});
|
|
19
|
+
setTimeout(() => {
|
|
20
|
+
window.location.reload();
|
|
21
|
+
}, 1500);
|
|
22
|
+
}, []);
|
|
7
23
|
const [queryClient] = useState(
|
|
8
24
|
() => new QueryClient({
|
|
9
25
|
defaultOptions: {
|
|
@@ -11,7 +27,14 @@ function QueryProvider({ children }) {
|
|
|
11
27
|
staleTime: 60 * 1e3,
|
|
12
28
|
refetchOnWindowFocus: false
|
|
13
29
|
}
|
|
14
|
-
}
|
|
30
|
+
},
|
|
31
|
+
mutationCache: new MutationCache({
|
|
32
|
+
onError: (error) => {
|
|
33
|
+
if (error instanceof ApiError && error.isPermissionDenied()) {
|
|
34
|
+
handlePermissionDenied();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
})
|
|
15
38
|
})
|
|
16
39
|
);
|
|
17
40
|
return /* @__PURE__ */ jsxs(QueryClientProvider, { client: queryClient, children: [
|
package/dist/styles/classes.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"generated": "2026-02-
|
|
3
|
-
"totalClasses":
|
|
2
|
+
"generated": "2026-02-13T21:40:40.611Z",
|
|
3
|
+
"totalClasses": 1071,
|
|
4
4
|
"classes": [
|
|
5
5
|
"!text-2xl",
|
|
6
6
|
"''",
|
|
@@ -753,7 +753,6 @@
|
|
|
753
753
|
"placeholder:text-muted-foreground/50",
|
|
754
754
|
"pointer-events-auto",
|
|
755
755
|
"pointer-events-none",
|
|
756
|
-
"pr-1",
|
|
757
756
|
"pr-10",
|
|
758
757
|
"pr-2",
|
|
759
758
|
"pr-2.5",
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { NextRequest } from 'next/server'
|
|
2
|
-
import { authenticateRequest, hasRequiredScope } from '@nextsparkjs/core/lib/api/auth/dual-auth'
|
|
2
|
+
import { authenticateRequest, hasRequiredScope, resolveTeamContext } from '@nextsparkjs/core/lib/api/auth/dual-auth'
|
|
3
3
|
import { createApiResponse, createApiError } from '@nextsparkjs/core/lib/api/helpers'
|
|
4
|
+
import { API_ERROR_CODES } from '@nextsparkjs/core/lib/api/api-error'
|
|
5
|
+
import { checkPermission } from '@nextsparkjs/core/lib/permissions/check'
|
|
4
6
|
import { withRateLimitTier } from '@nextsparkjs/core/lib/api/rate-limit'
|
|
5
7
|
import { MediaService } from '@nextsparkjs/core/lib/services/media.service'
|
|
6
8
|
import { updateMediaSchema } from '@nextsparkjs/core/lib/media/schemas'
|
|
@@ -26,14 +28,24 @@ export const GET = withRateLimitTier(async (
|
|
|
26
28
|
|
|
27
29
|
// 2. Check permissions
|
|
28
30
|
if (!hasRequiredScope(authResult, 'media:read')) {
|
|
29
|
-
return createApiError('Insufficient permissions', 403)
|
|
31
|
+
return createApiError('Insufficient permissions', 403, undefined, API_ERROR_CODES.INSUFFICIENT_SCOPE)
|
|
30
32
|
}
|
|
31
33
|
|
|
32
|
-
// 3.
|
|
34
|
+
// 3. Resolve and validate team context
|
|
35
|
+
const teamResult = await resolveTeamContext(request, authResult)
|
|
36
|
+
if (teamResult instanceof Response) return teamResult
|
|
37
|
+
const teamId = teamResult
|
|
38
|
+
|
|
39
|
+
// 3b. Check role-based permission
|
|
40
|
+
if (!await checkPermission(authResult.user!.id, teamId, 'media.read')) {
|
|
41
|
+
return createApiError('Permission denied', 403, undefined, API_ERROR_CODES.PERMISSION_DENIED)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 4. Get media ID from params
|
|
33
45
|
const { id } = await params
|
|
34
46
|
|
|
35
|
-
//
|
|
36
|
-
const media = await MediaService.getById(id, authResult.user!.id)
|
|
47
|
+
// 5. Fetch media with team isolation
|
|
48
|
+
const media = await MediaService.getById(id, authResult.user!.id, teamId)
|
|
37
49
|
|
|
38
50
|
if (!media) {
|
|
39
51
|
return createApiError('Media not found', 404)
|
|
@@ -72,13 +84,23 @@ export const PATCH = withRateLimitTier(async (
|
|
|
72
84
|
|
|
73
85
|
// 2. Check permissions
|
|
74
86
|
if (!hasRequiredScope(authResult, 'media:write')) {
|
|
75
|
-
return createApiError('Insufficient permissions', 403)
|
|
87
|
+
return createApiError('Insufficient permissions', 403, undefined, API_ERROR_CODES.INSUFFICIENT_SCOPE)
|
|
76
88
|
}
|
|
77
89
|
|
|
78
|
-
// 3.
|
|
90
|
+
// 3. Resolve and validate team context
|
|
91
|
+
const teamResult = await resolveTeamContext(request, authResult)
|
|
92
|
+
if (teamResult instanceof Response) return teamResult
|
|
93
|
+
const teamId = teamResult
|
|
94
|
+
|
|
95
|
+
// 3b. Check role-based permission
|
|
96
|
+
if (!await checkPermission(authResult.user!.id, teamId, 'media.update')) {
|
|
97
|
+
return createApiError('Permission denied', 403, undefined, API_ERROR_CODES.PERMISSION_DENIED)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 4. Get media ID from params
|
|
79
101
|
const { id } = await params
|
|
80
102
|
|
|
81
|
-
//
|
|
103
|
+
// 5. Parse and validate request body
|
|
82
104
|
const body = await request.json()
|
|
83
105
|
const parsed = updateMediaSchema.safeParse(body)
|
|
84
106
|
|
|
@@ -88,8 +110,12 @@ export const PATCH = withRateLimitTier(async (
|
|
|
88
110
|
})
|
|
89
111
|
}
|
|
90
112
|
|
|
91
|
-
//
|
|
92
|
-
const media = await MediaService.update(id, authResult.user!.id, parsed.data)
|
|
113
|
+
// 6. Update media with team isolation
|
|
114
|
+
const media = await MediaService.update(id, authResult.user!.id, parsed.data, teamId)
|
|
115
|
+
|
|
116
|
+
if (!media) {
|
|
117
|
+
return createApiError('Media not found', 404)
|
|
118
|
+
}
|
|
93
119
|
|
|
94
120
|
return createApiResponse(media)
|
|
95
121
|
} catch (error) {
|
|
@@ -123,14 +149,24 @@ export const DELETE = withRateLimitTier(async (
|
|
|
123
149
|
|
|
124
150
|
// 2. Check permissions
|
|
125
151
|
if (!hasRequiredScope(authResult, 'media:delete')) {
|
|
126
|
-
return createApiError('Insufficient permissions', 403)
|
|
152
|
+
return createApiError('Insufficient permissions', 403, undefined, API_ERROR_CODES.INSUFFICIENT_SCOPE)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// 3. Resolve and validate team context
|
|
156
|
+
const teamResult = await resolveTeamContext(request, authResult)
|
|
157
|
+
if (teamResult instanceof Response) return teamResult
|
|
158
|
+
const teamId = teamResult
|
|
159
|
+
|
|
160
|
+
// 3b. Check role-based permission
|
|
161
|
+
if (!await checkPermission(authResult.user!.id, teamId, 'media.delete')) {
|
|
162
|
+
return createApiError('Permission denied', 403, undefined, API_ERROR_CODES.PERMISSION_DENIED)
|
|
127
163
|
}
|
|
128
164
|
|
|
129
|
-
//
|
|
165
|
+
// 4. Get media ID from params
|
|
130
166
|
const { id } = await params
|
|
131
167
|
|
|
132
|
-
//
|
|
133
|
-
const deleted = await MediaService.softDelete(id, authResult.user!.id)
|
|
168
|
+
// 5. Soft delete media with team isolation
|
|
169
|
+
const deleted = await MediaService.softDelete(id, authResult.user!.id, teamId)
|
|
134
170
|
|
|
135
171
|
if (!deleted) {
|
|
136
172
|
return createApiError('Media not found', 404)
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { NextRequest } from 'next/server'
|
|
2
|
-
import { authenticateRequest, hasRequiredScope } from '@nextsparkjs/core/lib/api/auth/dual-auth'
|
|
2
|
+
import { authenticateRequest, hasRequiredScope, resolveTeamContext } from '@nextsparkjs/core/lib/api/auth/dual-auth'
|
|
3
3
|
import { createApiResponse, createApiError } from '@nextsparkjs/core/lib/api/helpers'
|
|
4
|
+
import { API_ERROR_CODES } from '@nextsparkjs/core/lib/api/api-error'
|
|
5
|
+
import { checkPermission } from '@nextsparkjs/core/lib/permissions/check'
|
|
4
6
|
import { withRateLimitTier } from '@nextsparkjs/core/lib/api/rate-limit'
|
|
5
7
|
import { MediaService } from '@nextsparkjs/core/lib/services/media.service'
|
|
6
8
|
import { z } from 'zod'
|
|
@@ -29,11 +31,27 @@ export const GET = withRateLimitTier(async (
|
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
if (!hasRequiredScope(authResult, 'media:read')) {
|
|
32
|
-
return createApiError('Insufficient permissions', 403)
|
|
34
|
+
return createApiError('Insufficient permissions', 403, undefined, API_ERROR_CODES.INSUFFICIENT_SCOPE)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const teamResult = await resolveTeamContext(request, authResult)
|
|
38
|
+
if (teamResult instanceof Response) return teamResult
|
|
39
|
+
const teamId = teamResult
|
|
40
|
+
|
|
41
|
+
// Check role-based permission
|
|
42
|
+
if (!await checkPermission(authResult.user!.id, teamId, 'media.read')) {
|
|
43
|
+
return createApiError('Permission denied', 403, undefined, API_ERROR_CODES.PERMISSION_DENIED)
|
|
33
44
|
}
|
|
34
45
|
|
|
35
46
|
const { id } = await params
|
|
36
|
-
|
|
47
|
+
|
|
48
|
+
// Verify media belongs to team
|
|
49
|
+
const media = await MediaService.getById(id, authResult.user!.id, teamId)
|
|
50
|
+
if (!media) {
|
|
51
|
+
return createApiError('Media not found', 404)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const tags = await MediaService.getMediaTags(id, authResult.user!.id, teamId)
|
|
37
55
|
return createApiResponse(tags)
|
|
38
56
|
} catch (error) {
|
|
39
57
|
console.error('[Media Tags API] Error getting tags:', error)
|
|
@@ -58,10 +76,26 @@ export const POST = withRateLimitTier(async (
|
|
|
58
76
|
}
|
|
59
77
|
|
|
60
78
|
if (!hasRequiredScope(authResult, 'media:write')) {
|
|
61
|
-
return createApiError('Insufficient permissions', 403)
|
|
79
|
+
return createApiError('Insufficient permissions', 403, undefined, API_ERROR_CODES.INSUFFICIENT_SCOPE)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const teamResult = await resolveTeamContext(request, authResult)
|
|
83
|
+
if (teamResult instanceof Response) return teamResult
|
|
84
|
+
const teamId = teamResult
|
|
85
|
+
|
|
86
|
+
// Check role-based permission
|
|
87
|
+
if (!await checkPermission(authResult.user!.id, teamId, 'media.update')) {
|
|
88
|
+
return createApiError('Permission denied', 403, undefined, API_ERROR_CODES.PERMISSION_DENIED)
|
|
62
89
|
}
|
|
63
90
|
|
|
64
91
|
const { id } = await params
|
|
92
|
+
|
|
93
|
+
// Verify media belongs to team
|
|
94
|
+
const media = await MediaService.getById(id, authResult.user!.id, teamId)
|
|
95
|
+
if (!media) {
|
|
96
|
+
return createApiError('Media not found', 404)
|
|
97
|
+
}
|
|
98
|
+
|
|
65
99
|
const body = await request.json()
|
|
66
100
|
const parsed = addTagSchema.safeParse(body)
|
|
67
101
|
|
|
@@ -70,7 +104,7 @@ export const POST = withRateLimitTier(async (
|
|
|
70
104
|
}
|
|
71
105
|
|
|
72
106
|
await MediaService.addTag(id, parsed.data.tagId, authResult.user!.id)
|
|
73
|
-
const tags = await MediaService.getMediaTags(id, authResult.user!.id)
|
|
107
|
+
const tags = await MediaService.getMediaTags(id, authResult.user!.id, teamId)
|
|
74
108
|
|
|
75
109
|
return createApiResponse(tags, undefined, 201)
|
|
76
110
|
} catch (error) {
|
|
@@ -96,10 +130,26 @@ export const PUT = withRateLimitTier(async (
|
|
|
96
130
|
}
|
|
97
131
|
|
|
98
132
|
if (!hasRequiredScope(authResult, 'media:write')) {
|
|
99
|
-
return createApiError('Insufficient permissions', 403)
|
|
133
|
+
return createApiError('Insufficient permissions', 403, undefined, API_ERROR_CODES.INSUFFICIENT_SCOPE)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const teamResult = await resolveTeamContext(request, authResult)
|
|
137
|
+
if (teamResult instanceof Response) return teamResult
|
|
138
|
+
const teamId = teamResult
|
|
139
|
+
|
|
140
|
+
// Check role-based permission
|
|
141
|
+
if (!await checkPermission(authResult.user!.id, teamId, 'media.update')) {
|
|
142
|
+
return createApiError('Permission denied', 403, undefined, API_ERROR_CODES.PERMISSION_DENIED)
|
|
100
143
|
}
|
|
101
144
|
|
|
102
145
|
const { id } = await params
|
|
146
|
+
|
|
147
|
+
// Verify media belongs to team
|
|
148
|
+
const media = await MediaService.getById(id, authResult.user!.id, teamId)
|
|
149
|
+
if (!media) {
|
|
150
|
+
return createApiError('Media not found', 404)
|
|
151
|
+
}
|
|
152
|
+
|
|
103
153
|
const body = await request.json()
|
|
104
154
|
const parsed = setTagsSchema.safeParse(body)
|
|
105
155
|
|
|
@@ -108,7 +158,7 @@ export const PUT = withRateLimitTier(async (
|
|
|
108
158
|
}
|
|
109
159
|
|
|
110
160
|
await MediaService.setTags(id, parsed.data.tagIds, authResult.user!.id)
|
|
111
|
-
const tags = await MediaService.getMediaTags(id, authResult.user!.id)
|
|
161
|
+
const tags = await MediaService.getMediaTags(id, authResult.user!.id, teamId)
|
|
112
162
|
|
|
113
163
|
return createApiResponse(tags)
|
|
114
164
|
} catch (error) {
|
|
@@ -133,11 +183,27 @@ export const DELETE = withRateLimitTier(async (
|
|
|
133
183
|
return createApiError('Unauthorized', 401)
|
|
134
184
|
}
|
|
135
185
|
|
|
136
|
-
if (!hasRequiredScope(authResult, 'media:
|
|
137
|
-
return createApiError('Insufficient permissions', 403)
|
|
186
|
+
if (!hasRequiredScope(authResult, 'media:write')) {
|
|
187
|
+
return createApiError('Insufficient permissions', 403, undefined, API_ERROR_CODES.INSUFFICIENT_SCOPE)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const teamResult = await resolveTeamContext(request, authResult)
|
|
191
|
+
if (teamResult instanceof Response) return teamResult
|
|
192
|
+
const teamId = teamResult
|
|
193
|
+
|
|
194
|
+
// Check role-based permission (removing a tag is an update action, not media deletion)
|
|
195
|
+
if (!await checkPermission(authResult.user!.id, teamId, 'media.update')) {
|
|
196
|
+
return createApiError('Permission denied', 403, undefined, API_ERROR_CODES.PERMISSION_DENIED)
|
|
138
197
|
}
|
|
139
198
|
|
|
140
199
|
const { id } = await params
|
|
200
|
+
|
|
201
|
+
// Verify media belongs to team
|
|
202
|
+
const media = await MediaService.getById(id, authResult.user!.id, teamId)
|
|
203
|
+
if (!media) {
|
|
204
|
+
return createApiError('Media not found', 404)
|
|
205
|
+
}
|
|
206
|
+
|
|
141
207
|
const { searchParams } = new URL(request.url)
|
|
142
208
|
const tagId = searchParams.get('tagId')
|
|
143
209
|
|