diff --git a/careconnect2025/backend/core/src/main/java/com/careconnect/controller/FeedController.java b/careconnect2025/backend/core/src/main/java/com/careconnect/controller/FeedController.java index 283a8226..ae9b7745 100644 --- a/careconnect2025/backend/core/src/main/java/com/careconnect/controller/FeedController.java +++ b/careconnect2025/backend/core/src/main/java/com/careconnect/controller/FeedController.java @@ -1,5 +1,8 @@ package com.careconnect.controller; import com.careconnect.dto.PostWithCommentCountDto; +import com.careconnect.repository.CaregiverRepository; +import com.careconnect.repository.PatientRepository; +import com.careconnect.security.Role; import org.springframework.beans.factory.annotation.Value; import com.careconnect.model.Post; import com.careconnect.service.FeedService; @@ -35,8 +38,6 @@ @SecurityRequirement(name = "JWT Authentication") public class FeedController { - @Value("${careconnect.upload.dir}") - private String uploadDir; @Autowired private FeedService feedService; @@ -44,6 +45,12 @@ public class FeedController { @Autowired private UserRepository userRepository; + @Autowired + private PatientRepository patientRepository; + + @Autowired + private CaregiverRepository caregiverRepository; + @GetMapping("/all") @Operation( summary = "Get global feed", @@ -111,13 +118,9 @@ public ResponseEntity getFriendsFeed() { return ResponseEntity.ok(posts); } - @PostMapping(value = "/create", consumes = "multipart/form-data") - public ResponseEntity createPost( - @RequestParam("userId") Long userId, - @RequestParam("content") String content, - @RequestPart(value = "image", required = false) MultipartFile imageFile - ) { - + @PostMapping(value = "/create", consumes = "application/json") + public ResponseEntity createPost(@RequestBody Post postData) { + // Get user from JWT token (email is the subject) Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String email = authentication.getName(); @@ -125,62 +128,42 @@ public ResponseEntity createPost( if (user == null) { return ResponseEntity.status(HttpStatus.FORBIDDEN).body("User not found"); } - + // Verify the post belongs to the authenticated user - if (!user.getId().equals(userId)) { + if (!user.getId().equals(postData.getUserId())) { return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Cannot create post as another user"); } - try { - String imageUrl = null; - - // Ensure the upload directory exists - File uploadFolder = new File(uploadDir); - if (!uploadFolder.exists()) { - boolean created = uploadFolder.mkdirs(); - if (!created) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Failed to create upload directory"); - } - } - - // Handle image upload if present - if (imageFile != null && !imageFile.isEmpty()) { - String extension = ""; - String originalName = imageFile.getOriginalFilename(); - int dotIndex = (originalName != null) ? originalName.lastIndexOf('.') : -1; - if (dotIndex > 0) { - extension = originalName.substring(dotIndex); - } - String filename = UUID.randomUUID() + extension; - File destination = new File(uploadFolder, filename); - imageFile.transferTo(destination); - imageUrl = "/uploads/" + filename; // URL for client - } - - Post post = feedService.createPost(userId, content, imageUrl); - - String username = user.getName() != null && !user.getName().isEmpty() ? user.getName() : user.getEmail(); - int commentCount = 0; // New post, so always 0 + Post savedPost = feedService.createPost(user.getId(), postData.getContent(), null); PostWithCommentCountDto dto = new PostWithCommentCountDto( - post.getId(), - post.getUserId(), - post.getContent(), - post.getImageUrl(), - post.getCreatedAt(), - commentCount, - username + savedPost.getId(), + savedPost.getUserId(), + savedPost.getContent(), + null, + savedPost.getCreatedAt(), + 0, + resolveDisplayName(user) ); return ResponseEntity.status(HttpStatus.CREATED).body(dto); - } catch (IOException e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Error saving image: " + e.getMessage()); } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Error creating post: " + e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error creating post: " + e.getMessage()); + } + } + + private String resolveDisplayName(User user) { + if (user.getRole() == Role.PATIENT) { + return patientRepository.findByUserId(user.getId()) + .map(p -> p.getFirstName() + " " + p.getLastName()) + .orElse(user.getEmail()); + } else if (user.getRole() == Role.CAREGIVER) { + return caregiverRepository.findByUserId(user.getId()) + .map(c -> c.getFirstName() + " " + c.getLastName()) + .orElse(user.getEmail()); + } else { + return user.getEmail(); } } } diff --git a/careconnect2025/backend/core/src/main/java/com/careconnect/repository/CaregiverRepository.java b/careconnect2025/backend/core/src/main/java/com/careconnect/repository/CaregiverRepository.java index c2b80f8d..1bce1706 100644 --- a/careconnect2025/backend/core/src/main/java/com/careconnect/repository/CaregiverRepository.java +++ b/careconnect2025/backend/core/src/main/java/com/careconnect/repository/CaregiverRepository.java @@ -8,6 +8,7 @@ public interface CaregiverRepository extends JpaRepository { Optional findByUser(User user); + Optional findByUserId(Long userId); boolean existsByIdAndUserId(Long caregiverId, Long userId); } \ No newline at end of file diff --git a/careconnect2025/frontend/lib/features/social/presentation/pages/new_post_screen.dart b/careconnect2025/frontend/lib/features/social/presentation/pages/new_post_screen.dart index a95790ca..bad1ee13 100644 --- a/careconnect2025/frontend/lib/features/social/presentation/pages/new_post_screen.dart +++ b/careconnect2025/frontend/lib/features/social/presentation/pages/new_post_screen.dart @@ -47,20 +47,15 @@ class _NewPostScreenState extends State { final uri = Uri.parse('${getBackendBaseUrl()}/v1/api/feed/create'); final headers = await ApiService.getAuthHeaders(); - final request = http.MultipartRequest('POST', uri) - ..headers.addAll(headers) - ..fields['userId'] = userId.toString() - ..fields['content'] = content; - - if (_selectedImage != null) { - request.files.add(await http.MultipartFile.fromPath( - 'image', - _selectedImage!.path, - )); - } + headers['Content-Type'] = 'application/json'; + + final body = jsonEncode({ + 'userId': userId, + 'content': content, + }); + - final streamedResponse = await request.send(); - final response = await http.Response.fromStream(streamedResponse); + final response = await http.post(uri, headers: headers, body: body); print('Create post status: ${response.statusCode}'); print('Create post body: ${response.body}');