diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 1afe622..16ffb00 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -30,17 +30,6 @@ jobs: components: rustfmt - run: cargo fmt --check - prettier: - name: Format frontend - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 23 - - run: npm ci - - run: npm run format:check - clippy: name: Lint runs-on: ubuntu-22.04 diff --git a/.sqlx/query-05de6b93f0e3c646b1ac95a2a3df70a689edffc1ab148e767238d2b28b7b6f77.json b/.sqlx/query-05de6b93f0e3c646b1ac95a2a3df70a689edffc1ab148e767238d2b28b7b6f77.json new file mode 100644 index 0000000..13bcc4e --- /dev/null +++ b/.sqlx/query-05de6b93f0e3c646b1ac95a2a3df70a689edffc1ab148e767238d2b28b7b6f77.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "UPDATE rsvp_sessions\n SET stripe_checkout_session_id = ?, stripe_client_secret = ?, updated_at = CURRENT_TIMESTAMP\n WHERE id = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "05de6b93f0e3c646b1ac95a2a3df70a689edffc1ab148e767238d2b28b7b6f77" +} diff --git a/.sqlx/query-c9f07131ab783144f4962daa23c91a75490a99a7689587115b92debcc06c114a.json b/.sqlx/query-1041a86bb05f0dd39693fb3942b212fe491fa3cee195fd2ce0ae74940ab5ad57.json similarity index 59% rename from .sqlx/query-c9f07131ab783144f4962daa23c91a75490a99a7689587115b92debcc06c114a.json rename to .sqlx/query-1041a86bb05f0dd39693fb3942b212fe491fa3cee195fd2ce0ae74940ab5ad57.json index 519ed81..825efb1 100644 --- a/.sqlx/query-c9f07131ab783144f4962daa23c91a75490a99a7689587115b92debcc06c114a.json +++ b/.sqlx/query-1041a86bb05f0dd39693fb3942b212fe491fa3cee195fd2ce0ae74940ab5ad57.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "\n SELECT\n u.id AS user_id,\n u.first_name as \"first_name!\",\n u.last_name as \"last_name!\",\n u.email,\n CASE\n WHEN rs.user_id IS NOT NULL AND rs.user_id != r.user_id\n THEN hu.first_name || ' ' || hu.last_name\n ELSE NULL\n END AS guest_of,\n\n sp.name AS spot_name,\n r.contribution,\n\n FALSE AS \"is_manual!: bool\",\n r.created_at,\n r.checkin_at,\n\n rs.id AS \"session_id!: i64\",\n rs.status AS \"status!\"\n FROM rsvps r\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n JOIN spots sp ON sp.id = r.spot_id\n JOIN users u ON u.id = r.user_id\n JOIN users hu ON hu.id = rs.user_id\n WHERE rs.event_id = ?\n AND rs.status IN ('payment_pending', 'payment_confirmed')\n\n UNION ALL\n\n SELECT\n u.id AS user_id,\n u.first_name as \"first_name!\",\n u.last_name as \"last_name!\",\n u.email,\n cu.first_name || ' ' || cu.last_name AS guest_of,\n\n NULL AS spot_name,\n 0 AS contribution,\n\n TRUE AS \"is_manual!: bool\",\n mr.created_at,\n mr.checkin_at,\n\n 0 AS \"session_id!: i64\",\n 'manual' AS \"status!\"\n FROM manual_rsvps mr\n JOIN users u ON u.id = mr.user_id\n JOIN users cu ON cu.id = mr.creator_user_id\n WHERE mr.event_id = ?\n\n ORDER BY 11;\n ", + "query": "\n SELECT\n u.id AS user_id,\n u.first_name as \"first_name!\",\n u.last_name as \"last_name!\",\n u.email,\n CASE\n WHEN rs.user_id IS NOT NULL AND rs.user_id != r.user_id\n THEN hu.first_name || ' ' || hu.last_name\n ELSE NULL\n END AS guest_of,\n\n sp.name AS spot_name,\n r.contribution,\n\n FALSE AS \"is_manual!: bool\",\n r.created_at,\n r.checkin_at,\n\n rs.id AS \"session_id!: i64\",\n rs.token AS session_token,\n rs.status AS \"status!\"\n FROM rsvps r\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n JOIN spots sp ON sp.id = r.spot_id\n JOIN users u ON u.id = r.user_id\n JOIN users hu ON hu.id = rs.user_id\n WHERE rs.event_id = ?\n AND rs.status IN ('payment_pending', 'payment_confirmed')\n\n UNION ALL\n\n SELECT\n u.id AS user_id,\n u.first_name as \"first_name!\",\n u.last_name as \"last_name!\",\n u.email,\n cu.first_name || ' ' || cu.last_name AS guest_of,\n\n NULL AS spot_name,\n 0 AS contribution,\n\n TRUE AS \"is_manual!: bool\",\n mr.created_at,\n mr.checkin_at,\n\n 0 AS \"session_id!: i64\",\n NULL AS session_token,\n 'manual' AS \"status!\"\n FROM manual_rsvps mr\n JOIN users u ON u.id = mr.user_id\n JOIN users cu ON cu.id = mr.creator_user_id\n WHERE mr.event_id = ?\n\n ORDER BY 11;\n ", "describe": { "columns": [ { @@ -59,9 +59,14 @@ "type_info": "Integer" }, { - "name": "status!", + "name": "session_token", "ordinal": 11, "type_info": "Text" + }, + { + "name": "status!", + "ordinal": 12, + "type_info": "Text" } ], "parameters": { @@ -79,8 +84,9 @@ false, true, false, + false, false ] }, - "hash": "c9f07131ab783144f4962daa23c91a75490a99a7689587115b92debcc06c114a" + "hash": "1041a86bb05f0dd39693fb3942b212fe491fa3cee195fd2ce0ae74940ab5ad57" } diff --git a/.sqlx/query-2ee5f2eb3e517e0954c5bc4d7161c1b0e36e560b22aea8eed6209df746e7c1d0.json b/.sqlx/query-2ee5f2eb3e517e0954c5bc4d7161c1b0e36e560b22aea8eed6209df746e7c1d0.json deleted file mode 100644 index b074aed..0000000 --- a/.sqlx/query-2ee5f2eb3e517e0954c5bc4d7161c1b0e36e560b22aea8eed6209df746e7c1d0.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "db_name": "SQLite", - "query": "SELECT rs.status, u.email\n FROM users u\n JOIN rsvps r ON r.user_id = u.id\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n WHERE rs.event_id = ?\n AND rs.id != ?\n ", - "describe": { - "columns": [ - { - "name": "status", - "ordinal": 0, - "type_info": "Text" - }, - { - "name": "email", - "ordinal": 1, - "type_info": "Text" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - false, - false - ] - }, - "hash": "2ee5f2eb3e517e0954c5bc4d7161c1b0e36e560b22aea8eed6209df746e7c1d0" -} diff --git a/.sqlx/query-3cf23aa88d50cc738bf4d7827dd8e1f7dd2064184f20110ad37ce307d8b51560.json b/.sqlx/query-3cf23aa88d50cc738bf4d7827dd8e1f7dd2064184f20110ad37ce307d8b51560.json new file mode 100644 index 0000000..0f6f695 --- /dev/null +++ b/.sqlx/query-3cf23aa88d50cc738bf4d7827dd8e1f7dd2064184f20110ad37ce307d8b51560.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "SELECT r.id as rsvp_id, r.spot_id, r.contribution\n FROM rsvps r\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n WHERE rs.event_id = ? AND rs.user_id = ?\n AND rs.status IN (?, ?)", + "describe": { + "columns": [ + { + "name": "rsvp_id", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "spot_id", + "ordinal": 1, + "type_info": "Integer" + }, + { + "name": "contribution", + "ordinal": 2, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 4 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "3cf23aa88d50cc738bf4d7827dd8e1f7dd2064184f20110ad37ce307d8b51560" +} diff --git a/.sqlx/query-6c8440178822b581416628666b0a649068ec9c534b94a578d9820f3abbe018d7.json b/.sqlx/query-6c8440178822b581416628666b0a649068ec9c534b94a578d9820f3abbe018d7.json new file mode 100644 index 0000000..8aadaf2 --- /dev/null +++ b/.sqlx/query-6c8440178822b581416628666b0a649068ec9c534b94a578d9820f3abbe018d7.json @@ -0,0 +1,50 @@ +{ + "db_name": "SQLite", + "query": "SELECT s.name AS spot_name,\n u.first_name AS \"first_name!: String\",\n u.last_name AS \"last_name!: String\",\n u.email, u.phone, r.contribution\n FROM rsvps r\n JOIN spots s ON s.id = r.spot_id\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n JOIN users u ON u.id = r.user_id\n WHERE rs.event_id = ? AND rs.user_id = ?\n AND rs.status IN (?, ?)\n ORDER BY r.created_at", + "describe": { + "columns": [ + { + "name": "spot_name", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "first_name!: String", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "last_name!: String", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "email", + "ordinal": 3, + "type_info": "Text" + }, + { + "name": "phone", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "contribution", + "ordinal": 5, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 4 + }, + "nullable": [ + false, + true, + true, + false, + true, + false + ] + }, + "hash": "6c8440178822b581416628666b0a649068ec9c534b94a578d9820f3abbe018d7" +} diff --git a/.sqlx/query-c0c119524815d33dd5e781f3e525c248b47e6b311211b3cd74ce45db486e77cc.json b/.sqlx/query-6d0324262bfb2d4ea03c0fb53354f78ba37a10ca73a55e8ac6879616537164f1.json similarity index 63% rename from .sqlx/query-c0c119524815d33dd5e781f3e525c248b47e6b311211b3cd74ce45db486e77cc.json rename to .sqlx/query-6d0324262bfb2d4ea03c0fb53354f78ba37a10ca73a55e8ac6879616537164f1.json index 7221c0c..7841753 100644 --- a/.sqlx/query-c0c119524815d33dd5e781f3e525c248b47e6b311211b3cd74ce45db486e77cc.json +++ b/.sqlx/query-6d0324262bfb2d4ea03c0fb53354f78ba37a10ca73a55e8ac6879616537164f1.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT\n r.id AS rsvp_id,\n r.user_id,\n s.name AS spot_name,\n u.first_name,\n u.last_name,\n u.email,\n u.phone,\n r.contribution\n FROM rsvps r\n JOIN spots s ON s.id = r.spot_id\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n LEFT JOIN users u ON u.id = r.user_id\n WHERE rs.id = ?\n ", + "query": "SELECT r.id AS rsvp_id, r.user_id, s.name AS spot_name,\n u.first_name, u.last_name, u.email, u.phone, r.contribution\n FROM rsvps r\n JOIN spots s ON s.id = r.spot_id\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n LEFT JOIN users u ON u.id = r.user_id\n WHERE rs.id = ?\n ORDER BY r.created_at", "describe": { "columns": [ { @@ -58,5 +58,5 @@ false ] }, - "hash": "c0c119524815d33dd5e781f3e525c248b47e6b311211b3cd74ce45db486e77cc" + "hash": "6d0324262bfb2d4ea03c0fb53354f78ba37a10ca73a55e8ac6879616537164f1" } diff --git a/.sqlx/query-71894732375ed3dd056e4662459015847e03f419803362daed674162b5eef82d.json b/.sqlx/query-71894732375ed3dd056e4662459015847e03f419803362daed674162b5eef82d.json new file mode 100644 index 0000000..fe760ce --- /dev/null +++ b/.sqlx/query-71894732375ed3dd056e4662459015847e03f419803362daed674162b5eef82d.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "SELECT rs.id AS session_id, rs.status, u.email\n FROM users u\n JOIN rsvps r ON r.user_id = u.id\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n WHERE rs.event_id = ?", + "describe": { + "columns": [ + { + "name": "session_id", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "status", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "email", + "ordinal": 2, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "71894732375ed3dd056e4662459015847e03f419803362daed674162b5eef82d" +} diff --git a/.sqlx/query-72ed5154a55670ee5dd0036673e26cc94dde4ad07969e4e41b73bab927cba609.json b/.sqlx/query-72ed5154a55670ee5dd0036673e26cc94dde4ad07969e4e41b73bab927cba609.json new file mode 100644 index 0000000..cc98631 --- /dev/null +++ b/.sqlx/query-72ed5154a55670ee5dd0036673e26cc94dde4ad07969e4e41b73bab927cba609.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "SELECT r.id as rsvp_id, r.spot_id, r.contribution\n FROM rsvps r\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n WHERE rs.event_id = ?\n AND rs.status IN (?, ?, ?)", + "describe": { + "columns": [ + { + "name": "rsvp_id", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "spot_id", + "ordinal": 1, + "type_info": "Integer" + }, + { + "name": "contribution", + "ordinal": 2, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 4 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "72ed5154a55670ee5dd0036673e26cc94dde4ad07969e4e41b73bab927cba609" +} diff --git a/.sqlx/query-8ad04fb6a4301ca8d5b613604a8261243e25005b244f89fafcd5d30bce1632f6.json b/.sqlx/query-8ad04fb6a4301ca8d5b613604a8261243e25005b244f89fafcd5d30bce1632f6.json new file mode 100644 index 0000000..db329d9 --- /dev/null +++ b/.sqlx/query-8ad04fb6a4301ca8d5b613604a8261243e25005b244f89fafcd5d30bce1632f6.json @@ -0,0 +1,98 @@ +{ + "db_name": "SQLite", + "query": "INSERT INTO rsvp_sessions\n (event_id, token, status, user_id, user_version, parent_session_id)\n VALUES (?, ?, ?, ?, ?, ?)\n RETURNING *", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "event_id", + "ordinal": 1, + "type_info": "Integer" + }, + { + "name": "token", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "status", + "ordinal": 3, + "type_info": "Text" + }, + { + "name": "user_id", + "ordinal": 4, + "type_info": "Integer" + }, + { + "name": "user_version", + "ordinal": 5, + "type_info": "Integer" + }, + { + "name": "stripe_client_secret", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "stripe_payment_intent_id", + "ordinal": 7, + "type_info": "Text" + }, + { + "name": "stripe_charge_id", + "ordinal": 8, + "type_info": "Integer" + }, + { + "name": "stripe_refund_id", + "ordinal": 9, + "type_info": "Text" + }, + { + "name": "created_at", + "ordinal": 10, + "type_info": "Datetime" + }, + { + "name": "updated_at", + "ordinal": 11, + "type_info": "Datetime" + }, + { + "name": "parent_session_id", + "ordinal": 12, + "type_info": "Integer" + }, + { + "name": "stripe_checkout_session_id", + "ordinal": 13, + "type_info": "Text" + } + ], + "parameters": { + "Right": 6 + }, + "nullable": [ + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + false, + false, + true, + true + ] + }, + "hash": "8ad04fb6a4301ca8d5b613604a8261243e25005b244f89fafcd5d30bce1632f6" +} diff --git a/.sqlx/query-988cb36da7c06fd28a2a7ad3efe80a2da801646970f8298cabd0db2834d72334.json b/.sqlx/query-988cb36da7c06fd28a2a7ad3efe80a2da801646970f8298cabd0db2834d72334.json new file mode 100644 index 0000000..e1e80ed --- /dev/null +++ b/.sqlx/query-988cb36da7c06fd28a2a7ad3efe80a2da801646970f8298cabd0db2834d72334.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "SELECT r.id as rsvp_id, r.spot_id, r.contribution\n FROM rsvps r\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n WHERE rs.event_id = ? AND rs.user_id = ?\n AND rs.status IN (?, ?, ?)", + "describe": { + "columns": [ + { + "name": "rsvp_id", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "spot_id", + "ordinal": 1, + "type_info": "Integer" + }, + { + "name": "contribution", + "ordinal": 2, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 5 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "988cb36da7c06fd28a2a7ad3efe80a2da801646970f8298cabd0db2834d72334" +} diff --git a/.sqlx/query-77284e1814e4ea7672ade202789dd3dcfd1d5c60b98e661ca1b298b04c19653b.json b/.sqlx/query-a7e807c5eccd6b6a64513cd9edcec0c4233a6cf5871f63a4bdacceab369bc303.json similarity index 78% rename from .sqlx/query-77284e1814e4ea7672ade202789dd3dcfd1d5c60b98e661ca1b298b04c19653b.json rename to .sqlx/query-a7e807c5eccd6b6a64513cd9edcec0c4233a6cf5871f63a4bdacceab369bc303.json index f6840a6..faae005 100644 --- a/.sqlx/query-77284e1814e4ea7672ade202789dd3dcfd1d5c60b98e661ca1b298b04c19653b.json +++ b/.sqlx/query-a7e807c5eccd6b6a64513cd9edcec0c4233a6cf5871f63a4bdacceab369bc303.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT * FROM rsvp_sessions\n WHERE user_id = ? AND event_id = ?\n AND status IN ('payment_pending', 'payment_confirmed')\n LIMIT 1", + "query": "SELECT * FROM rsvp_sessions\n WHERE user_id = ? AND event_id = ?\n AND status IN (?, ?)", "describe": { "columns": [ { @@ -62,10 +62,20 @@ "name": "updated_at", "ordinal": 11, "type_info": "Datetime" + }, + { + "name": "parent_session_id", + "ordinal": 12, + "type_info": "Integer" + }, + { + "name": "stripe_checkout_session_id", + "ordinal": 13, + "type_info": "Text" } ], "parameters": { - "Right": 2 + "Right": 4 }, "nullable": [ false, @@ -79,8 +89,10 @@ true, true, false, - false + false, + true, + true ] }, - "hash": "77284e1814e4ea7672ade202789dd3dcfd1d5c60b98e661ca1b298b04c19653b" + "hash": "a7e807c5eccd6b6a64513cd9edcec0c4233a6cf5871f63a4bdacceab369bc303" } diff --git a/.sqlx/query-aa47682155f3c1b6d5186a1d54c3f0eba6aca9f0eea1c6cb5e732a2ccbecd6f5.json b/.sqlx/query-aa47682155f3c1b6d5186a1d54c3f0eba6aca9f0eea1c6cb5e732a2ccbecd6f5.json new file mode 100644 index 0000000..1d4da7f --- /dev/null +++ b/.sqlx/query-aa47682155f3c1b6d5186a1d54c3f0eba6aca9f0eea1c6cb5e732a2ccbecd6f5.json @@ -0,0 +1,98 @@ +{ + "db_name": "SQLite", + "query": "SELECT * FROM rsvp_sessions\n WHERE parent_session_id = ?\n AND status IN (?, ?, ?)\n LIMIT 1", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "event_id", + "ordinal": 1, + "type_info": "Integer" + }, + { + "name": "token", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "status", + "ordinal": 3, + "type_info": "Text" + }, + { + "name": "user_id", + "ordinal": 4, + "type_info": "Integer" + }, + { + "name": "user_version", + "ordinal": 5, + "type_info": "Integer" + }, + { + "name": "stripe_client_secret", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "stripe_payment_intent_id", + "ordinal": 7, + "type_info": "Text" + }, + { + "name": "stripe_charge_id", + "ordinal": 8, + "type_info": "Integer" + }, + { + "name": "stripe_refund_id", + "ordinal": 9, + "type_info": "Text" + }, + { + "name": "created_at", + "ordinal": 10, + "type_info": "Datetime" + }, + { + "name": "updated_at", + "ordinal": 11, + "type_info": "Datetime" + }, + { + "name": "parent_session_id", + "ordinal": 12, + "type_info": "Integer" + }, + { + "name": "stripe_checkout_session_id", + "ordinal": 13, + "type_info": "Text" + } + ], + "parameters": { + "Right": 4 + }, + "nullable": [ + false, + false, + false, + false, + true, + true, + true, + true, + true, + true, + false, + false, + true, + true + ] + }, + "hash": "aa47682155f3c1b6d5186a1d54c3f0eba6aca9f0eea1c6cb5e732a2ccbecd6f5" +} diff --git a/.sqlx/query-3d82179023e55e3899ad4cde3f700122bf54516baa25b9d7eebc5a970ec74145.json b/.sqlx/query-ae97a70f035b2e1bbb446e664f55a0cde5898c3caba11fbb18c0e707eba1760e.json similarity index 69% rename from .sqlx/query-3d82179023e55e3899ad4cde3f700122bf54516baa25b9d7eebc5a970ec74145.json rename to .sqlx/query-ae97a70f035b2e1bbb446e664f55a0cde5898c3caba11fbb18c0e707eba1760e.json index 975537f..4124ced 100644 --- a/.sqlx/query-3d82179023e55e3899ad4cde3f700122bf54516baa25b9d7eebc5a970ec74145.json +++ b/.sqlx/query-ae97a70f035b2e1bbb446e664f55a0cde5898c3caba11fbb18c0e707eba1760e.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT\n s.id,\n s.token,\n s.status,\n s.created_at,\n s.updated_at,\n e.title AS event_title,\n e.slug AS event_slug,\n u.email AS user_email\n FROM rsvp_sessions s\n JOIN events e ON e.id = s.event_id\n LEFT JOIN users u ON u.id = s.user_id\n WHERE e.start > datetime('now', '-24 hours')\n ORDER BY s.updated_at DESC", + "query": "SELECT\n s.id,\n s.token,\n s.status,\n s.created_at,\n s.updated_at,\n e.title AS event_title,\n e.slug AS event_slug,\n u.email AS user_email,\n ps.token AS parent_token\n FROM rsvp_sessions s\n JOIN events e ON e.id = s.event_id\n LEFT JOIN users u ON u.id = s.user_id\n LEFT JOIN rsvp_sessions ps ON ps.id = s.parent_session_id\n WHERE e.start > datetime('now', '-24 hours')\n ORDER BY s.updated_at DESC", "describe": { "columns": [ { @@ -42,6 +42,11 @@ "name": "user_email", "ordinal": 7, "type_info": "Text" + }, + { + "name": "parent_token", + "ordinal": 8, + "type_info": "Text" } ], "parameters": { @@ -55,8 +60,9 @@ false, false, false, + true, true ] }, - "hash": "3d82179023e55e3899ad4cde3f700122bf54516baa25b9d7eebc5a970ec74145" + "hash": "ae97a70f035b2e1bbb446e664f55a0cde5898c3caba11fbb18c0e707eba1760e" } diff --git a/.sqlx/query-b4c62be45767038bd8a4bc1ae18f1563047d3602e275a3d7199e086e0d7af88c.json b/.sqlx/query-b4c62be45767038bd8a4bc1ae18f1563047d3602e275a3d7199e086e0d7af88c.json index b15e4b3..d748b0f 100644 --- a/.sqlx/query-b4c62be45767038bd8a4bc1ae18f1563047d3602e275a3d7199e086e0d7af88c.json +++ b/.sqlx/query-b4c62be45767038bd8a4bc1ae18f1563047d3602e275a3d7199e086e0d7af88c.json @@ -62,6 +62,16 @@ "name": "updated_at", "ordinal": 11, "type_info": "Datetime" + }, + { + "name": "parent_session_id", + "ordinal": 12, + "type_info": "Integer" + }, + { + "name": "stripe_checkout_session_id", + "ordinal": 13, + "type_info": "Text" } ], "parameters": { @@ -79,7 +89,9 @@ true, true, false, - false + false, + true, + true ] }, "hash": "b4c62be45767038bd8a4bc1ae18f1563047d3602e275a3d7199e086e0d7af88c" diff --git a/.sqlx/query-beae8fe5b9443d004e595b7240d20ac75666b604db733e5b2b95ed027ea158b5.json b/.sqlx/query-beae8fe5b9443d004e595b7240d20ac75666b604db733e5b2b95ed027ea158b5.json index 8ab94f2..c1ad54a 100644 --- a/.sqlx/query-beae8fe5b9443d004e595b7240d20ac75666b604db733e5b2b95ed027ea158b5.json +++ b/.sqlx/query-beae8fe5b9443d004e595b7240d20ac75666b604db733e5b2b95ed027ea158b5.json @@ -62,6 +62,16 @@ "name": "updated_at", "ordinal": 11, "type_info": "Datetime" + }, + { + "name": "parent_session_id", + "ordinal": 12, + "type_info": "Integer" + }, + { + "name": "stripe_checkout_session_id", + "ordinal": 13, + "type_info": "Text" } ], "parameters": { @@ -79,7 +89,9 @@ true, true, false, - false + false, + true, + true ] }, "hash": "beae8fe5b9443d004e595b7240d20ac75666b604db733e5b2b95ed027ea158b5" diff --git a/.sqlx/query-cb8ebe3dbe5eb6bcb86522afa953d96c436371c4aee43fd916de2f72198bffd3.json b/.sqlx/query-cb8ebe3dbe5eb6bcb86522afa953d96c436371c4aee43fd916de2f72198bffd3.json deleted file mode 100644 index fa5e875..0000000 --- a/.sqlx/query-cb8ebe3dbe5eb6bcb86522afa953d96c436371c4aee43fd916de2f72198bffd3.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "UPDATE rsvp_sessions\n SET stripe_client_secret = ?, updated_at = CURRENT_TIMESTAMP\n WHERE id = ?", - "describe": { - "columns": [], - "parameters": { - "Right": 2 - }, - "nullable": [] - }, - "hash": "cb8ebe3dbe5eb6bcb86522afa953d96c436371c4aee43fd916de2f72198bffd3" -} diff --git a/.sqlx/query-d5ed71da563d1e1ec855dc3043100b349da6f365d7c011616ee37d551169e3cc.json b/.sqlx/query-d5ed71da563d1e1ec855dc3043100b349da6f365d7c011616ee37d551169e3cc.json index 01b8a8e..5ae78ae 100644 --- a/.sqlx/query-d5ed71da563d1e1ec855dc3043100b349da6f365d7c011616ee37d551169e3cc.json +++ b/.sqlx/query-d5ed71da563d1e1ec855dc3043100b349da6f365d7c011616ee37d551169e3cc.json @@ -62,6 +62,16 @@ "name": "updated_at", "ordinal": 11, "type_info": "Datetime" + }, + { + "name": "parent_session_id", + "ordinal": 12, + "type_info": "Integer" + }, + { + "name": "stripe_checkout_session_id", + "ordinal": 13, + "type_info": "Text" } ], "parameters": { @@ -79,7 +89,9 @@ true, true, false, - false + false, + true, + true ] }, "hash": "d5ed71da563d1e1ec855dc3043100b349da6f365d7c011616ee37d551169e3cc" diff --git a/.sqlx/query-4d491f9fa61509759db0864629f2c38d4a895451f4a16bde94c601f5bee1c2e7.json b/.sqlx/query-d858f3afb9b9ad35ecb072bc29cba5f94c5ab223eb8c19b6d321f0bb4f99e4fd.json similarity index 58% rename from .sqlx/query-4d491f9fa61509759db0864629f2c38d4a895451f4a16bde94c601f5bee1c2e7.json rename to .sqlx/query-d858f3afb9b9ad35ecb072bc29cba5f94c5ab223eb8c19b6d321f0bb4f99e4fd.json index 14b0628..5d012cf 100644 --- a/.sqlx/query-4d491f9fa61509759db0864629f2c38d4a895451f4a16bde94c601f5bee1c2e7.json +++ b/.sqlx/query-d858f3afb9b9ad35ecb072bc29cba5f94c5ab223eb8c19b6d321f0bb4f99e4fd.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "SELECT\n s.name AS spot_name,\n u.first_name AS \"first_name!: String\",\n u.last_name AS \"last_name!: String\",\n u.email,\n u.phone,\n r.contribution\n FROM rsvps r\n JOIN spots s ON s.id = r.spot_id\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n JOIN users u ON u.id = r.user_id\n WHERE rs.id = ?\n ", + "query": "SELECT s.name AS spot_name,\n u.first_name AS \"first_name!: String\",\n u.last_name AS \"last_name!: String\",\n u.email, u.phone, r.contribution\n FROM rsvps r\n JOIN spots s ON s.id = r.spot_id\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n JOIN users u ON u.id = r.user_id\n WHERE rs.id = ?\n ORDER BY r.created_at", "describe": { "columns": [ { @@ -46,5 +46,5 @@ false ] }, - "hash": "4d491f9fa61509759db0864629f2c38d4a895451f4a16bde94c601f5bee1c2e7" + "hash": "d858f3afb9b9ad35ecb072bc29cba5f94c5ab223eb8c19b6d321f0bb4f99e4fd" } diff --git a/.sqlx/query-e8dd518fdf1f27e5bddb3f65ca4ae844e133f8c89919e705b945df6480c92044.json b/.sqlx/query-e8dd518fdf1f27e5bddb3f65ca4ae844e133f8c89919e705b945df6480c92044.json index 56a0b0e..797de05 100644 --- a/.sqlx/query-e8dd518fdf1f27e5bddb3f65ca4ae844e133f8c89919e705b945df6480c92044.json +++ b/.sqlx/query-e8dd518fdf1f27e5bddb3f65ca4ae844e133f8c89919e705b945df6480c92044.json @@ -62,6 +62,16 @@ "name": "updated_at", "ordinal": 11, "type_info": "Datetime" + }, + { + "name": "parent_session_id", + "ordinal": 12, + "type_info": "Integer" + }, + { + "name": "stripe_checkout_session_id", + "ordinal": 13, + "type_info": "Text" } ], "parameters": { @@ -79,7 +89,9 @@ true, true, false, - false + false, + true, + true ] }, "hash": "e8dd518fdf1f27e5bddb3f65ca4ae844e133f8c89919e705b945df6480c92044" diff --git a/.sqlx/query-fe154fdc6fa3fbb807b7b69d466728697892c95303df4d4712203c4800125099.json b/.sqlx/query-fe154fdc6fa3fbb807b7b69d466728697892c95303df4d4712203c4800125099.json new file mode 100644 index 0000000..7f6cd59 --- /dev/null +++ b/.sqlx/query-fe154fdc6fa3fbb807b7b69d466728697892c95303df4d4712203c4800125099.json @@ -0,0 +1,62 @@ +{ + "db_name": "SQLite", + "query": "SELECT r.id AS rsvp_id, r.user_id, s.name AS spot_name,\n u.first_name, u.last_name, u.email, u.phone, r.contribution\n FROM rsvps r\n JOIN spots s ON s.id = r.spot_id\n JOIN rsvp_sessions rs ON rs.id = r.session_id\n LEFT JOIN users u ON u.id = r.user_id\n WHERE rs.event_id = ? AND rs.user_id = ?\n AND rs.status IN (?, ?)\n ORDER BY r.created_at", + "describe": { + "columns": [ + { + "name": "rsvp_id", + "ordinal": 0, + "type_info": "Integer" + }, + { + "name": "user_id", + "ordinal": 1, + "type_info": "Integer" + }, + { + "name": "spot_name", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "first_name", + "ordinal": 3, + "type_info": "Text" + }, + { + "name": "last_name", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "email", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "phone", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "contribution", + "ordinal": 7, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 4 + }, + "nullable": [ + false, + true, + false, + true, + true, + true, + true, + false + ] + }, + "hash": "fe154fdc6fa3fbb807b7b69d466728697892c95303df4d4712203c4800125099" +} diff --git a/frontend/styles/events/attendees.css b/frontend/styles/events/attendees.css index 3c2d9dd..7c611bb 100644 --- a/frontend/styles/events/attendees.css +++ b/frontend/styles/events/attendees.css @@ -12,10 +12,11 @@ .table-wrapper { @apply overflow-x-scroll; + scrollbar-color: theme(colors.lsd-charcoal) transparent; } table.attendees { - @apply w-full text-xs whitespace-nowrap; + @apply text-xs whitespace-nowrap ml-auto mr-auto; border-spacing: 1rem 0; border-collapse: separate; } @@ -44,7 +45,7 @@ } .actions { - @apply flex flex-wrap gap-2 text-xs; + @apply flex gap-2 text-xs; a { @apply flex items-center gap-2 p-2 py-1; } diff --git a/frontend/styles/events/rsvp_manage.css b/frontend/styles/events/rsvp_manage.css index fee092a..96cc214 100644 --- a/frontend/styles/events/rsvp_manage.css +++ b/frontend/styles/events/rsvp_manage.css @@ -4,7 +4,7 @@ height: 240px; transition: height 0.15s ease; @media (min-width: 768px) { - @apply w-full max-w-3xl cursor-default; + @apply w-full max-w-3xl; height: 384px; } @@ -47,7 +47,8 @@ a, button { @apply grow cursor-pointer rounded-lg py-4 text-center; - &.edit { + &.edit, + &.add-guests { @apply bg-lsd-charcoal; } &.contact { diff --git a/frontend/templates/events/attendees.html b/frontend/templates/events/attendees.html index 7c3969f..8668c44 100644 --- a/frontend/templates/events/attendees.html +++ b/frontend/templates/events/attendees.html @@ -29,6 +29,7 @@

{{ event.title }}

Email Guest of Spot + Reservation # Created Checkin @@ -53,6 +54,7 @@

{{ event.title }}

(${{ rsvp.contribution }}) {% endif %} + {{ rsvp.session_token|unwrap_or_empty }}