Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
e639804
Bug Fix, Leaderboard Opt In, Daily Motivational Message
Jul 26, 2025
67419a8
Update gamification_screen.dart
dtruong5 Jul 26, 2025
0785231
Update friend_requests_screen.dart
dtruong5 Jul 26, 2025
aa2afc3
Update search_user_screen.dart
dtruong5 Jul 26, 2025
80e0b4a
update user to fix my branch after merge
Jul 28, 2025
1fa8161
Updated User.java to match care-connect-develop-ag2 branch
Jul 28, 2025
ce809d7
brought the changes from care-connect-develop to ag2 (gamification + …
Jul 28, 2025
9edb9d9
Update application.properties from local setup back to original
dtruong5 Jul 28, 2025
b6c04b3
Safely update login streak and last login date with null checks
Jul 28, 2025
9acbb95
Merge: resolve application.properties conflict with default ddl-auto …
Jul 28, 2025
c5805a0
Add login streak tracking and leaderboard opt-in logic to User model…
Jul 28, 2025
df23513
conflict for api_service resolved
Jul 28, 2025
c8040a6
clean up User entity with required fields
Jul 28, 2025
f0e1af1
removed Billing module
Jul 28, 2025
cf75aac
Merge branch 'care-connect-develop-ag2' into feature/gamification-soc…
Jul 30, 2025
2968188
Update: FeedController, LeaderboardEntry
Aug 1, 2025
763c152
Merge branch 'care-connect-develop-ag2' into feature/gamification-soc…
Aug 1, 2025
e737e0e
Messaging & FeedController integration updates
Aug 2, 2025
7c9c3a6
Resolved merge conflict in FeedController.java
Aug 2, 2025
ae62f97
Removed image upload logic from FeedController#createPost
Aug 2, 2025
2ef4c1d
Merge remote-tracking branch 'origin/care-connect-develop-agAug1-fixe…
Aug 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -35,15 +38,19 @@
@SecurityRequirement(name = "JWT Authentication")
public class FeedController {

@Value("${careconnect.upload.dir}")
private String uploadDir;

@Autowired
private FeedService feedService;

@Autowired
private UserRepository userRepository;

@Autowired
private PatientRepository patientRepository;

@Autowired
private CaregiverRepository caregiverRepository;

@GetMapping("/all")
@Operation(
summary = "Get global feed",
Expand Down Expand Up @@ -111,76 +118,52 @@ 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();
User user = userRepository.findByEmail(email).orElse(null);
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();
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

public interface CaregiverRepository extends JpaRepository<Caregiver, Long> {
Optional<Caregiver> findByUser(User user);
Optional<Caregiver> findByUserId(Long userId);
boolean existsByIdAndUserId(Long caregiverId, Long userId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,15 @@ class _NewPostScreenState extends State<NewPostScreen> {
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}');
Expand Down
Loading