diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..44b4224b --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* eol=lf \ No newline at end of file diff --git a/src/db_utils.php b/src/db_utils.php new file mode 100644 index 00000000..3511a8cd --- /dev/null +++ b/src/db_utils.php @@ -0,0 +1,66 @@ +prefix . "user_bookmarks"; + + $collation = $wpdb->get_charset_collate(); + + $sql = "CREATE TABLE $table ( + id BIGINT(20) NOT NULL AUTO_INCREMENT, + user_id BIGINT(20) NOT NULL, + post_id BIGINT(20) NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY user_bookmark (user_id, post_id) + ) $collation;"; + + dbDelta($sql); + } + + + + public static function addBookmark($user_id, $post_id) { + global $wpdb; + + $table = $wpdb->prefix . "user_bookmarks"; + + $wpdb->replace($table, ["user_id" => $user_id, "post_id" => $post_id]); + } + + + + public static function removeBookmark($user_id, $post_id) { + global $wpdb; + + $table = $wpdb->prefix . "user_bookmarks"; + + $wpdb->delete($table, ["user_id" => $user_id, "post_id" => $post_id]); + } + + + + public static function isBookmarked($user_id, $post_id) { + global $wpdb; + + $table = $wpdb->prefix . "user_bookmarks"; + + return ($wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $table WHERE user_id = %d AND post_id = %d", $user_id, $post_id)) > 0); + } + + + + public static function getBookmarks($user_id) { + global $wpdb; + + $table = $wpdb->prefix . "user_bookmarks"; + + return $wpdb->get_results($wpdb->prepare("SELECT post_id FROM $table WHERE user_id = %d", $user_id)); + } +} \ No newline at end of file diff --git a/src/hook_callbacks.php b/src/hook_callbacks.php new file mode 100644 index 00000000..5689cf7b --- /dev/null +++ b/src/hook_callbacks.php @@ -0,0 +1,9 @@ +has_param("id")) { + wp_send_json_error([ "error" => "Missing post id" ], 400); + return; + } + + $id = $request->get_param("id"); + $user_id = get_current_user_id(); + + if (!get_post($id)) { + wp_send_json_error([ "error" => "Post not found" ], 404); + return; + } + + Database::addBookmark($user_id, $id); + + wp_send_json_success(); +} + + + +function wpfav_remove_bookmark($request) { + if (!$request->has_param("id")) { + wp_send_json_error([ "error" => "Missing post id" ], 400); + return; + } + + $id = $request->get_param("id"); + $user_id = get_current_user_id(); + + if (!get_post($id)) { + wp_send_json_error([ "error" => "Post not found" ], 404); + return; + } + + Database::removeBookmark($user_id, $id); + + wp_send_json_success(); +} + + + +function wpfav_is_bookmarked($request) { + if (!$request->has_param("id")) { + wp_send_json_error([ "error" => "Missing post id" ], 400); + return; + } + + $id = $request->get_param("id"); + $user_id = get_current_user_id(); + + if (!get_post($id)) { + wp_send_json_error([ "error" => "Post not found" ], 404); + return; + } + + $is_bookmarked = Database::isBookmarked($user_id, $id); + + wp_send_json_success([ "is_bookmarked" => $is_bookmarked ]); +} + + + +function wpfav_get_bookmarks($request) { + $user_id = get_current_user_id(); + + $bookmarks = Database::getBookmarks($user_id); + + wp_send_json_success([ "bookmarks" => $bookmarks ]); +} \ No newline at end of file diff --git a/wp-fav-posts.php b/wp-fav-posts.php new file mode 100644 index 00000000..e14b02d9 --- /dev/null +++ b/wp-fav-posts.php @@ -0,0 +1,56 @@ +\d+)", [ + "methods" => "POST", + "callback" => "wpfav_add_bookmark", + "permission_callback" => "wpfav_is_authed" + ]); + register_rest_route("wpfav/v1", "/remove-bookmark/(?P\d+)", [ + "methods" => "POST", + "callback" => "wpfav_remove_bookmark", + "permission_callback" => "wpfav_is_authed" + ]); + register_rest_route("wpfav/v1", "/is-bookmarked/(?P\d+)", [ + "methods" => "GET", + "callback" => "wpfav_is_bookmarked", + "permission_callback" => "wpfav_is_authed" + ]); + register_rest_route("wpfav/v1", "/get-bookmarks", [ + "methods" => "GET", + "callback" => "wpfav_get_bookmarks", + "permission_callback" => "wpfav_is_authed" + ]); + } +} + + + +new WPFavPosts(); +