diff --git a/src/main/java/polish_community_group_11/polish_community/feed/controllers/FeedApisController.java b/src/main/java/polish_community_group_11/polish_community/feed/controllers/FeedApisController.java index daecfe86b571e66ac747e8763191747829123f52..1005fac412d47839512588dbf82a5b9093395d84 100644 --- a/src/main/java/polish_community_group_11/polish_community/feed/controllers/FeedApisController.java +++ b/src/main/java/polish_community_group_11/polish_community/feed/controllers/FeedApisController.java @@ -93,7 +93,7 @@ public class FeedApisController { } } // updating the post - @PutMapping("/{postId}") + @PatchMapping("/{postId}") public ResponseEntity<Void> updatePost(@PathVariable int postId, @RequestBody FeedImpl feed) { try { feedRepository.updatePost(postId, feed); diff --git a/src/main/java/polish_community_group_11/polish_community/feed/repository/FeedRepositoryImpl.java b/src/main/java/polish_community_group_11/polish_community/feed/repository/FeedRepositoryImpl.java index bb2037c7307c00dfab996624863794fe3253e25c..2686d3efd33bed04027571c19aff85a53ccebab0 100644 --- a/src/main/java/polish_community_group_11/polish_community/feed/repository/FeedRepositoryImpl.java +++ b/src/main/java/polish_community_group_11/polish_community/feed/repository/FeedRepositoryImpl.java @@ -77,20 +77,19 @@ public class FeedRepositoryImpl implements FeedRepository { // update a post that is editing @Override public void updatePost(int postId, FeedImpl feed) { - String sql = "UPDATE feed SET post_image_url = ?, post_title = ?, post_description = ?, " + - "post_author = ?, post_time = ?, author_title = ? WHERE post_id = ?"; + String sql = "UPDATE feed SET post_title = ?, post_description = ? WHERE post_id = ?"; jdbcTemplate.update(sql, - feed.getPostImageUrl(), feed.getPostTitle(), feed.getPostDescription(), - java.sql.Date.valueOf(feed.getPostTime()), postId ); // update the tags jdbcTemplate.update("DELETE FROM feed_tags WHERE post_id = ?", postId); - insertTagsForPost(postId, feed.getTags()); + if (feed.getTags() != null && !feed.getTags().isEmpty()) { + insertTagsForPost(postId, feed.getTags()); + } } // deleting a post diff --git a/src/main/resources/static/js/feed/feed.js b/src/main/resources/static/js/feed/feed.js index 2de2bed6a9aca5402445e899b0efa8b5e14806e1..75330a347b2d75b892ddad050b2a75853a0ee8a0 100644 --- a/src/main/resources/static/js/feed/feed.js +++ b/src/main/resources/static/js/feed/feed.js @@ -1,25 +1,35 @@ const API_BASE_URL = '/api/feed'; - const postFeed = document.getElementById('postFeed'); const postTemplate = document.getElementById('post-template'); const addNewPost = document.getElementById('add-post'); const closeModalBtn = document.getElementById('closeModalBtn'); const modal = document.getElementById('create-new-modal'); +const postForm = document.getElementById('post-form'); - -addNewPost.addEventListener('click', () => { - modal.style.display = 'flex' -}) - -closeModalBtn.addEventListener('click', () => { - modal.style.display = 'none' + - '' -}) +let isEditing = false; +let editPostId = null; // maintaining state let posts = []; +// had issues with form so func to reset it +function resetForm() { + postForm.reset(); + isEditing = false; + editPostId = null; +} + +addNewPost.addEventListener('click', () => { + resetForm(); + modal.style.display = 'flex'; +}); + +closeModalBtn.addEventListener('click', () => { + modal.style.display = 'none'; + resetForm(); +}); + // getting all posts using api async function fetchPosts() { try { @@ -32,8 +42,6 @@ async function fetchPosts() { } } - - // render all posts after getting them function renderPosts() { postFeed.innerHTML = ''; // clear any posts @@ -141,14 +149,11 @@ async function handleLike(postId, likeCountElement) { } } -//* ************************* Submitting the form *********************** *// -const postForm = document.getElementById('post-form'); - - -postForm.addEventListener('submit', (event) => { +// handling form submission whether update or post +postForm.addEventListener('submit', async (event) => { event.preventDefault(); - // getting form data, + // getting form data const postTitle = document.getElementById('postTitle').value; const postDescription = document.getElementById('postDescription').value; const postTagsInput = document.getElementById('postTags').value; @@ -157,44 +162,82 @@ postForm.addEventListener('submit', (event) => { const tags = postTagsInput .split(',') .map(tag => tag.trim()) - .filter(tag => tag.length > 0); // removing empty tags + .filter(tag => tag.length > 0); const data = { postTitle, postDescription, - tags // sending as array + tags }; - console.log('Submitting post:', data); - - // Send post request - fetch(`${API_BASE_URL}/add`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - credentials: 'include', - body: JSON.stringify(data) - }) - .then(response => { - if (!response.ok) { - throw new Error('Network response was not ok'); - } - return response.text(); - }) - .then(result => { - alert('Post added successfully'); - modal.style.display = 'none'; - fetchPosts(); - }) - .catch(error => { - console.error('Error adding post:', error); - alert('Error adding post. Please try again.'); + try { + let url = `${API_BASE_URL}/add`; + let method = 'POST'; + + // if it is edit change endpoint + if (isEditing && editPostId) { + url = `${API_BASE_URL}/${editPostId}`; + method = 'PATCH'; + } + + const response = await fetch(url, { + method: method, + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + body: JSON.stringify(data) }); + + if (!response.ok) { + throw new Error('Network response was not ok'); + } + + alert(isEditing ? 'Post updated successfully' : 'Post added successfully'); + modal.style.display = 'none'; + resetForm(); + fetchPosts(); + } catch (error) { + console.error('Error:', error); + alert(isEditing ? 'Error updating post' : 'Error adding post'); + } +}); + +// onclick handling for edit +document.addEventListener('click', async (event) => { + const editButton = event.target.closest('.edit-post'); + if (!editButton) return; + + const postDiv = editButton.closest('.post'); + const postId = postDiv.dataset.postId; + + try { + const response = await fetch(`${API_BASE_URL}/${postId}`); + if (!response.ok) throw new Error('Failed to fetch post data'); + + const postData = await response.json(); + + // set edit state ti true + isEditing = true; + editPostId = postId; + + + document.getElementById('postTitle').value = postData.postTitle; + document.getElementById('postDescription').value = postData.postDescription; + document.getElementById('postTags').value = postData.tags.join(', '); + + + modal.style.display = 'flex'; + } catch (error) { + console.error('Error fetching post data:', error); + alert('Error fetching post data. Please try again.'); + } }); + +// initialize on page load posts on page load document.addEventListener('DOMContentLoaded', () => { fetchPosts(); }); -// refresh posts each minute , though cannot show at moment since not online +// refresh posts periodically // setInterval(fetchPosts, 60000); \ No newline at end of file