fix(missions): enforce access control on dashboard and intel mission queries
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
parent
486fdca2a0
commit
0fa6d9abb5
4 changed files with 27 additions and 0 deletions
|
|
@ -2,6 +2,7 @@ import config from "@payload-config";
|
||||||
import { getPayload } from "payload";
|
import { getPayload } from "payload";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
|
import { headers as nextHeaders } from "next/headers";
|
||||||
import type { Faction, Media, Mission } from "@/payload-types";
|
import type { Faction, Media, Mission } from "@/payload-types";
|
||||||
import { RichText } from "@payloadcms/richtext-lexical/react";
|
import { RichText } from "@payloadcms/richtext-lexical/react";
|
||||||
import { ClientDate } from "@/components/frontend/ClientDate";
|
import { ClientDate } from "@/components/frontend/ClientDate";
|
||||||
|
|
@ -37,6 +38,10 @@ const factionTypeColors: Record<string, string> = {
|
||||||
export default async function CampaignDetailPage({ params }: CampaignDetailPageProps) {
|
export default async function CampaignDetailPage({ params }: CampaignDetailPageProps) {
|
||||||
const { id } = await params;
|
const { id } = await params;
|
||||||
const payload = await getPayload({ config });
|
const payload = await getPayload({ config });
|
||||||
|
const { user } = await payload.auth({
|
||||||
|
headers: await nextHeaders(),
|
||||||
|
canSetHeaders: false,
|
||||||
|
});
|
||||||
|
|
||||||
const campaign = await payload
|
const campaign = await payload
|
||||||
.findByID({
|
.findByID({
|
||||||
|
|
@ -81,6 +86,8 @@ export default async function CampaignDetailPage({ params }: CampaignDetailPageP
|
||||||
sort: "-classification.startDateTime",
|
sort: "-classification.startDateTime",
|
||||||
limit: 100,
|
limit: 100,
|
||||||
depth: 1,
|
depth: 1,
|
||||||
|
user,
|
||||||
|
overrideAccess: false,
|
||||||
select: {
|
select: {
|
||||||
name: true,
|
name: true,
|
||||||
codeName: true,
|
codeName: true,
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import config from "@payload-config";
|
import config from "@payload-config";
|
||||||
import { getPayload } from "payload";
|
import { getPayload } from "payload";
|
||||||
|
import { headers as nextHeaders } from "next/headers";
|
||||||
import { ShieldIcon } from "lucide-react";
|
import { ShieldIcon } from "lucide-react";
|
||||||
import { CampaignCard } from "@/components/frontend/intelligence/CampaignCard";
|
import { CampaignCard } from "@/components/frontend/intelligence/CampaignCard";
|
||||||
import { CreateCampaignDialog } from "@/components/frontend/intelligence/CreateCampaignDialog";
|
import { CreateCampaignDialog } from "@/components/frontend/intelligence/CreateCampaignDialog";
|
||||||
|
|
@ -12,6 +13,10 @@ export const metadata = {
|
||||||
|
|
||||||
export default async function CampaignsPage() {
|
export default async function CampaignsPage() {
|
||||||
const payload = await getPayload({ config });
|
const payload = await getPayload({ config });
|
||||||
|
const { user } = await payload.auth({
|
||||||
|
headers: await nextHeaders(),
|
||||||
|
canSetHeaders: false,
|
||||||
|
});
|
||||||
|
|
||||||
const campaignsRes = await payload.find({
|
const campaignsRes = await payload.find({
|
||||||
collection: "campaigns",
|
collection: "campaigns",
|
||||||
|
|
@ -49,6 +54,8 @@ export default async function CampaignsPage() {
|
||||||
where: { "classification.campaign": { equals: campaign.id } },
|
where: { "classification.campaign": { equals: campaign.id } },
|
||||||
depth: 0,
|
depth: 0,
|
||||||
limit: 100,
|
limit: 100,
|
||||||
|
user,
|
||||||
|
overrideAccess: false,
|
||||||
select: {
|
select: {
|
||||||
missionRoles: true,
|
missionRoles: true,
|
||||||
classification: true,
|
classification: true,
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import config from "@payload-config";
|
||||||
import { getPayload } from "payload";
|
import { getPayload } from "payload";
|
||||||
import { notFound } from "next/navigation";
|
import { notFound } from "next/navigation";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
|
import { headers as nextHeaders } from "next/headers";
|
||||||
import type { BankAccount, Campaign, Faction, Media, Mission, Resource } from "@/payload-types";
|
import type { BankAccount, Campaign, Faction, Media, Mission, Resource } from "@/payload-types";
|
||||||
import { RichText } from "@payloadcms/richtext-lexical/react";
|
import { RichText } from "@payloadcms/richtext-lexical/react";
|
||||||
import { convertLexicalToPlaintext } from "@payloadcms/richtext-lexical/plaintext";
|
import { convertLexicalToPlaintext } from "@payloadcms/richtext-lexical/plaintext";
|
||||||
|
|
@ -72,6 +73,10 @@ function relationshipTone(value: number): { bar: string; text: string; label: st
|
||||||
export default async function FactionDetailPage({ params }: FactionDetailPageProps) {
|
export default async function FactionDetailPage({ params }: FactionDetailPageProps) {
|
||||||
const { id } = await params;
|
const { id } = await params;
|
||||||
const payload = await getPayload({ config });
|
const payload = await getPayload({ config });
|
||||||
|
const { user } = await payload.auth({
|
||||||
|
headers: await nextHeaders(),
|
||||||
|
canSetHeaders: false,
|
||||||
|
});
|
||||||
|
|
||||||
const faction = await payload
|
const faction = await payload
|
||||||
.findByID({
|
.findByID({
|
||||||
|
|
@ -126,6 +131,8 @@ export default async function FactionDetailPage({ params }: FactionDetailPagePro
|
||||||
sort: "-classification.startDateTime",
|
sort: "-classification.startDateTime",
|
||||||
limit: 100,
|
limit: 100,
|
||||||
depth: 1,
|
depth: 1,
|
||||||
|
user,
|
||||||
|
overrideAccess: false,
|
||||||
select: {
|
select: {
|
||||||
name: true,
|
name: true,
|
||||||
codeName: true,
|
codeName: true,
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,8 @@ export default async function HomePage() {
|
||||||
sort: "classification.startDateTime",
|
sort: "classification.startDateTime",
|
||||||
limit: 5,
|
limit: 5,
|
||||||
depth: 2,
|
depth: 2,
|
||||||
|
user,
|
||||||
|
overrideAccess: false,
|
||||||
})
|
})
|
||||||
.catch(() => ({ docs: [] }));
|
.catch(() => ({ docs: [] }));
|
||||||
|
|
||||||
|
|
@ -89,6 +91,8 @@ export default async function HomePage() {
|
||||||
sort: "-classification.startDateTime",
|
sort: "-classification.startDateTime",
|
||||||
limit: 1,
|
limit: 1,
|
||||||
depth: 2,
|
depth: 2,
|
||||||
|
user,
|
||||||
|
overrideAccess: false,
|
||||||
})
|
})
|
||||||
.catch(() => ({ docs: [] }));
|
.catch(() => ({ docs: [] }));
|
||||||
briefingMission = completedRes.docs[0] ?? null;
|
briefingMission = completedRes.docs[0] ?? null;
|
||||||
|
|
@ -185,6 +189,8 @@ export default async function HomePage() {
|
||||||
.find({
|
.find({
|
||||||
collection: "missions",
|
collection: "missions",
|
||||||
limit: 0,
|
limit: 0,
|
||||||
|
user,
|
||||||
|
overrideAccess: false,
|
||||||
})
|
})
|
||||||
.catch(() => ({ totalDocs: 0 })),
|
.catch(() => ({ totalDocs: 0 })),
|
||||||
payload.find({
|
payload.find({
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue