Skip to main content

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

  1. Wejdź w Panel administratora → Pracownicy.
  2. Utwórz konto (lub wejdź w istniejące) i w polu Rola wybierz Agencja marketingowa.
  3. 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:

  1. Wejdź w Panel administratora → Dostęp do tras.
  2. Znajdź trasę (np. /dashboard/mailing).
  3. Zaznacz lub odznacz rolę MARKETING na liście dozwolonych ról.

Zmiana działa po wygaśnięciu cache trasy (do 60 sekund).

warning

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.

RolaStrona bez wiersza w route_access
ADMINdostęp (fast path w getIsRouteAllowed)
BACKOFFICE, INSTRUCTOR, CLIENTbrak dostępu w menu, brak twardej blokady serwerowej
MARKETING404 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

PlikRola
types/index.tsUserRole z wariantem MARKETING, pole NavItem.roles
lib/utils/server-route-access.tsSCOPED_ROLES, isScopedRole, isPathAllowedForScopedRole
lib/utils/request-pathname.tsstała nagłówka x-pathname i jej walidacja
middleware.tsnextWithPathname() — przekazanie ścieżki do layoutu
app/(dashboard)/dashboard/layout.tsxbramka serwerowa dla ról o zawężonym zakresie
lib/variants/routing.tsSTAFF_ROLES, resolveHomePath() — agencja ląduje na statystykach
constants/data.tsgrupa menu „Marketing" widoczna tylko dla MARKETING
components/dashboard-nav.tsxfiltr item.roles
lib/actions/users.tsemployeeRoles — rola do wyboru przy tworzeniu pracownika
migrations/0244_add_marketing_agency_role_routes.sqlwpisy 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/statistics i /dashboard/marketing-settings (wcześniej obie strony działały wyłącznie dzięki fast-pathowi ADMIN),
  • dopisuje MARKETING do allowed_roles wszystkich tras /dashboard/statistics* oraz /dashboard/marketing-settings.

Migracja jest idempotentna — powtórne uruchomienie nie duplikuje roli ani wierszy.