diff --git a/backend/endpoints.py b/backend/endpoints.py index 0e177a0..c55954f 100644 --- a/backend/endpoints.py +++ b/backend/endpoints.py @@ -167,6 +167,21 @@ def send_bloom(): ) +@jwt_required() +def rebloom(bloom_id): + current_user = get_current_user() + original_bloom = blooms.get_bloom(int(bloom_id)) + + if original_bloom is None: + return make_response(jsonify({"success": False, "message": "Bloom not found"}), 404) + + blooms.add_bloom(bloom_id, current_user.username) + rebloom_count = len(original_bloom.get("reblooms", [])) + + return jsonify({"success": True, "rebloom_count": rebloom_count}) + + + def get_bloom(id_str): try: id_int = int(id_str) diff --git a/backend/main.py b/backend/main.py index 7ba155f..e5cc547 100644 --- a/backend/main.py +++ b/backend/main.py @@ -12,6 +12,7 @@ register, self_profile, send_bloom, + rebloom, suggested_follows, user_blooms, ) @@ -57,6 +58,7 @@ def main(): app.add_url_rule("/suggested-follows/", view_func=suggested_follows) app.add_url_rule("/bloom", methods=["POST"], view_func=send_bloom) + app.add_url_rule("/blooms//rebloom", methods=["POST"], view_func=rebloom) app.add_url_rule("/bloom/", methods=["GET"], view_func=get_bloom) app.add_url_rule("/blooms/", view_func=user_blooms) app.add_url_rule("/hashtag/", view_func=hashtag) diff --git a/front-end/index.html b/front-end/index.html index 89d6b13..29e3fee 100644 --- a/front-end/index.html +++ b/front-end/index.html @@ -237,6 +237,10 @@

Share a Bloom

Username +
diff --git a/front-end/lib/api.mjs b/front-end/lib/api.mjs index f4b5339..9487561 100644 --- a/front-end/lib/api.mjs +++ b/front-end/lib/api.mjs @@ -212,6 +212,16 @@ async function postBloom(content) { } } +async function rebloom(bloomId) { + try { + const data = await __apiRequest(`/blooms/${bloomId}/rebloom`, { method: "POST",}); + + return data; + } catch (error) { + return { success: false }; + } +} + // ======= USER methods async function getProfile(username) { const endpoint = username ? `/profile/${username}` : "/profile"; @@ -292,6 +302,7 @@ const apiService = { getBlooms, postBloom, getBloomsByHashtag, + rebloom, // User methods getProfile, diff --git a/front-end/views/home.mjs b/front-end/views/home.mjs index 85a5cca..0258207 100644 --- a/front-end/views/home.mjs +++ b/front-end/views/home.mjs @@ -1,4 +1,5 @@ import {renderEach, renderOne, destroy} from "../lib/render.mjs"; +import { apiService } from "../lib/api.mjs"; import { state, getLogoutContainer, @@ -38,6 +39,25 @@ function homeView() { "bloom-template", createBloom ); + + document.querySelectorAll("[data-action='rebloom']").forEach((button) => { + button.addEventListener("click", async () => { + const bloomArticle = button.closest("[data-bloom]"); + const bloomId = bloomArticle.getAttribute("data-bloom-id"); + + try { + const data = await apiService.rebloom(bloomId); + const counter = button.querySelector("[data-rebloom-count]"); + let count = parseInt(counter.textContent) || 0; + counter.textContent = data.rebloom_count ?? count + 1; + } catch (error) { + console.error("Unable to rebloom:", error); + } + + }); + + }); + renderOne( state.isLoggedIn, getBloomFormContainer(),