From f94d2db8b158d8c653df5181c92ed95ed19217eb Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Mon, 4 May 2026 14:21:25 +0200 Subject: [PATCH] feat(sqlite): implement get_review_by_id, delete_review, delete_movie --- ...b60414cfcdc2c7a8570351320c4bc425347c6.json | 92 +++++++++++++++++++ ...6137aabfaf603b5ed57b98ac2888b4a0389ff.json | 92 +++++++++++++++++++ ...d6ea3a301a2a3adbdfdda4a88f333a1144c77.json | 20 ++++ ...425e43d09a6df97c335ac347f7cfd61acd171.json | 32 +++++++ ...32d9ea7eabc99d9f1a44694e5d10762606f82.json | 12 +++ ...a65ac0b8a001798a2476ea86143c5565df399.json | 32 +++++++ ...00c02f0df3516979518976e13f9d9abc6a403.json | 50 ++++++++++ ...0824bb55af7cc7a854f590d326622863759d1.json | 50 ++++++++++ ...adba96f40319140834d510bc5207b2552e055.json | 92 +++++++++++++++++++ ...c4a830f016234bb690e1f6240f02824d6d84f.json | 20 ++++ ...8225e6e18e6079644b949258a39bf4b0fe3e5.json | 12 +++ ...23ba2091b8b70b1885ca6518dfa4bb01fdac2.json | 56 +++++++++++ ...e908fc22b977b3cbf063ee93ffe4648c42011.json | 50 ++++++++++ ...cfa40bdc4b09391afe04325f076157d9d84aa.json | 12 +++ ...a6e62fbdfbf00c97c9b33b699dc631476181d.json | 56 +++++++++++ ...681755f079a044ffec8ff2bd79cfd8efe16b8.json | 92 +++++++++++++++++++ ...e3f4c19cb52dcfff66772145cd80c53c16883.json | 12 +++ ...de4a42c12891025236abc48ea4f175292a6cc.json | 12 +++ crates/adapters/sqlite/src/lib.rs | 35 ++++++- 19 files changed, 828 insertions(+), 1 deletion(-) create mode 100644 .sqlx/query-01a08873b7fa815ad98a56a0902b60414cfcdc2c7a8570351320c4bc425347c6.json create mode 100644 .sqlx/query-026e2afeb573707cb360fcdab8f6137aabfaf603b5ed57b98ac2888b4a0389ff.json create mode 100644 .sqlx/query-0963b9661182e139cd760bbabb0d6ea3a301a2a3adbdfdda4a88f333a1144c77.json create mode 100644 .sqlx/query-167481bb1692cc81531d9a5cd85425e43d09a6df97c335ac347f7cfd61acd171.json create mode 100644 .sqlx/query-18de90feb13b9f467f06d0ce25332d9ea7eabc99d9f1a44694e5d10762606f82.json create mode 100644 .sqlx/query-1bc5a51762717e45292626052f0a65ac0b8a001798a2476ea86143c5565df399.json create mode 100644 .sqlx/query-3047579c6ed13ce87aad9b9ce6300c02f0df3516979518976e13f9d9abc6a403.json create mode 100644 .sqlx/query-33d0dae7d16b0635c1c7eb5afd10824bb55af7cc7a854f590d326622863759d1.json create mode 100644 .sqlx/query-47f7cf95ce3450635b643ab710cadba96f40319140834d510bc5207b2552e055.json create mode 100644 .sqlx/query-4b3074b532342c6356ee0e8e4d8c4a830f016234bb690e1f6240f02824d6d84f.json create mode 100644 .sqlx/query-630e092fcd33bc312befef352a98225e6e18e6079644b949258a39bf4b0fe3e5.json create mode 100644 .sqlx/query-70ee6050284475b5641af712e5923ba2091b8b70b1885ca6518dfa4bb01fdac2.json create mode 100644 .sqlx/query-7bc4aebcb94547976d3d7e063e4e908fc22b977b3cbf063ee93ffe4648c42011.json create mode 100644 .sqlx/query-7d7e23355ee0e442f2aa27e898dcfa40bdc4b09391afe04325f076157d9d84aa.json create mode 100644 .sqlx/query-af883f8b78f185077e2d3dcfaa0a6e62fbdfbf00c97c9b33b699dc631476181d.json create mode 100644 .sqlx/query-affe1eb261283c09d4b1ce6e684681755f079a044ffec8ff2bd79cfd8efe16b8.json create mode 100644 .sqlx/query-e431381ad41c1c2f7b9c89509d5e3f4c19cb52dcfff66772145cd80c53c16883.json create mode 100644 .sqlx/query-f84e5483ca4210aec67b38cc1a9de4a42c12891025236abc48ea4f175292a6cc.json diff --git a/.sqlx/query-01a08873b7fa815ad98a56a0902b60414cfcdc2c7a8570351320c4bc425347c6.json b/.sqlx/query-01a08873b7fa815ad98a56a0902b60414cfcdc2c7a8570351320c4bc425347c6.json new file mode 100644 index 0000000..27ed241 --- /dev/null +++ b/.sqlx/query-01a08873b7fa815ad98a56a0902b60414cfcdc2c7a8570351320c4bc425347c6.json @@ -0,0 +1,92 @@ +{ + "db_name": "SQLite", + "query": "SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path,\n r.id AS review_id, r.movie_id, r.user_id, r.rating, r.comment, r.watched_at, r.created_at\n FROM reviews r\n INNER JOIN movies m ON m.id = r.movie_id\n WHERE r.movie_id = ?\n ORDER BY r.watched_at ASC\n LIMIT ? OFFSET ?", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "external_metadata_id", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "title", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "release_year", + "ordinal": 3, + "type_info": "Integer" + }, + { + "name": "director", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "poster_path", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "review_id", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "movie_id", + "ordinal": 7, + "type_info": "Text" + }, + { + "name": "user_id", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "rating", + "ordinal": 9, + "type_info": "Integer" + }, + { + "name": "comment", + "ordinal": 10, + "type_info": "Text" + }, + { + "name": "watched_at", + "ordinal": 11, + "type_info": "Text" + }, + { + "name": "created_at", + "ordinal": 12, + "type_info": "Text" + } + ], + "parameters": { + "Right": 3 + }, + "nullable": [ + false, + true, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false, + false + ] + }, + "hash": "01a08873b7fa815ad98a56a0902b60414cfcdc2c7a8570351320c4bc425347c6" +} diff --git a/.sqlx/query-026e2afeb573707cb360fcdab8f6137aabfaf603b5ed57b98ac2888b4a0389ff.json b/.sqlx/query-026e2afeb573707cb360fcdab8f6137aabfaf603b5ed57b98ac2888b4a0389ff.json new file mode 100644 index 0000000..58175b3 --- /dev/null +++ b/.sqlx/query-026e2afeb573707cb360fcdab8f6137aabfaf603b5ed57b98ac2888b4a0389ff.json @@ -0,0 +1,92 @@ +{ + "db_name": "SQLite", + "query": "SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path,\n r.id AS review_id, r.movie_id, r.user_id, r.rating, r.comment, r.watched_at, r.created_at\n FROM reviews r\n INNER JOIN movies m ON m.id = r.movie_id\n ORDER BY r.watched_at DESC\n LIMIT ? OFFSET ?", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "external_metadata_id", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "title", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "release_year", + "ordinal": 3, + "type_info": "Integer" + }, + { + "name": "director", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "poster_path", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "review_id", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "movie_id", + "ordinal": 7, + "type_info": "Text" + }, + { + "name": "user_id", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "rating", + "ordinal": 9, + "type_info": "Integer" + }, + { + "name": "comment", + "ordinal": 10, + "type_info": "Text" + }, + { + "name": "watched_at", + "ordinal": 11, + "type_info": "Text" + }, + { + "name": "created_at", + "ordinal": 12, + "type_info": "Text" + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + false, + true, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false, + false + ] + }, + "hash": "026e2afeb573707cb360fcdab8f6137aabfaf603b5ed57b98ac2888b4a0389ff" +} diff --git a/.sqlx/query-0963b9661182e139cd760bbabb0d6ea3a301a2a3adbdfdda4a88f333a1144c77.json b/.sqlx/query-0963b9661182e139cd760bbabb0d6ea3a301a2a3adbdfdda4a88f333a1144c77.json new file mode 100644 index 0000000..2fb8300 --- /dev/null +++ b/.sqlx/query-0963b9661182e139cd760bbabb0d6ea3a301a2a3adbdfdda4a88f333a1144c77.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "SELECT COUNT(*) FROM reviews", + "describe": { + "columns": [ + { + "name": "COUNT(*)", + "ordinal": 0, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 0 + }, + "nullable": [ + false + ] + }, + "hash": "0963b9661182e139cd760bbabb0d6ea3a301a2a3adbdfdda4a88f333a1144c77" +} diff --git a/.sqlx/query-167481bb1692cc81531d9a5cd85425e43d09a6df97c335ac347f7cfd61acd171.json b/.sqlx/query-167481bb1692cc81531d9a5cd85425e43d09a6df97c335ac347f7cfd61acd171.json new file mode 100644 index 0000000..80aefc3 --- /dev/null +++ b/.sqlx/query-167481bb1692cc81531d9a5cd85425e43d09a6df97c335ac347f7cfd61acd171.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "SELECT id, email, password_hash FROM users WHERE email = ?", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "email", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "password_hash", + "ordinal": 2, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "167481bb1692cc81531d9a5cd85425e43d09a6df97c335ac347f7cfd61acd171" +} diff --git a/.sqlx/query-18de90feb13b9f467f06d0ce25332d9ea7eabc99d9f1a44694e5d10762606f82.json b/.sqlx/query-18de90feb13b9f467f06d0ce25332d9ea7eabc99d9f1a44694e5d10762606f82.json new file mode 100644 index 0000000..78a50ea --- /dev/null +++ b/.sqlx/query-18de90feb13b9f467f06d0ce25332d9ea7eabc99d9f1a44694e5d10762606f82.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "INSERT OR IGNORE INTO users (id, email, password_hash, created_at) VALUES (?, ?, ?, ?)", + "describe": { + "columns": [], + "parameters": { + "Right": 4 + }, + "nullable": [] + }, + "hash": "18de90feb13b9f467f06d0ce25332d9ea7eabc99d9f1a44694e5d10762606f82" +} diff --git a/.sqlx/query-1bc5a51762717e45292626052f0a65ac0b8a001798a2476ea86143c5565df399.json b/.sqlx/query-1bc5a51762717e45292626052f0a65ac0b8a001798a2476ea86143c5565df399.json new file mode 100644 index 0000000..56618eb --- /dev/null +++ b/.sqlx/query-1bc5a51762717e45292626052f0a65ac0b8a001798a2476ea86143c5565df399.json @@ -0,0 +1,32 @@ +{ + "db_name": "SQLite", + "query": "SELECT id, email, password_hash FROM users WHERE id = ?", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "email", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "password_hash", + "ordinal": 2, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "1bc5a51762717e45292626052f0a65ac0b8a001798a2476ea86143c5565df399" +} diff --git a/.sqlx/query-3047579c6ed13ce87aad9b9ce6300c02f0df3516979518976e13f9d9abc6a403.json b/.sqlx/query-3047579c6ed13ce87aad9b9ce6300c02f0df3516979518976e13f9d9abc6a403.json new file mode 100644 index 0000000..54b4a4e --- /dev/null +++ b/.sqlx/query-3047579c6ed13ce87aad9b9ce6300c02f0df3516979518976e13f9d9abc6a403.json @@ -0,0 +1,50 @@ +{ + "db_name": "SQLite", + "query": "SELECT id, external_metadata_id, title, release_year, director, poster_path\n FROM movies WHERE title = ? AND release_year = ?", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "external_metadata_id", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "title", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "release_year", + "ordinal": 3, + "type_info": "Integer" + }, + { + "name": "director", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "poster_path", + "ordinal": 5, + "type_info": "Text" + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + false, + true, + false, + false, + true, + true + ] + }, + "hash": "3047579c6ed13ce87aad9b9ce6300c02f0df3516979518976e13f9d9abc6a403" +} diff --git a/.sqlx/query-33d0dae7d16b0635c1c7eb5afd10824bb55af7cc7a854f590d326622863759d1.json b/.sqlx/query-33d0dae7d16b0635c1c7eb5afd10824bb55af7cc7a854f590d326622863759d1.json new file mode 100644 index 0000000..5666885 --- /dev/null +++ b/.sqlx/query-33d0dae7d16b0635c1c7eb5afd10824bb55af7cc7a854f590d326622863759d1.json @@ -0,0 +1,50 @@ +{ + "db_name": "SQLite", + "query": "SELECT id, external_metadata_id, title, release_year, director, poster_path\n FROM movies WHERE id = ?", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "external_metadata_id", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "title", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "release_year", + "ordinal": 3, + "type_info": "Integer" + }, + { + "name": "director", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "poster_path", + "ordinal": 5, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + true, + false, + false, + true, + true + ] + }, + "hash": "33d0dae7d16b0635c1c7eb5afd10824bb55af7cc7a854f590d326622863759d1" +} diff --git a/.sqlx/query-47f7cf95ce3450635b643ab710cadba96f40319140834d510bc5207b2552e055.json b/.sqlx/query-47f7cf95ce3450635b643ab710cadba96f40319140834d510bc5207b2552e055.json new file mode 100644 index 0000000..8db3f5e --- /dev/null +++ b/.sqlx/query-47f7cf95ce3450635b643ab710cadba96f40319140834d510bc5207b2552e055.json @@ -0,0 +1,92 @@ +{ + "db_name": "SQLite", + "query": "SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path,\n r.id AS review_id, r.movie_id, r.user_id, r.rating, r.comment, r.watched_at, r.created_at\n FROM reviews r\n INNER JOIN movies m ON m.id = r.movie_id\n WHERE r.movie_id = ?\n ORDER BY r.watched_at DESC\n LIMIT ? OFFSET ?", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "external_metadata_id", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "title", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "release_year", + "ordinal": 3, + "type_info": "Integer" + }, + { + "name": "director", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "poster_path", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "review_id", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "movie_id", + "ordinal": 7, + "type_info": "Text" + }, + { + "name": "user_id", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "rating", + "ordinal": 9, + "type_info": "Integer" + }, + { + "name": "comment", + "ordinal": 10, + "type_info": "Text" + }, + { + "name": "watched_at", + "ordinal": 11, + "type_info": "Text" + }, + { + "name": "created_at", + "ordinal": 12, + "type_info": "Text" + } + ], + "parameters": { + "Right": 3 + }, + "nullable": [ + false, + true, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false, + false + ] + }, + "hash": "47f7cf95ce3450635b643ab710cadba96f40319140834d510bc5207b2552e055" +} diff --git a/.sqlx/query-4b3074b532342c6356ee0e8e4d8c4a830f016234bb690e1f6240f02824d6d84f.json b/.sqlx/query-4b3074b532342c6356ee0e8e4d8c4a830f016234bb690e1f6240f02824d6d84f.json new file mode 100644 index 0000000..1089c99 --- /dev/null +++ b/.sqlx/query-4b3074b532342c6356ee0e8e4d8c4a830f016234bb690e1f6240f02824d6d84f.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "SELECT COUNT(*) FROM reviews WHERE movie_id = ?", + "describe": { + "columns": [ + { + "name": "COUNT(*)", + "ordinal": 0, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "4b3074b532342c6356ee0e8e4d8c4a830f016234bb690e1f6240f02824d6d84f" +} diff --git a/.sqlx/query-630e092fcd33bc312befef352a98225e6e18e6079644b949258a39bf4b0fe3e5.json b/.sqlx/query-630e092fcd33bc312befef352a98225e6e18e6079644b949258a39bf4b0fe3e5.json new file mode 100644 index 0000000..8b41a06 --- /dev/null +++ b/.sqlx/query-630e092fcd33bc312befef352a98225e6e18e6079644b949258a39bf4b0fe3e5.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "INSERT INTO reviews (id, movie_id, user_id, rating, comment, watched_at, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)", + "describe": { + "columns": [], + "parameters": { + "Right": 7 + }, + "nullable": [] + }, + "hash": "630e092fcd33bc312befef352a98225e6e18e6079644b949258a39bf4b0fe3e5" +} diff --git a/.sqlx/query-70ee6050284475b5641af712e5923ba2091b8b70b1885ca6518dfa4bb01fdac2.json b/.sqlx/query-70ee6050284475b5641af712e5923ba2091b8b70b1885ca6518dfa4bb01fdac2.json new file mode 100644 index 0000000..2b9f9f8 --- /dev/null +++ b/.sqlx/query-70ee6050284475b5641af712e5923ba2091b8b70b1885ca6518dfa4bb01fdac2.json @@ -0,0 +1,56 @@ +{ + "db_name": "SQLite", + "query": "SELECT id, movie_id, user_id, rating, comment, watched_at, created_at\n FROM reviews WHERE id = ?", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "movie_id", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "user_id", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "rating", + "ordinal": 3, + "type_info": "Integer" + }, + { + "name": "comment", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "watched_at", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "created_at", + "ordinal": 6, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false, + false, + true, + false, + false + ] + }, + "hash": "70ee6050284475b5641af712e5923ba2091b8b70b1885ca6518dfa4bb01fdac2" +} diff --git a/.sqlx/query-7bc4aebcb94547976d3d7e063e4e908fc22b977b3cbf063ee93ffe4648c42011.json b/.sqlx/query-7bc4aebcb94547976d3d7e063e4e908fc22b977b3cbf063ee93ffe4648c42011.json new file mode 100644 index 0000000..a23bd20 --- /dev/null +++ b/.sqlx/query-7bc4aebcb94547976d3d7e063e4e908fc22b977b3cbf063ee93ffe4648c42011.json @@ -0,0 +1,50 @@ +{ + "db_name": "SQLite", + "query": "SELECT id, external_metadata_id, title, release_year, director, poster_path\n FROM movies WHERE external_metadata_id = ?", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "external_metadata_id", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "title", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "release_year", + "ordinal": 3, + "type_info": "Integer" + }, + { + "name": "director", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "poster_path", + "ordinal": 5, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + true, + false, + false, + true, + true + ] + }, + "hash": "7bc4aebcb94547976d3d7e063e4e908fc22b977b3cbf063ee93ffe4648c42011" +} diff --git a/.sqlx/query-7d7e23355ee0e442f2aa27e898dcfa40bdc4b09391afe04325f076157d9d84aa.json b/.sqlx/query-7d7e23355ee0e442f2aa27e898dcfa40bdc4b09391afe04325f076157d9d84aa.json new file mode 100644 index 0000000..1967c47 --- /dev/null +++ b/.sqlx/query-7d7e23355ee0e442f2aa27e898dcfa40bdc4b09391afe04325f076157d9d84aa.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "INSERT INTO movies (id, external_metadata_id, title, release_year, director, poster_path)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n external_metadata_id = excluded.external_metadata_id,\n title = excluded.title,\n release_year = excluded.release_year,\n director = excluded.director,\n poster_path = excluded.poster_path", + "describe": { + "columns": [], + "parameters": { + "Right": 6 + }, + "nullable": [] + }, + "hash": "7d7e23355ee0e442f2aa27e898dcfa40bdc4b09391afe04325f076157d9d84aa" +} diff --git a/.sqlx/query-af883f8b78f185077e2d3dcfaa0a6e62fbdfbf00c97c9b33b699dc631476181d.json b/.sqlx/query-af883f8b78f185077e2d3dcfaa0a6e62fbdfbf00c97c9b33b699dc631476181d.json new file mode 100644 index 0000000..4b94231 --- /dev/null +++ b/.sqlx/query-af883f8b78f185077e2d3dcfaa0a6e62fbdfbf00c97c9b33b699dc631476181d.json @@ -0,0 +1,56 @@ +{ + "db_name": "SQLite", + "query": "SELECT id, movie_id, user_id, rating, comment, watched_at, created_at\n FROM reviews WHERE movie_id = ? ORDER BY watched_at ASC", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "movie_id", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "user_id", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "rating", + "ordinal": 3, + "type_info": "Integer" + }, + { + "name": "comment", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "watched_at", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "created_at", + "ordinal": 6, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false, + false, + true, + false, + false + ] + }, + "hash": "af883f8b78f185077e2d3dcfaa0a6e62fbdfbf00c97c9b33b699dc631476181d" +} diff --git a/.sqlx/query-affe1eb261283c09d4b1ce6e684681755f079a044ffec8ff2bd79cfd8efe16b8.json b/.sqlx/query-affe1eb261283c09d4b1ce6e684681755f079a044ffec8ff2bd79cfd8efe16b8.json new file mode 100644 index 0000000..65a123c --- /dev/null +++ b/.sqlx/query-affe1eb261283c09d4b1ce6e684681755f079a044ffec8ff2bd79cfd8efe16b8.json @@ -0,0 +1,92 @@ +{ + "db_name": "SQLite", + "query": "SELECT m.id, m.external_metadata_id, m.title, m.release_year, m.director, m.poster_path,\n r.id AS review_id, r.movie_id, r.user_id, r.rating, r.comment, r.watched_at, r.created_at\n FROM reviews r\n INNER JOIN movies m ON m.id = r.movie_id\n ORDER BY r.watched_at ASC\n LIMIT ? OFFSET ?", + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "external_metadata_id", + "ordinal": 1, + "type_info": "Text" + }, + { + "name": "title", + "ordinal": 2, + "type_info": "Text" + }, + { + "name": "release_year", + "ordinal": 3, + "type_info": "Integer" + }, + { + "name": "director", + "ordinal": 4, + "type_info": "Text" + }, + { + "name": "poster_path", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "review_id", + "ordinal": 6, + "type_info": "Text" + }, + { + "name": "movie_id", + "ordinal": 7, + "type_info": "Text" + }, + { + "name": "user_id", + "ordinal": 8, + "type_info": "Text" + }, + { + "name": "rating", + "ordinal": 9, + "type_info": "Integer" + }, + { + "name": "comment", + "ordinal": 10, + "type_info": "Text" + }, + { + "name": "watched_at", + "ordinal": 11, + "type_info": "Text" + }, + { + "name": "created_at", + "ordinal": 12, + "type_info": "Text" + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + false, + true, + false, + false, + true, + true, + false, + false, + false, + false, + true, + false, + false + ] + }, + "hash": "affe1eb261283c09d4b1ce6e684681755f079a044ffec8ff2bd79cfd8efe16b8" +} diff --git a/.sqlx/query-e431381ad41c1c2f7b9c89509d5e3f4c19cb52dcfff66772145cd80c53c16883.json b/.sqlx/query-e431381ad41c1c2f7b9c89509d5e3f4c19cb52dcfff66772145cd80c53c16883.json new file mode 100644 index 0000000..c2562bf --- /dev/null +++ b/.sqlx/query-e431381ad41c1c2f7b9c89509d5e3f4c19cb52dcfff66772145cd80c53c16883.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "DELETE FROM movies WHERE id = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "e431381ad41c1c2f7b9c89509d5e3f4c19cb52dcfff66772145cd80c53c16883" +} diff --git a/.sqlx/query-f84e5483ca4210aec67b38cc1a9de4a42c12891025236abc48ea4f175292a6cc.json b/.sqlx/query-f84e5483ca4210aec67b38cc1a9de4a42c12891025236abc48ea4f175292a6cc.json new file mode 100644 index 0000000..616cb43 --- /dev/null +++ b/.sqlx/query-f84e5483ca4210aec67b38cc1a9de4a42c12891025236abc48ea4f175292a6cc.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "DELETE FROM reviews WHERE id = ?", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "f84e5483ca4210aec67b38cc1a9de4a42c12891025236abc48ea4f175292a6cc" +} diff --git a/crates/adapters/sqlite/src/lib.rs b/crates/adapters/sqlite/src/lib.rs index c0d3100..5a67a6d 100644 --- a/crates/adapters/sqlite/src/lib.rs +++ b/crates/adapters/sqlite/src/lib.rs @@ -7,7 +7,7 @@ use domain::{ collections::Paginated, }, ports::MovieRepository, - value_objects::{ExternalMetadataId, MovieId, MovieTitle, ReleaseYear}, + value_objects::{ExternalMetadataId, MovieId, MovieTitle, ReleaseYear, ReviewId}, }; use sqlx::SqlitePool; @@ -273,6 +273,39 @@ impl MovieRepository for SqliteMovieRepository { }) } + async fn get_review_by_id(&self, review_id: &ReviewId) -> Result, DomainError> { + let id = review_id.value().to_string(); + sqlx::query_as!( + ReviewRow, + "SELECT id, movie_id, user_id, rating, comment, watched_at, created_at + FROM reviews WHERE id = ?", + id + ) + .fetch_optional(&self.pool) + .await + .map_err(Self::map_err)? + .map(ReviewRow::to_domain) + .transpose() + } + + async fn delete_review(&self, review_id: &ReviewId) -> Result<(), DomainError> { + let id = review_id.value().to_string(); + sqlx::query!("DELETE FROM reviews WHERE id = ?", id) + .execute(&self.pool) + .await + .map_err(Self::map_err)?; + Ok(()) + } + + async fn delete_movie(&self, movie_id: &MovieId) -> Result<(), DomainError> { + let id = movie_id.value().to_string(); + sqlx::query!("DELETE FROM movies WHERE id = ?", id) + .execute(&self.pool) + .await + .map_err(Self::map_err)?; + Ok(()) + } + async fn get_review_history(&self, movie_id: &MovieId) -> Result { let id_str = movie_id.value().to_string();