Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
79 changes: 65 additions & 14 deletions .github/workflows/run-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,33 @@ jobs:
with:
script: |
const adder = context.payload.sender.login;
const senderType = context.payload.sender.type;
const pr = context.payload.pull_request;

// Verify label adder has write access
const { data: perm } = await github.rest.repos.getCollaboratorPermissionLevel({
owner: context.repo.owner,
repo: context.repo.repo,
username: adder,
});
console.log(`Sender: ${adder} (type: ${senderType})`);

if (!['admin', 'maintain', 'write'].includes(perm.permission)) {
core.setFailed(`${adder} does not have write access`);
return;
const trustedBotLogins = ['graphite-app[bot]'];
let isAuthorized = false;

if (senderType === 'Bot' && trustedBotLogins.includes(adder)) {
console.log(`Authorized: trusted GitHub App`);
isAuthorized = true;
}

console.log(`Label added by ${adder} (${perm.permission})`);
if (!isAuthorized) {
const { data: perm } = await github.rest.repos.getCollaboratorPermissionLevel({
owner: context.repo.owner,
repo: context.repo.repo,
username: adder,
});

if (!['admin', 'maintain', 'write'].includes(perm.permission)) {
core.setFailed(`${adder} does not have write access`);
return;
}

console.log(`Label added by ${adder}`);
}

// Find the latest pr.yml run for this PR's head SHA
const { data: runs } = await github.rest.actions.listWorkflowRuns({
Expand All @@ -56,13 +68,52 @@ jobs:

const latestRun = matchingRuns[0];

// Check if workflow is still running - can't re-run in-progress workflows
// If workflow is still running, cancel it first then re-run
if (latestRun.status === 'in_progress' || latestRun.status === 'queued') {
core.setFailed(`Workflow is still running (status: ${latestRun.status}). Wait for it to complete or cancel it first.`);
return;
console.log(`Workflow is running (status: ${latestRun.status}). Cancelling it first...`);

await github.rest.actions.cancelWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: latestRun.id,
});

// Wait for the workflow to be cancelled (poll with timeout)
const maxWaitTime = 60000; // 60 seconds
const pollInterval = 2000; // 2 seconds
const startTime = Date.now();

while (Date.now() - startTime < maxWaitTime) {
await new Promise(resolve => setTimeout(resolve, pollInterval));

const { data: updatedRun } = await github.rest.actions.getWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: latestRun.id,
});

if (updatedRun.status === 'completed') {
console.log(`Workflow cancelled successfully (conclusion: ${updatedRun.conclusion})`);
break;
}

console.log(`Waiting for workflow to cancel... (status: ${updatedRun.status})`);
}

// Check final status
const { data: finalRun } = await github.rest.actions.getWorkflowRun({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: latestRun.id,
});

if (finalRun.status !== 'completed') {
core.setFailed(`Timed out waiting for workflow to cancel (status: ${finalRun.status})`);
return;
}
}

console.log(`Re-running workflow ${latestRun.id} (was: ${latestRun.conclusion})`);
console.log(`Re-running workflow ${latestRun.id} (was: ${latestRun.conclusion || latestRun.status})`);

// Re-run preserves original context (PR, SHA, etc.)
await github.rest.actions.reRunWorkflow({
Expand Down
3 changes: 3 additions & 0 deletions apps/api/v1/lib/helpers/verifyApiKey.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ describe("Verify API key - Unit Tests", () => {
valid: true,
userId: 1,
user: {
uuid: "test-uuid-1",
role: UserPermissionRole.ADMIN,
locked: false,
email: "admin@example.com",
Expand Down Expand Up @@ -183,6 +184,7 @@ describe("Verify API key - Unit Tests", () => {
valid: true,
userId: 2,
user: {
uuid: "test-uuid-2",
role: UserPermissionRole.USER,
locked: false,
email: "org-admin@acme.com",
Expand Down Expand Up @@ -227,6 +229,7 @@ describe("Verify API key - Unit Tests", () => {
valid: true,
userId: 3,
user: {
uuid: "test-uuid-3",
role: UserPermissionRole.USER,
locked: true,
email: "locked@example.com",
Expand Down
7 changes: 4 additions & 3 deletions apps/api/v1/lib/helpers/verifyApiKey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,10 @@ export const verifyApiKey: NextMiddleware = async (req, res, next) => {
return res.status(401).json({ error: result.error });
}

// save the user id in the request for later use
req.userId = result.userId!;
req.user = result.user!;
// save the user id and uuid in the request for later use
req.userId = result.userId;
req.userUuid = result.user.uuid;
req.user = result.user;

const { isAdmin, scope } = await isAdminGuard(req);
const userIsLockedOrBlocked = await isLockedOrBlocked(req);
Expand Down
1 change: 1 addition & 0 deletions apps/api/v1/next.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export declare module "next" {
session?: Session | null;

userId: number;
userUuid: string;
user?: { role: string; locked: boolean; email: string } | null;
method: string;
// session: { user: { id: number } };
Expand Down
1 change: 1 addition & 0 deletions apps/api/v1/pages/api/invites/_post.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ async function postHandler(req: NextApiRequest, res: NextApiResponse) {
return {
user: {
id: req.userId,
uuid: req.userUuid,
username: "",
profile: {
id: null,
Expand Down
1 change: 1 addition & 0 deletions apps/api/v1/pages/api/teams/[teamId]/publish.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const patchHandler = async (req: NextApiRequest, res: NextApiResponse) => {
return {
user: {
id: req.userId,
uuid: req.userUuid,
username: "" /* Not used in this context */,
role: req.isSystemWideAdmin ? UserPermissionRole.ADMIN : UserPermissionRole.USER,
profile: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import { useParams } from "next/navigation";

import dayjs from "@calcom/dayjs";
import { DecoyBookingSuccessCard } from "@calcom/features/bookings/Booker/components/DecoyBookingSuccessCard";
import { DecoyBookingSuccessCard } from "~/bookings/components/DecoyBookingSuccessCard";
import { useDecoyBooking } from "@calcom/features/bookings/Booker/components/hooks/useDecoyBooking";

export default function BookingSuccessful() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import { ShellMainAppDir } from "app/(use-page-wrapper)/(main-nav)/ShellMainAppDir";

import { EventTypesSkeletonLoader } from "@calcom/features/eventtypes/components/SkeletonLoader";
import { EventTypesSkeletonLoader } from "@calcom/web/modules/event-types/components/SkeletonLoader";
import { useLocale } from "@calcom/lib/hooks/useLocale";

export function EventTypesSkeleton() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { useFormContext } from "react-hook-form";

import { isFallbackRoute } from "@calcom/app-store/routing-forms/lib/isFallbackRoute";
import type { RoutingFormWithResponseCount } from "@calcom/app-store/routing-forms/types/types";
import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired";
import LicenseRequired from "~/ee/common/components/LicenseRequired";
import { FilterResults } from "@calcom/features/filters/components/FilterResults";
import { TeamsFilter } from "@calcom/features/filters/components/TeamsFilter";
import { getTeamsFiltersFromQuery } from "@calcom/features/filters/lib/getTeamsFiltersFromQuery";
Expand Down
2 changes: 1 addition & 1 deletion apps/web/app/(use-page-wrapper)/connect-and-join/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { _generateMetadata } from "app/_utils";

import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired";
import LicenseRequired from "~/ee/common/components/LicenseRequired";

import LegacyPage from "~/connect-and-join/connect-and-join-view";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { _generateMetadata } from "app/_utils";

import InsightsCallHistoryPage from "~/insights/insights-call-history-view";
import InsightsCallHistoryPage from "~/insights/views/insights-call-history-view";

import { checkInsightsPagePermission } from "../checkInsightsPagePermission";

Expand Down
2 changes: 1 addition & 1 deletion apps/web/app/(use-page-wrapper)/insights/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { _generateMetadata } from "app/_utils";

import prisma from "@calcom/prisma";

import InsightsPage from "~/insights/insights-view";
import InsightsPage from "~/insights/views/insights-view";

import { checkInsightsPagePermission } from "./checkInsightsPagePermission";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { _generateMetadata } from "app/_utils";

import InsightsVirtualQueuesPage from "~/insights/insights-virtual-queues-view";
import InsightsVirtualQueuesPage from "~/insights/views/insights-virtual-queues-view";

import { checkInsightsPagePermission } from "../checkInsightsPagePermission";

Expand Down
2 changes: 1 addition & 1 deletion apps/web/app/(use-page-wrapper)/insights/routing/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { _generateMetadata } from "app/_utils";

import { prisma } from "@calcom/prisma";

import InsightsRoutingPage from "~/insights/insights-routing-view";
import InsightsRoutingPage from "~/insights/views/insights-routing-view";

import { checkInsightsPagePermission } from "../checkInsightsPagePermission";

Expand Down
4 changes: 2 additions & 2 deletions apps/web/app/(use-page-wrapper)/payment/[uid]/PaymentPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import { getPaymentAppData } from "@calcom/app-store/_utils/payments/getPaymentA
import { getSuccessPageLocationMessage } from "@calcom/app-store/locations";
import dayjs from "@calcom/dayjs";
import { sdkActionManager, useIsEmbed } from "@calcom/embed-core/embed-iframe";
import { PayIcon } from "@calcom/features/bookings/components/event-meta/PayIcon";
import { Price } from "@calcom/features/bookings/components/event-meta/Price";
import { PayIcon } from "@calcom/web/modules/bookings/components/event-meta/PayIcon";
import { Price } from "@calcom/web/modules/bookings/components/event-meta/Price";
import type { PaymentPageProps } from "@calcom/features/ee/payments/pages/payment";
import { APP_NAME, WEBSITE_URL } from "@calcom/lib/constants";
import { useLocale } from "@calcom/lib/hooks/useLocale";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { _generateMetadata } from "app/_utils";
import { getTranslate } from "app/_utils";

import AdminAppsList from "@calcom/features/apps/AdminAppsList";
import AdminAppsList from "~/apps/components/AdminAppsList";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";

export const generateMetadata = async ({ params }: { params: Promise<{ category: string }> }) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { type Params } from "app/_types";
import { _generateMetadata, getTranslate } from "app/_utils";
import { z } from "zod";

import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired";
import LicenseRequired from "~/ee/common/components/LicenseRequired";
import { OrgForm } from "~/ee/organizations/admin/AdminOrgEditPage";
import { getOrganizationRepository } from "@calcom/features/ee/organizations/di/OrganizationRepository.container";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { _generateMetadata } from "app/_utils";
import { getTranslate } from "app/_utils";

import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired";
import LicenseRequired from "~/ee/common/components/LicenseRequired";
import AdminOrgTable from "~/ee/organizations/admin/AdminOrgPage";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"use client";

import { ChartCard } from "@calcom/features/insights/components/ChartCard";
import { BookingsByHourChartContent } from "@calcom/features/insights/components/booking/BookingsByHourChart";
import { ChartCard } from "@calcom/web/modules/insights/components/ChartCard";
import { BookingsByHourChartContent } from "@calcom/web/modules/insights/components/booking/BookingsByHourChart";
import { useLocale } from "@calcom/lib/hooks/useLocale";

// Sample data for playground testing
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
import { useReactTable, getCoreRowModel, createColumnHelper } from "@tanstack/react-table";
import { useMemo } from "react";

import { ColumnFilterType, DateRangeFilter, DataTableProvider } from "@calcom/features/data-table";
import { ColumnFilterType, DataTableProvider } from "@calcom/features/data-table";
import type { DateRangeFilterOptions } from "@calcom/features/data-table/lib/types";
import { DateRangeFilter } from "~/data-table/components/filters/DateRangeFilter";

type DemoRow = {
id: number;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
"use client";

import { ChartCard } from "@calcom/features/insights/components/ChartCard";
import { ChartCard } from "@calcom/web/modules/insights/components/ChartCard";
import {
RoutingFunnelContent,
legend,
} from "@calcom/features/insights/components/routing/RoutingFunnelContent";
} from "@calcom/web/modules/insights/components/routing/RoutingFunnelContent";
import { useLocale } from "@calcom/lib/hooks/useLocale";

// Random sample data for playground testing
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { type Params } from "app/_types";
import { _generateMetadata, getTranslate } from "app/_utils";
import { z } from "zod";

import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired";
import { UsersEditView } from "@calcom/features/ee/users/pages/users-edit-view";
import LicenseRequired from "~/ee/common/components/LicenseRequired";
import { UsersEditView } from "~/ee/users/views/users-edit-view";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
import { UserRepository } from "@calcom/features/users/repositories/UserRepository";
import { prisma } from "@calcom/prisma";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { _generateMetadata, getTranslate } from "app/_utils";

import UsersAddView from "@calcom/features/ee/users/pages/users-add-view";
import UsersAddView from "~/ee/users/views/users-add-view";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";

export const generateMetadata = async () =>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { _generateMetadata, getTranslate } from "app/_utils";

import UsersListingView from "@calcom/features/ee/users/pages/users-listing-view";
import UsersListingView from "~/ee/users/views/users-listing-view";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
import { Button } from "@calcom/ui/components/button";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { _generateMetadata, getTranslate } from "app/_utils";

import LicenseRequired from "@calcom/features/ee/common/components/LicenseRequired";
import LicenseRequired from "~/ee/common/components/LicenseRequired";
import WorkspacePlatformsPage from "~/ee/organizations/admin/WorkspacePlatformPage";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { _generateMetadata, getTranslate } from "app/_utils";

import DirectorySyncTeamView from "@calcom/features/ee/dsync/page/team-dsync-view";
import DirectorySyncTeamView from "~/ee/dsync/views/team-dsync-view";
import { Resource } from "@calcom/features/pbac/domain/types/permission-registry";
import { getResourcePermissions } from "@calcom/features/pbac/lib/resource-permissions";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { _generateMetadata, getTranslate } from "app/_utils";
import { redirect } from "next/navigation";

import OrgSSOView from "@calcom/features/ee/sso/page/orgs-sso-view";
import OrgSSOView from "~/ee/sso/views/orgs-sso-view";
import { Resource } from "@calcom/features/pbac/domain/types/permission-registry";
import { getResourcePermissions } from "@calcom/features/pbac/lib/resource-permissions";
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ describe("validateUserHasOrg", () => {
hasValidLicense: true,
user: {
id: 123,
uuid: "test-uuid-123",
email: "test@example.com",
name: "Test User",
org: {
Expand Down Expand Up @@ -87,6 +88,7 @@ describe("validateUserHasOrg", () => {
const mockSession = createMockSession({
user: {
id: 123,
uuid: "test-uuid-123",
email: "test@example.com",
name: "Test User",
org: undefined,
Expand Down Expand Up @@ -132,6 +134,7 @@ describe("validateUserHasOrg", () => {
const mockSession = createMockSession({
user: {
id: 123,
uuid: "test-uuid-123",
email: "test@example.com",
name: "Test User",
org: undefined,
Expand Down Expand Up @@ -159,6 +162,7 @@ describe("validateUserHasOrg", () => {
const mockSession = createMockSession({
user: {
id: undefined as unknown as number,
uuid: "test-uuid-123",
email: "test@example.com",
name: "Test User",
org: {
Expand Down
Loading
Loading