diff --git a/.vscode/settings.json b/.vscode/settings.json index 166be538..cf921ab4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,5 @@ { "liveServer.settings.root": "front-end/", - "python.defaultInterpreterPath": "backend/.venv/bin/python" + "python.defaultInterpreterPath": "backend/.venv/bin/python", + "liveServer.settings.port": 5500 } diff --git a/backend/data/blooms.py b/backend/data/blooms.py index 7e280cf3..bb7d219a 100644 --- a/backend/data/blooms.py +++ b/backend/data/blooms.py @@ -11,21 +11,23 @@ class Bloom: id: int sender: User + original_sender: str content: str sent_timestamp: datetime.datetime -def add_bloom(*, sender: User, content: str) -> Bloom: +def add_bloom(*, sender: User, original_sender: str, content: str) -> Bloom: hashtags = [word[1:] for word in content.split(" ") if word.startswith("#")] now = datetime.datetime.now(tz=datetime.UTC) bloom_id = int(now.timestamp() * 1000000) with db_cursor() as cur: cur.execute( - "INSERT INTO blooms (id, sender_id, content, send_timestamp) VALUES (%(bloom_id)s, %(sender_id)s, %(content)s, %(timestamp)s)", + "INSERT INTO blooms (id, sender_id, original_sender, content, send_timestamp) VALUES (%(bloom_id)s, %(sender_id)s, %(original_sender)s, %(content)s, %(timestamp)s)", dict( bloom_id=bloom_id, sender_id=sender.id, + original_sender=original_sender, content=content, timestamp=datetime.datetime.now(datetime.UTC), ), @@ -54,7 +56,7 @@ def get_blooms_for_user( cur.execute( f"""SELECT - blooms.id, users.username, content, send_timestamp + blooms.id, users.username, original_sender, content, send_timestamp FROM blooms INNER JOIN users ON users.id = blooms.sender_id WHERE @@ -68,11 +70,12 @@ def get_blooms_for_user( rows = cur.fetchall() blooms = [] for row in rows: - bloom_id, sender_username, content, timestamp = row + bloom_id, sender_username, original_sender, content, timestamp = row blooms.append( Bloom( id=bloom_id, sender=sender_username, + original_sender=original_sender, content=content, sent_timestamp=timestamp, ) @@ -83,16 +86,17 @@ def get_blooms_for_user( def get_bloom(bloom_id: int) -> Optional[Bloom]: with db_cursor() as cur: cur.execute( - "SELECT blooms.id, users.username, content, send_timestamp FROM blooms INNER JOIN users ON users.id = blooms.sender_id WHERE blooms.id = %s", + "SELECT blooms.id, users.username, original_sender, content, send_timestamp FROM blooms INNER JOIN users ON users.id = blooms.sender_id WHERE blooms.id = %s", (bloom_id,), ) row = cur.fetchone() if row is None: return None - bloom_id, sender_username, content, timestamp = row + bloom_id, sender_username, original_sender, content, timestamp = row return Bloom( id=bloom_id, sender=sender_username, + original_sender=original_sender, content=content, sent_timestamp=timestamp, ) @@ -108,7 +112,7 @@ def get_blooms_with_hashtag( with db_cursor() as cur: cur.execute( f"""SELECT - blooms.id, users.username, content, send_timestamp + blooms.id, users.username, original_sender, content, send_timestamp FROM blooms INNER JOIN hashtags ON blooms.id = hashtags.bloom_id INNER JOIN users ON blooms.sender_id = users.id WHERE @@ -121,11 +125,12 @@ def get_blooms_with_hashtag( rows = cur.fetchall() blooms = [] for row in rows: - bloom_id, sender_username, content, timestamp = row + bloom_id, sender_username, original_sender, content, timestamp = row blooms.append( Bloom( id=bloom_id, sender=sender_username, + original_sender=original_sender, content=content, sent_timestamp=timestamp, ) diff --git a/backend/endpoints.py b/backend/endpoints.py index 0e177a07..f87c52d0 100644 --- a/backend/endpoints.py +++ b/backend/endpoints.py @@ -157,8 +157,11 @@ def send_bloom(): return type_check_error user = get_current_user() + original_sender = None + if request.json.get("original_sender"): + original_sender = request.json["original_sender"] - blooms.add_bloom(sender=user, content=request.json["content"]) + blooms.add_bloom(sender=user, original_sender=original_sender, content=request.json["content"]) return jsonify( { diff --git a/db/schema.sql b/db/schema.sql index 61e7580c..e63052e1 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -9,6 +9,7 @@ CREATE TABLE users ( CREATE TABLE blooms ( id BIGSERIAL NOT NULL PRIMARY KEY, sender_id INT NOT NULL REFERENCES users(id), + original_sender TEXT DEFAULT NULL, content TEXT NOT NULL, send_timestamp TIMESTAMP NOT NULL ); diff --git a/front-end/components/bloom.mjs b/front-end/components/bloom.mjs index 0b4166c3..365a6219 100644 --- a/front-end/components/bloom.mjs +++ b/front-end/components/bloom.mjs @@ -6,10 +6,13 @@ * btw a bloom object is composed thus * {"id": Number, * "sender": username, + * "original_sender": "original username", -- or null if this bloom is not reposted * "content": "string from textarea", * "sent_timestamp": "datetime as ISO 8601 formatted string"} */ +import { apiService, state } from "../index.mjs"; + const createBloom = (template, bloom) => { if (!bloom) return; const bloomFrag = document.getElementById(template).content.cloneNode(true); @@ -17,13 +20,29 @@ const createBloom = (template, bloom) => { const bloomArticle = bloomFrag.querySelector("[data-bloom]"); const bloomUsername = bloomFrag.querySelector("[data-username]"); + const bloomOriginalUsername = bloomFrag.querySelector("[data-original-username]"); const bloomTime = bloomFrag.querySelector("[data-time]"); const bloomTimeLink = bloomFrag.querySelector("a:has(> [data-time])"); const bloomContent = bloomFrag.querySelector("[data-content]"); - + const reBloomButton = bloomFrag.querySelector("[data-rebloom]"); + const currentUser = state["currentUser"]; + if (currentUser !== bloom.sender){ + reBloomButton.addEventListener("click", async () =>{ + const response = await apiService.reBloom(bloom.id); + }); + } else { + //this part prevents user from reblooming his own posts + reBloomButton.remove(); + } + bloomArticle.setAttribute("data-bloom-id", bloom.id); bloomUsername.setAttribute("href", `/profile/${bloom.sender}`); bloomUsername.textContent = bloom.sender; + if (bloom.original_sender){ + bloomUsername.textContent = "Rebllomed by: " + bloom.sender; + bloomOriginalUsername.setAttribute("href", `/profile/${bloom.original_sender}`); + bloomOriginalUsername.textContent = "Originaly bloomed by: " + bloom.original_sender; + } bloomTime.textContent = _formatTimestamp(bloom.sent_timestamp); bloomTimeLink.setAttribute("href", `/bloom/${bloom.id}`); bloomContent.replaceChildren( diff --git a/front-end/index.css b/front-end/index.css index 65c7fb4c..fc59ccd7 100644 --- a/front-end/index.css +++ b/front-end/index.css @@ -267,3 +267,8 @@ dialog { [hidden] { display: none !important; } + +.rebloom { + width: 200px; + margin: 5px auto; +} diff --git a/front-end/index.html b/front-end/index.html index 89d6b130..66fc60e8 100644 --- a/front-end/index.html +++ b/front-end/index.html @@ -236,10 +236,12 @@