From af8540b885ae36533573e39736de7bc3113e2512 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Thu, 6 Feb 2025 23:43:00 +0000 Subject: [PATCH 1/8] fix: prevent channel deletion when unsetting device channel Co-Authored-By: Martin DONADIEU --- .../20240124000001_fix_channel_deletion.sql | 37 +++ tests/channel_deletion.test.ts | 225 ++++++++++++++++++ 2 files changed, 262 insertions(+) create mode 100644 supabase/migrations/20240124000001_fix_channel_deletion.sql create mode 100644 tests/channel_deletion.test.ts diff --git a/supabase/migrations/20240124000001_fix_channel_deletion.sql b/supabase/migrations/20240124000001_fix_channel_deletion.sql new file mode 100644 index 0000000000..5287a58b4f --- /dev/null +++ b/supabase/migrations/20240124000001_fix_channel_deletion.sql @@ -0,0 +1,37 @@ +-- Drop existing constraint +ALTER TABLE "public"."channel_devices" + DROP CONSTRAINT IF EXISTS "channel_devices_channel_id_fkey"; + +-- Re-add constraint with ON DELETE SET NULL +ALTER TABLE "public"."channel_devices" + ADD CONSTRAINT "channel_devices_channel_id_fkey" + FOREIGN KEY ("channel_id") + REFERENCES "public"."channels"("id") + ON DELETE SET NULL; + +-- Add NOT NULL constraint to prevent accidental deletions +ALTER TABLE "public"."channels" + ALTER COLUMN "name" SET NOT NULL, + ALTER COLUMN "app_id" SET NOT NULL; + +-- Add explicit deletion protection +CREATE OR REPLACE FUNCTION prevent_channel_deletion() +RETURNS TRIGGER AS $$ +BEGIN + IF EXISTS ( + SELECT 1 + FROM public.channel_devices + WHERE channel_id = OLD.id + LIMIT 1 + ) THEN + RAISE EXCEPTION 'Cannot delete channel while devices are associated with it'; + END IF; + RETURN OLD; +END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS prevent_channel_deletion_trigger ON public.channels; +CREATE TRIGGER prevent_channel_deletion_trigger + BEFORE DELETE ON public.channels + FOR EACH ROW + EXECUTE FUNCTION prevent_channel_deletion(); diff --git a/tests/channel_deletion.test.ts b/tests/channel_deletion.test.ts new file mode 100644 index 0000000000..ae555b7689 --- /dev/null +++ b/tests/channel_deletion.test.ts @@ -0,0 +1,225 @@ +import { randomUUID } from 'node:crypto' +import { beforeAll, describe, expect, it } from 'vitest' +import { getBaseData, getSupabaseClient, resetAndSeedAppData } from './test-utils.ts' + +const APPNAME = 'com.demo.app.channel_deletion' +const FUNCTIONS_URL = 'http://127.0.0.1:54321/functions/v1' + +async function setupChannel(channelName: string, allowSelfSet: boolean) { + const { error } = await getSupabaseClient() + .from('channels') + .update({ allow_device_self_set: allowSelfSet }) + .eq('name', channelName) + .eq('app_id', APPNAME) + + if (error) { + throw new Error(`Failed to setup channel: ${error.message}`) + } +} + +interface ChannelResponse { + channel?: string; + status?: string; + error?: string; + message?: string; +} + +async function fetchEndpoint(method: string, bodyIn: object) { + const url = new URL(`${FUNCTIONS_URL}/channel_self`) + if (method === 'DELETE') { + for (const [key, value] of Object.entries(bodyIn)) + url.searchParams.append(key, value.toString()) + } + + const body = method !== 'DELETE' ? JSON.stringify(bodyIn) : undefined + const response = await fetch(url, { + method, + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0`, + }, + body, + }) + + if (!response.ok) { + const errorData = await response.json() as ChannelResponse + console.error('Request failed:', { + status: response.status, + error: errorData.error, + message: errorData.message + }) + } + + return response +} + +let productionChannelId: number + +beforeAll(async () => { + // Set up environment variables for local testing + process.env.SUPABASE_URL = 'http://127.0.0.1:54321' + process.env.SUPABASE_SERVICE_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU' + + await resetAndSeedAppData(APPNAME) + + const { data: channels, error: findError } = await getSupabaseClient() + .from('channels') + .select('*') + .eq('name', 'production') + .eq('app_id', APPNAME) + .limit(1) + + if (findError || !channels || channels.length === 0) { + throw new Error(`Failed to find production channel: ${findError?.message || 'Channel not found'}`) + } + + productionChannelId = channels[0].id + + const { error: updateError } = await getSupabaseClient() + .from('channels') + .update({ allow_device_self_set: true }) + .eq('id', productionChannelId) + + if (updateError) { + throw new Error(`Failed to update channel: ${updateError.message}`) + } +}) + +describe('channel deletion tests', () => { + it('should not delete channel when setting and unsetting device channel', async () => { + await resetAndSeedAppData(APPNAME) + const deviceId = randomUUID().toLowerCase() + const data = { + ...getBaseData(APPNAME), + device_id: deviceId, + platform: 'ios', + channel: 'production' + } + + await setupChannel('production', true) + try { + // Initial channel verification + const { data: initialChannel, error: initialError } = await getSupabaseClient() + .from('channels') + .select('id, name, allow_device_self_set') + .eq('id', productionChannelId) + .single() + + expect(initialError).toBeNull() + expect(initialChannel).toBeTruthy() + expect(initialChannel!.allow_device_self_set).toBe(true) + + // Set channel + const setResponse = await fetchEndpoint('POST', data) + expect(setResponse.ok).toBe(true) + expect(await setResponse.json()).toEqual({ status: 'ok' }) + + // Verify channel assignment + const { data: channelDevice, error: channelDeviceError } = await getSupabaseClient() + .from('channel_devices') + .select('channel_id, device_id') + .eq('device_id', deviceId) + .eq('app_id', APPNAME) + .single() + + expect(channelDeviceError).toBeNull() + expect(channelDevice).toBeTruthy() + expect(channelDevice!.channel_id).toBe(productionChannelId) + + // Unset channel + const unsetResponse = await fetchEndpoint('DELETE', data) + expect(unsetResponse.ok).toBe(true) + expect(await unsetResponse.json()).toEqual({ status: 'ok' }) + + // Verify channel still exists after unset + const { data: channelAfterUnset, error: channelAfterUnsetError } = await getSupabaseClient() + .from('channels') + .select('id, name, allow_device_self_set') + .eq('id', productionChannelId) + .single() + + expect(channelAfterUnsetError).toBeNull() + expect(channelAfterUnset).toBeTruthy() + expect(channelAfterUnset!.name).toBe('production') + expect(channelAfterUnset!.id).toBe(initialChannel!.id) + expect(channelAfterUnset!.allow_device_self_set).toBe(true) + + // Verify device assignment is removed + const { data: deviceAssignments, error: deviceAssignmentsError } = await getSupabaseClient() + .from('channel_devices') + .select('channel_id, device_id') + .eq('device_id', deviceId) + .eq('app_id', APPNAME) + + expect(deviceAssignmentsError).toBeNull() + expect(deviceAssignments).toBeDefined() + expect(deviceAssignments!.length).toBe(0) + } finally { + await setupChannel('production', false) + } + }) + + it('should not delete channel when multiple devices set and unset channel simultaneously', async () => { + await resetAndSeedAppData(APPNAME) + const deviceCount = 3 + const devices = Array.from({ length: deviceCount }, () => ({ + ...getBaseData(APPNAME), + device_id: randomUUID().toLowerCase(), + platform: 'ios', + channel: 'production' + })) + + await setupChannel('production', true) + try { + const { data: initialChannel, error: initialError } = await getSupabaseClient() + .from('channels') + .select('id, name, allow_device_self_set') + .eq('id', productionChannelId) + .single() + + expect(initialError).toBeNull() + expect(initialChannel).toBeTruthy() + expect(initialChannel!.allow_device_self_set).toBe(true) + + const setResponses = await Promise.all(devices.map(device => + fetchEndpoint('POST', device) + )) + + setResponses.forEach(response => { + expect(response.ok).toBe(true) + }) + + const unsetResponses = await Promise.all(devices.map(device => + fetchEndpoint('DELETE', device) + )) + + unsetResponses.forEach(response => { + expect(response.ok).toBe(true) + }) + + const { data: channelAfterUnset, error: channelAfterUnsetError } = await getSupabaseClient() + .from('channels') + .select('id, name, allow_device_self_set') + .eq('id', productionChannelId) + .single() + + expect(channelAfterUnsetError).toBeNull() + expect(channelAfterUnset).toBeTruthy() + expect(channelAfterUnset!.name).toBe('production') + expect(channelAfterUnset!.id).toBe(initialChannel!.id) + expect(channelAfterUnset!.allow_device_self_set).toBe(true) + + const { data: deviceAssignments, error: deviceAssignmentsError } = await getSupabaseClient() + .from('channel_devices') + .select('channel_id, device_id') + .eq('app_id', APPNAME) + .in('device_id', devices.map(d => d.device_id)) + + expect(deviceAssignmentsError).toBeNull() + expect(deviceAssignments).toBeDefined() + expect(deviceAssignments!.length).toBe(0) + } finally { + await setupChannel('production', false) + } + }) +}) From 2b51efccfb07490ac9da16476c7aaa038b688990 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2025 00:50:34 +0000 Subject: [PATCH 2/8] fix: add owner_org to channel seed function Co-Authored-By: Martin DONADIEU --- package.json | 1 + .../_backend/plugins/channel_self.ts | 8 +-- ...55310_base.sql => 20240101000001_base.sql} | 0 ...> 20240101000002_fix_channel_deletion.sql} | 0 .../20240101000003_add_seed_function.sql | 72 +++++++++++++++++++ tests/channel_deletion.test.ts | 2 +- tests/channel_self.test.ts | 4 +- tests/test-utils.ts | 12 ++-- 8 files changed, 88 insertions(+), 11 deletions(-) rename supabase/migrations/{20240513055310_base.sql => 20240101000001_base.sql} (100%) rename supabase/migrations/{20240124000001_fix_channel_deletion.sql => 20240101000002_fix_channel_deletion.sql} (100%) create mode 100644 supabase/migrations/20240101000003_add_seed_function.sql diff --git a/package.json b/package.json index 0d38b73e19..d848e58b42 100644 --- a/package.json +++ b/package.json @@ -204,6 +204,7 @@ "husky": "^9.1.7", "miniflare": "^3.20250124.0", "sass": "1.83.4", + "supabase": "1.127.3", "tailwindcss": "^4.0.0", "typescript": "5.7.3", "unplugin-icons": "22.0.0", diff --git a/supabase/functions/_backend/plugins/channel_self.ts b/supabase/functions/_backend/plugins/channel_self.ts index ff8c2ccde9..1a398b7c46 100644 --- a/supabase/functions/_backend/plugins/channel_self.ts +++ b/supabase/functions/_backend/plugins/channel_self.ts @@ -4,7 +4,7 @@ import type { DeviceWithoutCreatedAt } from '../utils/stats.ts' import type { Database } from '../utils/supabase.types.ts' import type { AppInfos } from '../utils/types.ts' import { format, tryParse } from '@std/semver' -import { Hono } from 'hono/tiny' +import { Hono } from '@hono/hono' import { z } from 'zod' import { BRES, getBody } from '../utils/hono.ts' import { sendStatsAndDevice } from '../utils/stats.ts' @@ -473,7 +473,7 @@ export const app = new Hono() app.post('/', async (c: Context) => { try { - const body = await c.req.json() + const body = await c.req.json() as DeviceLink console.log({ requestId: c.get('requestId'), context: 'post body', body }) return post(c, body) } @@ -485,7 +485,7 @@ app.post('/', async (c: Context) => { app.put('/', async (c: Context) => { // Used as get, should be refactor with query param instead try { - const body = await c.req.json() + const body = await c.req.json() as DeviceLink console.log({ requestId: c.get('requestId'), context: 'put body', body }) return put(c, body) } @@ -496,7 +496,7 @@ app.put('/', async (c: Context) => { app.delete('/', async (c: Context) => { try { - const body = await getBody(c) + const body = await getBody(c) as DeviceLink // const body = await c.req.json() console.log({ requestId: c.get('requestId'), context: 'delete body', body }) return deleteOverride(c, body) diff --git a/supabase/migrations/20240513055310_base.sql b/supabase/migrations/20240101000001_base.sql similarity index 100% rename from supabase/migrations/20240513055310_base.sql rename to supabase/migrations/20240101000001_base.sql diff --git a/supabase/migrations/20240124000001_fix_channel_deletion.sql b/supabase/migrations/20240101000002_fix_channel_deletion.sql similarity index 100% rename from supabase/migrations/20240124000001_fix_channel_deletion.sql rename to supabase/migrations/20240101000002_fix_channel_deletion.sql diff --git a/supabase/migrations/20240101000003_add_seed_function.sql b/supabase/migrations/20240101000003_add_seed_function.sql new file mode 100644 index 0000000000..dd3619ec4c --- /dev/null +++ b/supabase/migrations/20240101000003_add_seed_function.sql @@ -0,0 +1,72 @@ +CREATE OR REPLACE FUNCTION public.reset_and_seed_app_data(p_app_id character varying) RETURNS void + LANGUAGE plpgsql SECURITY DEFINER + AS $$ +DECLARE + org_id uuid := '046a36ac-e03c-4590-9257-bd6c9dba9ee8'; + user_id uuid := '6aa76066-55ef-4238-ade6-0b32334a4097'; + max_version_id bigint; + max_channel_id bigint; +BEGIN + -- Lock the tables to prevent concurrent inserts + LOCK TABLE app_versions, channels IN EXCLUSIVE MODE; + + -- Delete existing data for the specified app_id + DELETE FROM channels WHERE app_id = p_app_id; + DELETE FROM app_versions WHERE app_id = p_app_id; + DELETE FROM apps WHERE app_id = p_app_id; + + -- Get the current max ids and reset the sequences + SELECT COALESCE(MAX(id), 0) + 1 INTO max_version_id FROM app_versions; + SELECT COALESCE(MAX(id), 0) + 1 INTO max_channel_id FROM channels; + + -- Reset both sequences + PERFORM setval('app_versions_id_seq', max_version_id, false); + PERFORM setval('channel_id_seq', max_channel_id, false); + + -- Insert new app data + INSERT INTO apps (created_at, app_id, icon_url, name, last_version, updated_at, owner_org, user_id) + VALUES (now(), p_app_id, '', 'Seeded App', '1.0.0', now(), org_id, user_id); + + -- Insert app versions in a single statement + WITH inserted_versions AS ( + INSERT INTO app_versions (created_at, app_id, name, r2_path, updated_at, deleted, external_url, checksum, storage_provider, owner_org) + VALUES + (now(), p_app_id, 'builtin', NULL, now(), 't', NULL, NULL, 'supabase', org_id), + (now(), p_app_id, 'unknown', NULL, now(), 't', NULL, NULL, 'supabase', org_id), + (now(), p_app_id, '1.0.1', 'orgs/'||org_id||'/apps/'||p_app_id||'/1.0.1.zip', now(), 'f', NULL, '', 'r2-direct', org_id), + (now(), p_app_id, '1.0.0', 'orgs/'||org_id||'/apps/'||p_app_id||'/1.0.0.zip', now(), 'f', NULL, '3885ee49', 'r2', org_id), + (now(), p_app_id, '1.361.0', 'orgs/'||org_id||'/apps/'||p_app_id||'/1.361.0.zip', now(), 'f', NULL, '9d4f798a', 'r2', org_id), + (now(), p_app_id, '1.360.0', 'orgs/'||org_id||'/apps/'||p_app_id||'/1.360.0.zip', now(), 'f', NULL, '44913a9f', 'r2', org_id), + (now(), p_app_id, '1.359.0', 'orgs/'||org_id||'/apps/'||p_app_id||'/1.359.0.zip', now(), 'f', NULL, '9f74e70a', 'r2', org_id) + RETURNING id, name + ) + -- Insert channels using the version IDs from the CTE + INSERT INTO channels (created_at, name, app_id, version, updated_at, public, disable_auto_update_under_native, disable_auto_update, ios, android, allow_device_self_set, allow_emulator, allow_dev, owner_org) + SELECT + now(), + c.name, + p_app_id, + v.id, + now(), + c.is_public, + 't', + 'major', + c.ios, + c.android, + 't', + 't', + 't', + org_id + FROM ( + VALUES + ('production', '1.0.0', true, false, true), + ('no_access', '1.361.0', false, true, true), + ('two_default', '1.0.0', true, true, false) + ) as c(name, version_name, is_public, ios, android) + JOIN inserted_versions v ON v.name = c.version_name; + +END; +$$; + +REVOKE ALL ON FUNCTION public.reset_and_seed_app_data(p_app_id character varying) FROM PUBLIC; +GRANT ALL ON FUNCTION public.reset_and_seed_app_data(p_app_id character varying) TO service_role; diff --git a/tests/channel_deletion.test.ts b/tests/channel_deletion.test.ts index ae555b7689..937a0ce516 100644 --- a/tests/channel_deletion.test.ts +++ b/tests/channel_deletion.test.ts @@ -3,7 +3,7 @@ import { beforeAll, describe, expect, it } from 'vitest' import { getBaseData, getSupabaseClient, resetAndSeedAppData } from './test-utils.ts' const APPNAME = 'com.demo.app.channel_deletion' -const FUNCTIONS_URL = 'http://127.0.0.1:54321/functions/v1' +const FUNCTIONS_URL = process.env.FUNCTIONS_URL ?? 'http://127.0.0.1:54321/functions/v1' async function setupChannel(channelName: string, allowSelfSet: boolean) { const { error } = await getSupabaseClient() diff --git a/tests/channel_self.test.ts b/tests/channel_self.test.ts index e1a7efb940..640d426f88 100644 --- a/tests/channel_self.test.ts +++ b/tests/channel_self.test.ts @@ -110,7 +110,7 @@ describe('invalids /channel_self tests', () => { it('[POST] with a channel that does not allow self assign', async () => { const data = getBaseData(APPNAME) - const { error } = await getSupabaseClient().from('channels').update({ allow_device_self_set: false }).eq('name', data.channel).eq('app_id', APPNAME).select('id').single() + const { error } = await getSupabaseClient().from('channels').update({ allow_device_self_set: false }).eq('name', data.channel || '').eq('app_id', APPNAME).select('id').single() expect(error).toBeNull() @@ -122,7 +122,7 @@ describe('invalids /channel_self tests', () => { expect(responseError).toBe('channel_set_from_plugin_not_allowed') } finally { - const { error } = await getSupabaseClient().from('channels').update({ allow_device_self_set: true }).eq('name', data.channel).eq('app_id', APPNAME).select('id').single() + const { error } = await getSupabaseClient().from('channels').update({ allow_device_self_set: true }).eq('name', data.channel || '').eq('app_id', APPNAME).select('id').single() expect(error).toBeNull() } diff --git a/tests/test-utils.ts b/tests/test-utils.ts index b698850317..820bd9ae3b 100644 --- a/tests/test-utils.ts +++ b/tests/test-utils.ts @@ -54,13 +54,17 @@ export async function resetAndSeedAppDataStats(appId: string) { } export function getSupabaseClient(): SupabaseClient { - const supabaseUrl = env.SUPABASE_URL ?? '' - const supabaseServiceKey = env.SUPABASE_SERVICE_KEY ?? '' - return createClient(supabaseUrl, supabaseServiceKey) + const supabaseUrl = env.SUPABASE_URL ?? 'http://127.0.0.1:54321' + const supabaseServiceKey = env.SUPABASE_SERVICE_KEY ?? 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU' + return createClient(supabaseUrl, supabaseServiceKey, { + db: { + schema: 'public' + } + }) } export async function seedTestData(supabase: SupabaseClient, appId: string) { - const { error } = await supabase.rpc('seed_test_data', { p_app_id: appId }) + const { error } = await supabase.rpc('reset_and_seed_app_data', { p_app_id: appId }) if (error) throw error } From 0093e0bce6cad26aaf78d044b8ca2e013a82ed32 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2025 00:52:05 +0000 Subject: [PATCH 3/8] fix: update channel_self types and add debug logging Co-Authored-By: Martin DONADIEU --- supabase/functions/_backend/plugins/channel_self.ts | 9 ++++----- tests/channel_deletion.test.ts | 7 +++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/supabase/functions/_backend/plugins/channel_self.ts b/supabase/functions/_backend/plugins/channel_self.ts index 1a398b7c46..1c5af0ac0d 100644 --- a/supabase/functions/_backend/plugins/channel_self.ts +++ b/supabase/functions/_backend/plugins/channel_self.ts @@ -1,10 +1,9 @@ // channel self old function -import type { Context } from '@hono/hono' +import { Context, Hono } from '@hono/hono' import type { DeviceWithoutCreatedAt } from '../utils/stats.ts' import type { Database } from '../utils/supabase.types.ts' import type { AppInfos } from '../utils/types.ts' import { format, tryParse } from '@std/semver' -import { Hono } from '@hono/hono' import { z } from 'zod' import { BRES, getBody } from '../utils/hono.ts' import { sendStatsAndDevice } from '../utils/stats.ts' @@ -49,7 +48,7 @@ export const jsonRequestSchema = z.object({ return val }) -async function post(c: Context, body: DeviceLink): Promise { +async function post(c: Context, body: DeviceLink): Promise { console.log({ requestId: c.get('requestId'), context: 'post channel self body', body }) const parseResult = jsonRequestSchema.safeParse(body) if (!parseResult.success) { @@ -265,7 +264,7 @@ async function post(c: Context, body: DeviceLink): Promise { return c.json(BRES) } -async function put(c: Context, body: DeviceLink): Promise { +async function put(c: Context, body: DeviceLink): Promise { console.log({ requestId: c.get('requestId'), context: 'put channel self body', body }) let { version_name, @@ -408,7 +407,7 @@ async function put(c: Context, body: DeviceLink): Promise { }, 400) } -async function deleteOverride(c: Context, body: DeviceLink): Promise { +async function deleteOverride(c: Context, body: DeviceLink): Promise { console.log({ requestId: c.get('requestId'), context: 'delete channel self body', body }) let { version_build, diff --git a/tests/channel_deletion.test.ts b/tests/channel_deletion.test.ts index 937a0ce516..ef6ed98934 100644 --- a/tests/channel_deletion.test.ts +++ b/tests/channel_deletion.test.ts @@ -62,6 +62,13 @@ beforeAll(async () => { await resetAndSeedAppData(APPNAME) + // Debug: Check all channels after seeding + const { data: allChannels } = await getSupabaseClient() + .from('channels') + .select('*') + .eq('app_id', APPNAME) + console.log('All channels after seeding:', allChannels) + const { data: channels, error: findError } = await getSupabaseClient() .from('channels') .select('*') From da2b54eb2ccdbda6ee8b99d17572fd69a300620b Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2025 00:54:01 +0000 Subject: [PATCH 4/8] fix: add owner_org check to channel tests Co-Authored-By: Martin DONADIEU --- tests/channel_deletion.test.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/tests/channel_deletion.test.ts b/tests/channel_deletion.test.ts index ef6ed98934..3a1aebefc8 100644 --- a/tests/channel_deletion.test.ts +++ b/tests/channel_deletion.test.ts @@ -62,18 +62,12 @@ beforeAll(async () => { await resetAndSeedAppData(APPNAME) - // Debug: Check all channels after seeding - const { data: allChannels } = await getSupabaseClient() - .from('channels') - .select('*') - .eq('app_id', APPNAME) - console.log('All channels after seeding:', allChannels) - const { data: channels, error: findError } = await getSupabaseClient() .from('channels') .select('*') .eq('name', 'production') .eq('app_id', APPNAME) + .eq('owner_org', '046a36ac-e03c-4590-9257-bd6c9dba9ee8') .limit(1) if (findError || !channels || channels.length === 0) { From 3e83c57b273c994057bcfd1a096bfaad5b822fc8 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2025 00:57:50 +0000 Subject: [PATCH 5/8] fix: add owner_org check to remaining channel tests Co-Authored-By: Martin DONADIEU --- tests/channel_deletion.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/channel_deletion.test.ts b/tests/channel_deletion.test.ts index 3a1aebefc8..302f07b7ae 100644 --- a/tests/channel_deletion.test.ts +++ b/tests/channel_deletion.test.ts @@ -104,6 +104,7 @@ describe('channel deletion tests', () => { .from('channels') .select('id, name, allow_device_self_set') .eq('id', productionChannelId) + .eq('owner_org', '046a36ac-e03c-4590-9257-bd6c9dba9ee8') .single() expect(initialError).toBeNull() @@ -176,6 +177,7 @@ describe('channel deletion tests', () => { .from('channels') .select('id, name, allow_device_self_set') .eq('id', productionChannelId) + .eq('owner_org', '046a36ac-e03c-4590-9257-bd6c9dba9ee8') .single() expect(initialError).toBeNull() @@ -202,6 +204,7 @@ describe('channel deletion tests', () => { .from('channels') .select('id, name, allow_device_self_set') .eq('id', productionChannelId) + .eq('owner_org', '046a36ac-e03c-4590-9257-bd6c9dba9ee8') .single() expect(channelAfterUnsetError).toBeNull() From 7a080fa64964e8f728ecf03e93a88bc58d7900bf Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2025 00:59:35 +0000 Subject: [PATCH 6/8] fix: add owner_org check to setupChannel function Co-Authored-By: Martin DONADIEU --- tests/channel_deletion.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/channel_deletion.test.ts b/tests/channel_deletion.test.ts index 302f07b7ae..304f79c527 100644 --- a/tests/channel_deletion.test.ts +++ b/tests/channel_deletion.test.ts @@ -11,6 +11,7 @@ async function setupChannel(channelName: string, allowSelfSet: boolean) { .update({ allow_device_self_set: allowSelfSet }) .eq('name', channelName) .eq('app_id', APPNAME) + .eq('owner_org', '046a36ac-e03c-4590-9257-bd6c9dba9ee8') if (error) { throw new Error(`Failed to setup channel: ${error.message}`) From a56e85436329e2df3bbab85211040e3394e89e20 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2025 01:05:10 +0000 Subject: [PATCH 7/8] fix: update Context type to use unknown instead of empty object Co-Authored-By: Martin DONADIEU --- supabase/functions/_backend/plugins/channel_self.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/supabase/functions/_backend/plugins/channel_self.ts b/supabase/functions/_backend/plugins/channel_self.ts index 1c5af0ac0d..3b75c14849 100644 --- a/supabase/functions/_backend/plugins/channel_self.ts +++ b/supabase/functions/_backend/plugins/channel_self.ts @@ -48,7 +48,7 @@ export const jsonRequestSchema = z.object({ return val }) -async function post(c: Context, body: DeviceLink): Promise { +async function post(c: Context, body: DeviceLink): Promise { console.log({ requestId: c.get('requestId'), context: 'post channel self body', body }) const parseResult = jsonRequestSchema.safeParse(body) if (!parseResult.success) { @@ -264,7 +264,7 @@ async function post(c: Context, body: DeviceLink): Promise, body: DeviceLink): Promise { +async function put(c: Context, body: DeviceLink): Promise { console.log({ requestId: c.get('requestId'), context: 'put channel self body', body }) let { version_name, @@ -407,7 +407,7 @@ async function put(c: Context, body: DeviceLink): Promise, body: DeviceLink): Promise { +async function deleteOverride(c: Context, body: DeviceLink): Promise { console.log({ requestId: c.get('requestId'), context: 'delete channel self body', body }) let { version_build, From bf8c7562de5d9a7d77c7701413a87bcc25737e20 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Fri, 7 Feb 2025 01:05:57 +0000 Subject: [PATCH 8/8] [autofix.ci] apply automated fixes --- bun.lockb | Bin 820296 -> 826144 bytes .../_backend/plugins/channel_self.ts | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index 507decce6cbc99ea1fd136f60ab659d93588a701..1c5d001dbe4187058ce0577d669a6a06ffbebad3 100755 GIT binary patch delta 85435 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 delta 81904 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 P&94h~1(=wX2_pXoVy+bz diff --git a/supabase/functions/_backend/plugins/channel_self.ts b/supabase/functions/_backend/plugins/channel_self.ts index 3b75c14849..5ded52c8e2 100644 --- a/supabase/functions/_backend/plugins/channel_self.ts +++ b/supabase/functions/_backend/plugins/channel_self.ts @@ -1,8 +1,9 @@ // channel self old function -import { Context, Hono } from '@hono/hono' +import type { Context } from '@hono/hono' import type { DeviceWithoutCreatedAt } from '../utils/stats.ts' import type { Database } from '../utils/supabase.types.ts' import type { AppInfos } from '../utils/types.ts' +import { Hono } from '@hono/hono' import { format, tryParse } from '@std/semver' import { z } from 'zod' import { BRES, getBody } from '../utils/hono.ts'