diff --git a/README.md b/README.md
index ac4f99b..2d3ef2e 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
# helium
-effortless webrtc screensharing
\ No newline at end of file
+effortless webrtc screensharing
+
diff --git a/app/components/ui/sonner/Sonner.vue b/app/components/ui/sonner/Sonner.vue
index 1c70dca..6830896 100644
--- a/app/components/ui/sonner/Sonner.vue
+++ b/app/components/ui/sonner/Sonner.vue
@@ -1,19 +1,42 @@
+ v-bind="props"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/layouts/default.vue b/app/layouts/default.vue
index f454059..50b902d 100644
--- a/app/layouts/default.vue
+++ b/app/layouts/default.vue
@@ -1,6 +1,8 @@
@@ -17,5 +19,6 @@ import ThemeDropdown from '~/components/ui/ThemeDropdown.vue';
+
diff --git a/app/lib/db/schema.ts b/app/lib/db/schema.ts
index a6e5cce..917247b 100644
--- a/app/lib/db/schema.ts
+++ b/app/lib/db/schema.ts
@@ -1,23 +1,57 @@
-import { pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core';
+import {
+ boolean,
+ pgTable,
+ text,
+ timestamp,
+ uniqueIndex,
+ uuid,
+} from "drizzle-orm/pg-core";
-export const peers = pgTable('peers', {
- id: text('id').primaryKey(),
- lastSeen: timestamp('last_seen').notNull().defaultNow(),
+export const peers = pgTable("peers", {
+ id: text("id").primaryKey(),
+ lastSeen: timestamp("last_seen").notNull().defaultNow(),
});
-export const rooms = pgTable('rooms', {
- id: text('id').primaryKey(),
- broadcaster: text('broadcaster').notNull().references(() => peers.id, { onDelete: 'cascade' }),
- createdAt: timestamp('created_at').notNull().defaultNow(),
-});
-
-export const roomViewers = pgTable('room_viewers', {
- id: uuid('id').primaryKey().defaultRandom(),
- roomId: text('room_id')
+export const rooms = pgTable("rooms", {
+ id: text("id").primaryKey(),
+ broadcaster: text("broadcaster")
.notNull()
- .references(() => rooms.id, { onDelete: 'cascade' }),
- viewerId: text('viewer_id')
- .notNull()
- .references(() => peers.id, { onDelete: 'cascade' }),
- joinedAt: timestamp('joined_at').notNull().defaultNow(),
+ .references(() => peers.id, { onDelete: "cascade" }),
+ createdAt: timestamp("created_at").notNull().defaultNow(),
});
+
+export const roomViewers = pgTable("room_viewers", {
+ id: uuid("id").primaryKey().defaultRandom(),
+ roomId: text("room_id")
+ .notNull()
+ .references(() => rooms.id, { onDelete: "cascade" }),
+ viewerId: text("viewer_id")
+ .notNull()
+ .references(() => peers.id, { onDelete: "cascade" }),
+ joinedAt: timestamp("joined_at").notNull().defaultNow(),
+});
+
+export const presets = pgTable("presets", {
+ id: uuid("id").primaryKey().defaultRandom(),
+ createdBy: text("created_by").notNull(),
+ name: text("name").notNull(),
+ iceServers: text("ice_servers").notNull(), // stringified json obv
+ shareable: boolean("shareable").notNull().default(false),
+ createdAt: timestamp("created_at").notNull().defaultNow(),
+});
+
+export const presetUsers = pgTable(
+ "preset_users",
+ {
+ id: uuid("id").primaryKey().defaultRandom(),
+ presetId: uuid("preset_id")
+ .notNull()
+ .references(() => presets.id, { onDelete: "cascade" }),
+ userId: text("user_id").notNull(),
+ isDefault: boolean("is_default").notNull().default(false),
+ addedAt: timestamp("added_at").notNull().defaultNow(),
+ },
+ (table) => ({
+ uniquePresetUser: uniqueIndex().on(table.presetId, table.userId),
+ }),
+);
diff --git a/app/pages/presets/new.vue b/app/pages/presets/new.vue
index 875750b..7c4a70f 100644
--- a/app/pages/presets/new.vue
+++ b/app/pages/presets/new.vue
@@ -1,26 +1,26 @@
-