feat: add new publisher permission level

This commit is contained in:
Chris Anderson 2025-07-18 14:30:49 -05:00
parent badcc467b6
commit 448d4508aa
5 changed files with 25 additions and 13 deletions

View file

@ -181,9 +181,13 @@ router.post('/:journeyId/version', async ctx => {
ctx.body = await duplicateJourney(ctx.state.journey!, true)
})
router.post('/:journeyId/publish', async ctx => {
ctx.body = await publishJourney(ctx.state.journey!)
})
router.post(
'/:journeyId/publish',
projectRoleMiddleware('publisher'),
async ctx => {
ctx.body = await publishJourney(ctx.state.journey!)
},
)
router.get('/:journeyId/entrances', async ctx => {
const params = extractQueryParams(ctx.query, searchParamsSchema)

View file

@ -18,6 +18,7 @@ export type ProjectParams = Omit<Project, ModelParams | 'deleted_at' | 'organiza
export const projectRoles = [
'support',
'editor',
'publisher',
'admin',
] as const

View file

@ -162,6 +162,7 @@ export type OrganizationUpdateParams = Omit<Organization, 'id' | 'auth' | AuditF
export const projectRoles = [
'support',
'editor',
'publisher',
'admin',
] as const

View file

@ -4,7 +4,7 @@ import { Outlet } from 'react-router'
import { NavigationTabs } from '../../ui/Tabs'
import { useContext, useEffect, useState } from 'react'
import { CampaignContext, LocaleContext, LocaleSelection, ProjectContext } from '../../contexts'
import { languageName } from '../../utils'
import { checkProjectRole, languageName } from '../../utils'
import { Campaign, LocaleOption, Template } from '../../types'
import api from '../../api'
import { CampaignTag } from './Campaigns'
@ -152,7 +152,11 @@ export default function CampaignDetail() {
progress={progress}
send_at={send_at}
/>}
actions={campaign.type !== 'trigger' && action[state]}
actions={
checkProjectRole('publisher', project.role) && (
campaign.type !== 'trigger' && action[state]
)
}
fullscreen={true}>
<NavigationTabs tabs={tabs} />
<LocaleContext.Provider value={[locale, setLocale]}>

View file

@ -30,7 +30,7 @@ import ReactFlow, {
useReactFlow,
} from 'reactflow'
import { JourneyContext, ProjectContext } from '../../contexts'
import { createComparator, createUuid } from '../../utils'
import { checkProjectRole, createComparator, createUuid } from '../../utils'
import * as journeySteps from './steps/index'
import clsx from 'clsx'
import api from '../../api'
@ -704,13 +704,15 @@ export default function JourneyEditor() {
>
{t('edit_details')}
</Button>}
<Button
onClick={publishJourney}
isLoading={saving}
variant="secondary"
>
{t('publish')}
</Button>
{checkProjectRole('publisher', project.role) && (
<Button
onClick={publishJourney}
isLoading={saving}
variant="secondary"
>
{t('publish')}
</Button>
)}
<Button
onClick={saveSteps}
isLoading={saving}