auth: guarda server-side em rotas protegidas

- /tickets/[id], /tickets/resolved, /views, /play, /reports/*, /settings agora exigem sessão via requireAuthenticatedSession()
- Complementa o middleware e evita casos não-redirecionados em DEV/SSG
- Mantém /settings/templates com requireStaffSession() como já estava.
This commit is contained in:
Esdras Renan 2025-10-14 10:59:09 -03:00
parent d7dd37f90f
commit 9ac584dcb6
9 changed files with 32 additions and 16 deletions

View file

@ -2,8 +2,10 @@ import { AppShell } from "@/components/app-shell"
import { SiteHeader } from "@/components/site-header" import { SiteHeader } from "@/components/site-header"
import { PlayNextTicketCard } from "@/components/tickets/play-next-ticket-card" import { PlayNextTicketCard } from "@/components/tickets/play-next-ticket-card"
import { TicketQueueSummaryCards } from "@/components/tickets/ticket-queue-summary" import { TicketQueueSummaryCards } from "@/components/tickets/ticket-queue-summary"
import { requireAuthenticatedSession } from "@/lib/auth-server"
export default function PlayPage() { export default async function PlayPage() {
await requireAuthenticatedSession()
return ( return (
<AppShell <AppShell
header={ header={

View file

@ -1,10 +1,12 @@
import { AppShell } from "@/components/app-shell" import { AppShell } from "@/components/app-shell"
import { BacklogReport } from "@/components/reports/backlog-report" import { BacklogReport } from "@/components/reports/backlog-report"
import { SiteHeader } from "@/components/site-header" import { SiteHeader } from "@/components/site-header"
import { requireAuthenticatedSession } from "@/lib/auth-server"
export const dynamic = "force-dynamic" export const dynamic = "force-dynamic"
export default function ReportsBacklogPage() { export default async function ReportsBacklogPage() {
await requireAuthenticatedSession()
return ( return (
<AppShell <AppShell
header={ header={

View file

@ -1,10 +1,12 @@
import { AppShell } from "@/components/app-shell" import { AppShell } from "@/components/app-shell"
import { CsatReport } from "@/components/reports/csat-report" import { CsatReport } from "@/components/reports/csat-report"
import { SiteHeader } from "@/components/site-header" import { SiteHeader } from "@/components/site-header"
import { requireAuthenticatedSession } from "@/lib/auth-server"
export const dynamic = "force-dynamic" export const dynamic = "force-dynamic"
export default function ReportsCsatPage() { export default async function ReportsCsatPage() {
await requireAuthenticatedSession()
return ( return (
<AppShell <AppShell
header={ header={

View file

@ -1,10 +1,12 @@
import { AppShell } from "@/components/app-shell" import { AppShell } from "@/components/app-shell"
import { SiteHeader } from "@/components/site-header" import { SiteHeader } from "@/components/site-header"
import { HoursReport } from "@/components/reports/hours-report" import { HoursReport } from "@/components/reports/hours-report"
import { requireAuthenticatedSession } from "@/lib/auth-server"
export const dynamic = "force-dynamic" export const dynamic = "force-dynamic"
export default function ReportsHoursPage() { export default async function ReportsHoursPage() {
await requireAuthenticatedSession()
return ( return (
<AppShell <AppShell
header={ header={
@ -20,4 +22,3 @@ export default function ReportsHoursPage() {
</AppShell> </AppShell>
) )
} }

View file

@ -1,10 +1,12 @@
import { AppShell } from "@/components/app-shell" import { AppShell } from "@/components/app-shell"
import { SlaReport } from "@/components/reports/sla-report" import { SlaReport } from "@/components/reports/sla-report"
import { SiteHeader } from "@/components/site-header" import { SiteHeader } from "@/components/site-header"
import { requireAuthenticatedSession } from "@/lib/auth-server"
export const dynamic = "force-dynamic" export const dynamic = "force-dynamic"
export default function ReportsSlaPage() { export default async function ReportsSlaPage() {
await requireAuthenticatedSession()
return ( return (
<AppShell <AppShell
header={ header={

View file

@ -1,8 +1,10 @@
import { AppShell } from "@/components/app-shell" import { AppShell } from "@/components/app-shell"
import { SettingsContent } from "@/components/settings/settings-content" import { SettingsContent } from "@/components/settings/settings-content"
import { SiteHeader } from "@/components/site-header" import { SiteHeader } from "@/components/site-header"
import { requireAuthenticatedSession } from "@/lib/auth-server"
export default function SettingsPage() { export default async function SettingsPage() {
await requireAuthenticatedSession()
return ( return (
<AppShell <AppShell
header={<SiteHeader title="Configurações" lead="Central de preferências e governança do workspace" />} header={<SiteHeader title="Configurações" lead="Central de preferências e governança do workspace" />}

View file

@ -5,12 +5,14 @@ import { TicketDetailStatic } from "@/components/tickets/ticket-detail-static"
import { NewTicketDialogDeferred } from "@/components/tickets/new-ticket-dialog.client" import { NewTicketDialogDeferred } from "@/components/tickets/new-ticket-dialog.client"
import { getTicketById } from "@/lib/mocks/tickets" import { getTicketById } from "@/lib/mocks/tickets"
import type { TicketWithDetails } from "@/lib/schemas/ticket" import type { TicketWithDetails } from "@/lib/schemas/ticket"
import { requireAuthenticatedSession } from "@/lib/auth-server"
type TicketDetailPageProps = { type TicketDetailPageProps = {
params: Promise<{ id: string }> params: Promise<{ id: string }>
} }
export default async function TicketDetailPage({ params }: TicketDetailPageProps) { export default async function TicketDetailPage({ params }: TicketDetailPageProps) {
await requireAuthenticatedSession()
const { id } = await params const { id } = await params
const isMock = id.startsWith("ticket-") const isMock = id.startsWith("ticket-")
const mock = isMock ? getTicketById(id) : null const mock = isMock ? getTicketById(id) : null

View file

@ -1,5 +1,7 @@
import { TicketsResolvedPageClient } from "./tickets-resolved-page-client" import { TicketsResolvedPageClient } from "./tickets-resolved-page-client"
import { requireAuthenticatedSession } from "@/lib/auth-server"
export default function TicketsResolvedPage() { export default async function TicketsResolvedPage() {
await requireAuthenticatedSession()
return <TicketsResolvedPageClient /> return <TicketsResolvedPageClient />
} }

View file

@ -2,10 +2,12 @@ import { AppShell } from "@/components/app-shell"
import { SiteHeader } from "@/components/site-header" import { SiteHeader } from "@/components/site-header"
import { ChartAreaInteractive } from "@/components/chart-area-interactive" import { ChartAreaInteractive } from "@/components/chart-area-interactive"
import { ViewsCharts } from "@/components/charts/views-charts" import { ViewsCharts } from "@/components/charts/views-charts"
import { requireAuthenticatedSession } from "@/lib/auth-server"
export const dynamic = "force-dynamic" export const dynamic = "force-dynamic"
export default function ViewsPage() { export default async function ViewsPage() {
await requireAuthenticatedSession()
return ( return (
<AppShell <AppShell
header={<SiteHeader title="Visualizações" lead="Relatórios visuais e insights" />} header={<SiteHeader title="Visualizações" lead="Relatórios visuais e insights" />}
@ -19,4 +21,3 @@ export default function ViewsPage() {
</AppShell> </AppShell>
) )
} }