Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Expand Up @@ -139,6 +139,21 @@ public PrecisePage<Group> get(boolean onlyApplications, boolean onlyResources, i
return pageBuilder.doPrecise(offset, quantity, get(onlyApplications, onlyResources));
}

@VIPExternalSafe
public List<Group> searchGroups(String query, int limit) throws VipException {
if (query == null || query.isBlank()) {
return List.of();
}

int safeLimit = Math.max(1, Math.min(limit, 50));
String normalized = query.trim().toLowerCase();

return get(false, false).stream()
.filter((group) -> group.getName() != null && group.getName().toLowerCase().contains(normalized))
.limit(safeLimit)
.collect(Collectors.toList());
}

@VIPExternalSafe
public Group get(String groupName) throws VipException {
if (groupName == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Stream;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -181,6 +182,38 @@ public List<User> getUsers() throws VipException {
}
}

@VIPExternalSafe
public List<User> searchUsers(String query, int limit) throws VipException {
if (query == null || query.isBlank()) {
return List.of();
}

int safeLimit = Math.max(1, Math.min(limit, 50));
String normalized = query.trim().toLowerCase();

// TODO : optimize by doing the filtering in the database instead of in memory
return getUsers().stream()
.filter((user) -> matchesQuery(user, normalized))
.limit(safeLimit)
.collect(Collectors.toList());
}

private boolean matchesQuery(User user, String query) {
if (user == null) {
return false;
}

Stream<String> fields = Stream.of(
user.getEmail(),
user.getFirstName(),
user.getLastName(),
user.getFullName());

return fields.filter((value) -> value != null && !value.isBlank())
.map((value) -> value.toLowerCase())
.anyMatch((value) -> value.contains(query));
}

@VIPExternalSafe
public void remove(String id, boolean sendNotificationEmail) throws VipException {
User user = get(id);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package fr.insalyon.creatis.vip.core.server.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
Expand Down Expand Up @@ -41,6 +43,12 @@ public PrecisePage<Group> list(@RequestParam(defaultValue = "false") boolean onl
return groupBusiness.get(onlyApplications, onlyResources, offset, quantity);
}

@GetMapping(params = "q")
public List<Group> search(@RequestParam String q,
@RequestParam(defaultValue = "10") @Positive @Max(value = 50) int limit) throws VipException {
return groupBusiness.searchGroups(q, limit);
}

@GetMapping(value = "{id}")
public Group get(@PathVariable String id) throws VipException {
Group group = groupBusiness.get(id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
Expand Down Expand Up @@ -47,6 +49,12 @@ public PrecisePage<User> list(@RequestParam(defaultValue = "0") @PositiveOrZero
return userBusiness.getAll(offset, quantity);
}

@GetMapping(params = "q")
public List<User> search(@RequestParam String q,
@RequestParam(defaultValue = "50") @Positive @Max(value = 50) int limit) throws VipException {
return userBusiness.searchUsers(q, limit);
}

@GetMapping(value = "me")
public User getCurrentUser() throws VipException {
return userBusiness.getCurrentUser();
Expand All @@ -64,6 +72,7 @@ public User get(@PathVariable String id) throws VipException {
}
}


@DeleteMapping(value = "{id}")
public void remove(@PathVariable String id) throws VipException {
// existance of user is checked inside remove function
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@

import java.util.Date;

import com.fasterxml.jackson.annotation.JsonView;
import com.google.gwt.user.client.rpc.IsSerializable;

import fr.insalyon.creatis.vip.core.models.User;
import fr.insalyon.creatis.vip.core.server.inter.DataViews;

/**
*
* @author Rafael Silva
*/
@JsonView(DataViews.User.class)
public class GroupMessage implements IsSerializable {

private long id;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
package fr.insalyon.creatis.vip.social.models;

import com.google.gwt.user.client.rpc.IsSerializable;
import com.fasterxml.jackson.annotation.JsonView;

import fr.insalyon.creatis.vip.core.models.User;
import fr.insalyon.creatis.vip.core.server.inter.DataViews;

import java.util.Date;

/**
*
* @author Rafael Silva
*/
@JsonView(DataViews.User.class)
public class Message implements IsSerializable {

private long id;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package fr.insalyon.creatis.vip.social.models;

import com.fasterxml.jackson.annotation.JsonView;

import fr.insalyon.creatis.vip.core.server.inter.DataViews;

@JsonView(DataViews.User.class)
public class SendMessageRequest {

private String[] recipients;
private String subject;
private String message;
private Boolean isGroupMessage;

public String[] getRecipients() {
return recipients;
}

public void setRecipients(String[] recipients) {
this.recipients = recipients;
}

public String getSubject() {
return subject;
}

public void setSubject(String subject) {
this.subject = subject;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

public Boolean getIsGroupMessage() {
return isGroupMessage;
}

public void setIsGroupMessage(Boolean isGroupMessage) {
this.isGroupMessage = isGroupMessage;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
package fr.insalyon.creatis.vip.social.server.controller;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import fr.insalyon.creatis.vip.core.client.DefaultError;
import fr.insalyon.creatis.vip.core.client.VipException;
import fr.insalyon.creatis.vip.core.models.User;
import fr.insalyon.creatis.vip.core.server.business.UserBusiness;
import fr.insalyon.creatis.vip.core.server.inter.DataViews;
import fr.insalyon.creatis.vip.social.models.GroupMessage;
import fr.insalyon.creatis.vip.social.models.Message;
import fr.insalyon.creatis.vip.social.models.SendMessageRequest;
import fr.insalyon.creatis.vip.social.server.business.MessageBusiness;

@RestController
@RequestMapping("/messages")
public class MessageController {

private final MessageBusiness messageBusiness;
private final UserBusiness userBusiness;

@Autowired
public MessageController(MessageBusiness messageBusiness, UserBusiness userBusiness) {
this.messageBusiness = messageBusiness;
this.userBusiness = userBusiness;
}

@GetMapping
public List<Message> getReceivedMessages(@RequestParam(required = false) Long startDate) throws VipException {
User currentUser = userBusiness.getCurrentUser();
return messageBusiness.getMessagesByUser(currentUser.getEmail(), toDate(startDate));
}

@GetMapping("/send")
public List<Message> getSentMessages(@RequestParam(required = false) Long startDate) throws VipException {
User currentUser = userBusiness.getCurrentUser();
return messageBusiness.getSentMessagesByUser(currentUser.getEmail(), toDate(startDate));
}

@GetMapping("/groups")
public List<GroupMessage> getGroupMessages(@RequestParam String groupName,
@RequestParam(required = false) Long startDate) throws VipException {
return messageBusiness.getGroupMessages(groupName, toDate(startDate));
}

@PostMapping
public void sendMessage(@RequestBody SendMessageRequest request) throws VipException {
if (request == null || request.getRecipients() == null || request.getRecipients().length == 0) {
throw new VipException(DefaultError.BAD_INPUT_FIELD, "recipients", "Recipients are required!");
}
if (request.getSubject() == null || request.getSubject().isBlank()) {
throw new VipException(DefaultError.BAD_INPUT_FIELD, "subject", "Subject is required!");
}
if (request.getMessage() == null || request.getMessage().isBlank()) {
throw new VipException(DefaultError.BAD_INPUT_FIELD, "message", "Message is required!");
}

User currentUser = userBusiness.getCurrentUser();
if (Boolean.TRUE.equals(request.getIsGroupMessage())) {
System.out.println("Group message to send : " + request.getSubject() + " to groups : " + String.join(", ", request.getRecipients()));
for (String groupName : request.getRecipients()) {
if (groupName != null && !groupName.isBlank()) {
messageBusiness.sendGroupMessage(
currentUser,
groupName,
userBusiness.getUsersFromGroup(groupName),
request.getSubject(),
request.getMessage());
}
}
return;
}

messageBusiness.sendMessage(currentUser, request.getRecipients(), request.getSubject(), request.getMessage());
}

@DeleteMapping("/{id}")
public void deleteMessage(@PathVariable long id) throws VipException {
User currentUser = userBusiness.getCurrentUser();
messageBusiness.removeByReceiver(id, currentUser.getEmail());
}

@DeleteMapping("/send/{id}")
public void deleteSentMessage(@PathVariable long id) throws VipException {
messageBusiness.remove(id);
}

@PutMapping("/{id}/read")
public void markAsRead(@PathVariable long id) throws VipException {
User currentUser = userBusiness.getCurrentUser();
messageBusiness.markAsRead(id, currentUser.getEmail());
}

private Date toDate(Long startDate) {
return startDate == null ? new Date() : new Date(startDate);
}

}
Loading