diff --git a/backend/endpoints.py b/backend/endpoints.py index 0e177a0..1657625 100644 --- a/backend/endpoints.py +++ b/backend/endpoints.py @@ -157,8 +157,20 @@ def send_bloom(): return type_check_error user = get_current_user() + #Extract content safely + content = request.json.get("content", "") + # Limit content length + MAX_BLOOM_LENGTH = 280 + if len(content) > MAX_BLOOM_LENGTH: + return make_response( + { + "success": False, + "message": f"Bloom cannot exceed {MAX_BLOOM_LENGTH} characters", + }, + 400, + ) - blooms.add_bloom(sender=user, content=request.json["content"]) + blooms.add_bloom(sender=user, content=content) return jsonify( { diff --git a/backend/populate.py b/backend/populate.py index 414218b..8ca3293 100644 --- a/backend/populate.py +++ b/backend/populate.py @@ -64,8 +64,7 @@ def main(): writer_access_token = create_user("AS", "neverSt0pTalking") send_bloom( writer_access_token, - "In this essay I will convince you that my views are correct in ways you have never imagined. If it doesn't change your life, read it again. Marshmallows are magnificent. They have great squish, tasty good, and you can even toast them over a fire. Toast them just right until they have a tiny bit of crunch when you bite into them, and have just started melting in the middle.", - ) + "In this essay I will convince you that my views are correct in ways you have never imagined. Marshmallows are magnificent!" ) justsomeguy_access_token = create_user("JustSomeGuy", "mysterious") send_bloom(justsomeguy_access_token, "Hello.") diff --git a/backend/requirements.txt b/backend/requirements.txt index e03836c..5e11b05 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -11,7 +11,7 @@ idna==3.10 itsdangerous==2.2.0 Jinja2==3.1.5 MarkupSafe==3.0.2 -psycopg2==2.9.10 +psycopg2-binary==2.9.10 pycparser==2.22 PyJWT==2.10.1 python-dotenv==1.0.1 diff --git a/front-end/components/bloom.mjs b/front-end/components/bloom.mjs index 0b4166c..8a75cc3 100644 --- a/front-end/components/bloom.mjs +++ b/front-end/components/bloom.mjs @@ -37,7 +37,7 @@ const createBloom = (template, bloom) => { function _formatHashtags(text) { if (!text) return text; return text.replace( - /\B#[^#]+/g, + /(^|\s)(#[\w]+)/g, (match) => `${match}` ); } diff --git a/front-end/views/hashtag.mjs b/front-end/views/hashtag.mjs index 7b7e996..3e51bad 100644 --- a/front-end/views/hashtag.mjs +++ b/front-end/views/hashtag.mjs @@ -15,6 +15,13 @@ import {createHeading} from "../components/heading.mjs"; // Hashtag view: show all tweets containing this tag function hashtagView(hashtag) { + //only fetch data from the server and avoid the flashing on slow network + if (state.currentHashtag !== hashtag) { + state.currentHashtag = hashtag; + state.hashtagBlooms = []; + apiService.getBloomsByHashtag(hashtag); + } + //this one if statement fixes the flashing behavior by checking if the hashtag selected is already running or not destroy(); apiService.getBloomsByHashtag(hashtag); diff --git a/front-end/views/profile.mjs b/front-end/views/profile.mjs index dd2b92a..31139a9 100644 --- a/front-end/views/profile.mjs +++ b/front-end/views/profile.mjs @@ -39,8 +39,8 @@ function profileView(username) { createLogin ); document - .querySelector("[data-action='login']") - ?.addEventListener("click", handleLogin); + .querySelector("[data-form='login']") + ?.addEventListener("submit", handleLogin); const profileData = state.profiles.find((p) => p.username === username); if (profileData) {