diff --git a/api/src/tablo.ts b/api/src/tablo.ts index 1b74fc9..80ea9d3 100644 --- a/api/src/tablo.ts +++ b/api/src/tablo.ts @@ -1,12 +1,24 @@ import { Hono } from "hono"; -import { authMiddleware, r2Middleware, streamChatMiddleware } from "./middleware.js"; -import { PostgrestError, type SupabaseClient, type User } from "@supabase/supabase-js"; +import { + authMiddleware, + r2Middleware, + streamChatMiddleware, +} from "./middleware.js"; +import { + PostgrestError, + type SupabaseClient, + type User, +} from "@supabase/supabase-js"; import type { Transporter } from "nodemailer"; import { generateToken } from "./token.js"; import { config } from "./config.js"; import type { Tables } from "./database.types.ts"; import type { StreamChat } from "stream-chat"; -import type { TabloInsert, EventInsertInTablo, EventAndTablo } from "./types.ts"; +import type { + TabloInsert, + EventInsertInTablo, + EventAndTablo, +} from "./types.ts"; import { PutObjectCommand, type S3Client } from "@aws-sdk/client-s3"; import { generateICSFromEvents, writeCalendarFileToR2 } from "./helpers.js"; import { transporter } from "./transporter.js"; @@ -120,7 +132,7 @@ tabloRouter.post("/create-and-invite", async (c) => { .eq("id", user.id) .single(); - if (ownerError || !ownerData) { + if (ownerError || !ownerData || invitedUserError || !invitedUser) { return c.json({ error: "owner_id is incorrect" }, 400); } @@ -166,7 +178,9 @@ tabloRouter.post("/create-and-invite", async (c) => { const { data: insertedTablo, error } = await supabase .from("tablos") .insert({ - name: `${invitedUserDataTyped.name || "Invité"} / ${ownerDataTyped.name || "Propriétaire"}`, + name: `${invitedUserDataTyped.name || "Invité"} / ${ + ownerDataTyped.name || "Propriétaire" + }`, color: "bg-blue-500", status: "todo", owner_id: ownerId, @@ -184,20 +198,22 @@ tabloRouter.post("/create-and-invite", async (c) => { } // Grant access to the current user (invited user) as a non-admin member - const { error: tabloAccessError } = await supabase.from("tablo_access").insert( - { - tablo_id: tabloData.id, - user_id: user.id, - // ** IMPORTANT ** - is_admin: false, - // ------------- - is_active: true, - granted_by: ownerId, - } - // { - // onConflict: "tablo_id, user_id", - // } - ); + const { error: tabloAccessError } = await supabase + .from("tablo_access") + .insert( + { + tablo_id: tabloData.id, + user_id: user.id, + // ** IMPORTANT ** + is_admin: false, + // ------------- + is_active: true, + granted_by: ownerId, + } + // { + // onConflict: "tablo_id, user_id", + // } + ); if (tabloAccessError) { console.error("tabloAccessError", tabloAccessError); @@ -358,7 +374,10 @@ tabloRouter.post("/invite", async (c) => { } if (tablo.owner_id !== sender.id) { - return c.json({ error: "You are not allowed to invite users to this tablo" }, 400); + return c.json( + { error: "You are not allowed to invite users to this tablo" }, + 400 + ); } const { error } = await supabase.from("tablo_invites").insert({ @@ -372,13 +391,15 @@ tabloRouter.post("/invite", async (c) => { return c.json({ error: error.message }, 500); } - const info = await transporter.sendMail({ + await transporter.sendMail({ from: `${sender.email} via XTablo `, to: recipientmail, subject: "Vous avez été invité à un tablo", html: `

Vous avez été invité à un tablo avec ce lien

`, + }/join/${encodeURIComponent(tablo.name)}?token=${encodeURIComponent( + token + )}">ce lien

`, }); return c.json({ @@ -411,15 +432,17 @@ tabloRouter.post("/join", async (c) => { const { id: invite_id, tablo_id, invited_by } = inviteData; - const { error: tabloAccessError } = await supabase.from("tablo_access").insert({ - tablo_id, - user_id: joiner.id, - // ** IMPORTANT ** - is_admin: false, - // ------------- - is_active: true, - granted_by: invited_by, - }); + const { error: tabloAccessError } = await supabase + .from("tablo_access") + .insert({ + tablo_id, + user_id: joiner.id, + // ** IMPORTANT ** + is_admin: false, + // ------------- + is_active: true, + granted_by: invited_by, + }); if (tabloAccessError) { console.error("tabloAccessError", tabloAccessError); diff --git a/justfile b/justfile index d3bf68a..cf28da5 100644 --- a/justfile +++ b/justfile @@ -19,12 +19,18 @@ _api-dev: test-api: cd api && npm run test +# Daily workflows + dev: just _api-dev & (just _frontend-dev) +# Types recipes + update-types: npx supabase gen types typescript --project-id "mhcafqvzbrrwvahpvvzd" --schema public > ui/src/types/database.types.ts && cp ui/src/types/database.types.ts api/src/database.types.ts && cp ui/src/types/database.types.ts xtablo-expo/lib/database.types.ts +# Expo recipes + expo-install-all: cd xtablo-expo && npx expo install