Rola „Agencja marketingowa" (MARKETING)
Rola MARKETING daje zewnętrznej agencji dostęp do panelu ograniczony do dwóch obszarów:
Statystyk i Ustawień marketingowych (Meta Pixel / Conversions API oraz Google Ads).
Wszystkie pozostałe sekcje panelu — rezerwacje, płatności, dane klientów, kasa, ustawienia —
są dla niej niedostępne.
👤 Instrukcja dla administratora
Nadanie roli
- Wejdź w Panel administratora → Pracownicy.
- Utwórz konto (lub wejdź w istniejące) i w polu Rola wybierz Agencja marketingowa.
- Zapisz. Konto dostanie zaproszenie mailem do ustawienia hasła.
Co widzi agencja
Po zalogowaniu agencja trafia od razu na Statystyki (nie na Grafik, jak reszta personelu). W menu bocznym ma jedną pozycję — Marketing — z dwoma wpisami:
- Statystyki – wszystkie zakładki statystyk (Uczestnicy, Dashboard L1, Sprzedaż, LEADS CRM, Retencja, Dosprzedaż, Obłożenie, Jakość, Tygodniowy, Segmentacja, Konwersja próbnych, Wykorzystanie stron, Własne propozycje).
- Marketing i Meta – konfiguracja Meta Pixel / CAPI oraz Google Ads.
Wpisanie w pasku adresu dowolnego innego adresu panelu kończy się stroną 404.
Zmiana zakresu roli
Zakres roli to dane, nie kod. Żeby dodać lub odebrać agencji dostęp do konkretnej strony:
- Wejdź w Panel administratora → Dostęp do tras.
- Znajdź trasę (np.
/dashboard/mailing). - Zaznacz lub odznacz rolę MARKETING na liście dozwolonych ról.
Zmiana działa po wygaśnięciu cache trasy (do 60 sekund).
Strona Marketing i Meta zawiera również ustawienia Google Ads. Nadanie dostępu do tej strony oznacza dostęp do obu integracji, łącznie z tokenami dostępowymi.
🛠️ Dokumentacja techniczna
Model uprawnień
MARKETING jest rolą o zawężonym zakresie (scoped role): w przeciwieństwie do
BACKOFFICE i INSTRUCTOR nie widzi stron, które nie mają wiersza w tabeli route_access.
| Rola | Strona bez wiersza w route_access |
|---|---|
ADMIN | dostęp (fast path w getIsRouteAllowed) |
BACKOFFICE, INSTRUCTOR, CLIENT | brak dostępu w menu, brak twardej blokady serwerowej |
MARKETING | 404 z layoutu dashboardu |
Powód rozdziału: większość z 113 stron panelu nigdy nie dostała wiersza w route_access.
Zaostrzenie reguły dla BACKOFFICE czy INSTRUCTOR odcięłoby ich od stron, z których
codziennie korzystają, więc twarda blokada obejmuje wyłącznie role wymienione w
SCOPED_ROLES (lib/utils/server-route-access.ts).
Przepływ żądania
Server Components nie mają dostępu do ścieżki żądania, dlatego middleware przekazuje ją
nagłówkiem x-pathname (NextResponse.next({ request: { headers } })). OpenNext odtwarza
nadpisania nagłówków z middleware, więc mechanizm działa też w buildzie workerowym.
Bramka jest fail-closed: jeśli nagłówek nie dotrze, isPathAllowedForScopedRole zwraca
false. Agencja zobaczy wtedy 404 zamiast całego panelu. Odmowa renderuje notFound(),
a nie przekierowanie — przekierowanie zapętliłoby się, gdy nieznana jest właśnie ścieżka.
Kluczowe pliki
| Plik | Rola |
|---|---|
types/index.ts | UserRole z wariantem MARKETING, pole NavItem.roles |
lib/utils/server-route-access.ts | SCOPED_ROLES, isScopedRole, isPathAllowedForScopedRole |
lib/utils/request-pathname.ts | stała nagłówka x-pathname i jej walidacja |
middleware.ts | nextWithPathname() — przekazanie ścieżki do layoutu |
app/(dashboard)/dashboard/layout.tsx | bramka serwerowa dla ról o zawężonym zakresie |
lib/variants/routing.ts | STAFF_ROLES, resolveHomePath() — agencja ląduje na statystykach |
constants/data.ts | grupa menu „Marketing" widoczna tylko dla MARKETING |
components/dashboard-nav.tsx | filtr item.roles |
lib/actions/users.ts | employeeRoles — rola do wyboru przy tworzeniu pracownika |
migrations/0244_add_marketing_agency_role_routes.sql | wpisy route_access dla roli |
Server actions
getMetaTrackingSettingsForAdmin i getGoogleAdsTrackingSettingsForAdmin (wraz z akcjami
zapisu) przepuszczają role ADMIN i MARKETING. Akcje statystyk nie mają własnych kontroli
roli — chroni je bramka layoutu.
Migracja
0244_add_marketing_agency_role_routes.sql:
- dodaje brakujące wiersze dla
/dashboard/statisticsi/dashboard/marketing-settings(wcześniej obie strony działały wyłącznie dzięki fast-pathowiADMIN), - dopisuje
MARKETINGdoallowed_roleswszystkich tras/dashboard/statistics*oraz/dashboard/marketing-settings.
Migracja jest idempotentna — powtórne uruchomienie nie duplikuje roli ani wierszy.