Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
f0352bb
feat: add migration for project_invites table creation and deletion
IamKirbki Apr 20, 2026
73e20bb
feat: implement project invite creation functionality
IamKirbki Apr 20, 2026
c02d596
feat: add project invite management functionality
IamKirbki Apr 21, 2026
93c6e9c
feat: add project invite management features
IamKirbki Apr 22, 2026
212801b
feat: add inviter admin email and filter to project invites management
IamKirbki Apr 23, 2026
3d1d15c
feat: implement project invite acceptance and registration flow
IamKirbki Apr 24, 2026
d3d41d0
feat: update project invite roles and permissions, enhance role hiera…
IamKirbki Apr 28, 2026
c988724
feat: update project roles and permissions, remove owner role from ce…
IamKirbki Apr 28, 2026
7f6dcd6
feat: remove owner role from project roles and update imports in Invi…
IamKirbki Apr 28, 2026
ec1f820
feat(invites): enhance project invite system with encryption of the t…
IamKirbki May 1, 2026
293ce5e
feat(invites): refactor invite handling logic and enhance role manage…
IamKirbki May 1, 2026
f9b548a
Hotfix: hopefully fixed the tests
IamKirbki May 1, 2026
a586a45
feat: removed the default role in the oapi function on projects.go
IamKirbki May 1, 2026
f2254e2
feat(invites): update randomString function to return error and handl…
IamKirbki May 1, 2026
0200b46
feat(providers): refactor push provider handling and introduce mail p…
IamKirbki May 5, 2026
3ed9a1b
feat(store): align formatting of store initialization for consistency
IamKirbki May 5, 2026
bd3f22c
feat: update push provider platform terminology from 'mail' to 'email'
IamKirbki May 5, 2026
5044126
Merge branch 'main' of github.com:lunogram/platform into feat/invites
IamKirbki May 5, 2026
903059b
feat(integration): update rate limit handling to support structured r…
IamKirbki May 5, 2026
7aabfdf
Refactor invite token handling and update project push provider platform
IamKirbki May 6, 2026
6df19ef
feat(invites): implement enterprise invite management functionality
IamKirbki May 6, 2026
232b139
fix: disable eslint rule for scheduledAt input change handler
IamKirbki May 6, 2026
e4b293e
feat: implement project push provider management functionality
IamKirbki May 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16,096 changes: 0 additions & 16,096 deletions console/package-lock.json

This file was deleted.

4,269 changes: 1,973 additions & 2,296 deletions console/pnpm-lock.yaml

Large diffs are not rendered by default.

13 changes: 13 additions & 0 deletions console/public/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -463,6 +463,19 @@
"invalid_email": "Invalid Email",
"invalid_json": "Invalid JSON syntax",
"invite_to_project": "Invite to Project",
"invites": "Invites",
"create_invite": "Create Invite",
"create_invite_description": "Invite a team member to your project.",
"revoke_invite_confirmation": "Are you sure you want to revoke this invite?",
"invite_revoked": "Invite revoked",
"copied_invite_link": "Copied invite link",
"invite_permission_denied": "You need admin or owner role to create invites.",
"no_invites_yet": "No invites yet",
"copy_link": "Copy Link",
"revoke": "Revoke",
"invite_created": "Invite created",
"expires": "Expires",
"expires_in": "Expires in",
"joined_list_at": "Joined List At",
"onboarding_integration_title": "Set up an Integration",
"onboarding_integration_description": "Connect a provider to start sending messages. You can always add more later.",
Expand Down
13 changes: 13 additions & 0 deletions console/public/locales/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,19 @@
"in_timezone": "En zona horaria",
"integrations": "Integraciones",
"invite_to_project": "Invitar al Proyecto",
"invites": "Invitaciones",
"create_invite": "Crear invitación",
"create_invite_description": "Invita a un miembro del equipo a tu proyecto.",
"revoke_invite_confirmation": "¿Estás seguro de que quieres revocar esta invitación?",
"invite_revoked": "Invitación revocada",
"copied_invite_link": "Enlace de invitación copiado",
"invite_permission_denied": "Necesitas rol de administrador o propietario para crear invitaciones.",
"no_invites_yet": "No hay invitaciones todavía",
"copy_link": "Copiar enlace",
"revoke": "Revocar",
"invite_created": "Invitación creada",
"expires": "Expira",
"expires_in": "Expira en",
"joined_list_at": "Añadido a La Lista En",
"journey": "Camino",
"journey_saved": "¡Camino Salvado!",
Expand Down
13 changes: 13 additions & 0 deletions console/public/locales/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,19 @@
"in_timezone": "在时区",
"integrations": "集成",
"invite_to_project": "邀请加入项目",
"invites": "邀请",
"create_invite": "创建邀请",
"create_invite_description": "邀请团队成员加入您的项目。",
"revoke_invite_confirmation": "确定要撤销此邀请吗?",
"invite_revoked": "邀请已撤销",
"copied_invite_link": "邀请链接已复制",
"invite_permission_denied": "您需要管理员或所有者角色才能创建邀请。",
"no_invites_yet": "暂无邀请",
"copy_link": "复制链接",
"revoke": "撤销",
"invite_created": "邀请已创建",
"expires": "过期时间",
"expires_in": "有效期",
"joined_list_at": "加入列表时间",
"journey": "旅程",
"journey_saved": "旅程已保存!",
Expand Down
54 changes: 52 additions & 2 deletions console/src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ import type {
ProjectAdminParams,
ProjectApiKey,
ProjectApiKeyParams,
ProjectInvite,
ProjectRole,
Resource,
RulePath,
SearchParams,
Expand All @@ -52,6 +54,12 @@ import type {
} from "./types"
import type { UUID } from "@/types/common"

declare module "axios" {
export interface AxiosRequestConfig {
skipAuthRedirect?: boolean
}
}

function appendValue(params: URLSearchParams, name: string, value: unknown) {
if (typeof value === "undefined" || value === null || typeof value === "function") return
if (typeof value === "object") value = JSON.stringify(value)
Expand All @@ -78,8 +86,13 @@ export const client = Axios.create({
client.interceptors.response.use(
(response) => response,
async (error) => {
const isLoginPage = window.location.pathname.startsWith("/login")
if (error.response.status === 401 && !isLoginPage) {
const isPublicPage =
window.location.pathname.startsWith("/login") ||
window.location.pathname.startsWith("/invites/")
const isUserNotAuthenticated = error.response?.status === 401
const skipRedirect = error.config?.skipAuthRedirect

if (isUserNotAuthenticated && !isPublicPage && !skipRedirect) {
api.auth.login()
}
throw error
Expand Down Expand Up @@ -180,6 +193,43 @@ const api = {
},
},

invites: {
accept: async (token: string) => {
await client.post(
"/auth/invites/accept",
{ token },
{
skipAuthRedirect: true, // "I'm a big boy, I'll handle this myself"
},
)
},
list: async (
projectId: UUID,
params?: {
limit?: number
offset?: number
search?: string
status?: string
role?: string
expires_after?: string
expires_before?: string
inviter_admin_id?: string
},
) =>
await client
.get<SearchResult<ProjectInvite>>(`${projectUrl(projectId)}/invites`, { params })
.then((r) => r.data),
create: async (
projectId: UUID,
params: { email: string; role: ProjectRole; expires_in?: string },
) =>
await client
.post<ProjectInvite>(`${projectUrl(projectId)}/invites`, params)
.then((r) => r.data),
revoke: async (projectId: UUID, token: string) =>
await client.delete(`${projectUrl(projectId)}/invites/${token}`).then((r) => r.data),
},

profile: {
get: async () => {
if (!cache.profile) {
Expand Down
Loading
Loading