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.