Skip to content

Commit

Permalink
Added validation and some new fields
Browse files Browse the repository at this point in the history
  • Loading branch information
dsleandro committed Feb 28, 2021
1 parent c8b5fd9 commit cea8d6f
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 26 deletions.
12 changes: 9 additions & 3 deletions chatear-service/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,22 @@
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.4.2</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.0</version>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.0</version>
</dependency>
</dependencies>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.dsleandro.chatear.controller;

import java.util.Optional;

import com.dsleandro.chatear.entity.ChatMessage;
import com.dsleandro.chatear.entity.ChatNotification;
import com.dsleandro.chatear.service.ChatMessageService;
Expand All @@ -10,6 +12,7 @@
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
Expand All @@ -25,15 +28,15 @@ public class ChatController {
private ChatRoomService chatRoomService;

@MessageMapping("/chat")
public void processMessage(@Payload ChatMessage chatMessage) {
public void processMessage(@Validated @Payload ChatMessage chatMessage) {
var chatId = chatRoomService.getChatId(chatMessage.getSenderId(), chatMessage.getRecipientId(), true);

chatMessage.setChatId(chatId.get());

ChatMessage saved = chatMessageService.save(chatMessage);

messagingTemplate.convertAndSendToUser(chatMessage.getRecipientId(), "/queue/messages",
new ChatNotification(saved.getId(), saved.getSenderId(), saved.getSenderName()));
new ChatNotification(saved.getId(), saved.getSenderId(), saved.getSenderUsername()));
}

@GetMapping("/messages/{senderId}/{recipientId}/count")
Expand All @@ -47,6 +50,14 @@ public ResponseEntity<?> findChatMessages(@PathVariable String senderId, @PathVa
return ResponseEntity.ok(chatMessageService.findChatMessages(senderId, recipientId));
}

@GetMapping("/messages/last/{senderId}/{recipientId}")
public ResponseEntity<?> findLastMessage(@PathVariable String senderId, @PathVariable String recipientId) {

Optional<String> chatId = chatRoomService.getChatId(senderId, recipientId, false);

return ResponseEntity.ok(chatMessageService.findLastMessage(chatId.orElse("")));
}

@GetMapping("/messages/{id}")
public ResponseEntity<?> findMessage(@PathVariable String id) {
return ResponseEntity.ok(chatMessageService.findById(id));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.HttpStatus;

@RestController
public class UserController {
Expand All @@ -23,21 +21,20 @@ public class UserController {
private UserService userService;

@PostMapping("/signup")
public ResponseEntity<User> signup(@RequestBody @Validated User user, BindingResult bindingResult) {
public ResponseEntity<?> signup(@RequestBody @Validated User user, BindingResult bindingResult) {

if (bindingResult.hasErrors()) {
return null;
return ResponseEntity.badRequest().body(bindingResult.getAllErrors());
}

return ResponseEntity.ok(userService.saveNewUser(user));

}

@GetMapping(value = "/users/me", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.OK)
public ResponseEntity<User> getCurrentUser() {

String loggedUser = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
String loggedUser = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return ResponseEntity.ok(userService.getUser(loggedUser));

}
Expand All @@ -47,9 +44,9 @@ public ResponseEntity<?> findAllUsers() {

String loggedUser = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

//returns all users except the logged User
return ResponseEntity.ok(
userService.getAll().stream().filter(user -> !user.getUsername().equals(loggedUser)).toArray());
// returns all users except the logged User
return ResponseEntity
.ok(userService.getAll().stream().filter(user -> !user.getUsername().equals(loggedUser)).toArray());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,33 @@
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document
public class ChatMessage {
@Id
@Null
private String id;
@NotBlank
private String chatId;
@NotBlank
private String senderId;
@NotBlank
private String recipientId;
private String senderName;
private String recipientName;
@NotBlank
private String senderUsername;
@NotBlank
private String recipientUsername;
@NotBlank
private String content;
@NotNull
private Date timestamp;
@NotNull
private MessageStatus status;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.dsleandro.chatear.entity;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Pattern.Flag;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
Expand All @@ -10,7 +14,13 @@
@NoArgsConstructor
@Builder
public class ChatNotification {
private String id;
@NotBlank
private String messageId;

@NotBlank
private String senderId;
private String senderName;

@NotBlank
@Pattern(regexp = "^(?!.*\\.$)(?!.*\\.\\.)(?!\\..*)[a-z0-9_.]{3,15}$", flags = Flag.MULTILINE)
private String senderUsername;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotBlank;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

Expand All @@ -15,6 +18,8 @@
public class ChatRoom {
@Id
private String chatId;
@NotBlank
private String user1;
@NotBlank
private String user2;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
package com.dsleandro.chatear.entity;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Null;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import javax.validation.constraints.Pattern.Flag;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

Expand All @@ -14,7 +20,23 @@
public class User {

@Id
@Null
private String id;

@NotBlank
@Size(min = 2, max = 30)
@Pattern(regexp = "[a-zA-Z -']*")
private String firstName;

@Size(max = 40)
@Pattern(regexp = "[a-zA-Z -']*")
private String lastName;

@NotBlank
@Pattern(regexp = "^(?!.*\\.$)(?!.*\\.\\.)(?!\\..*)[a-z0-9_.]{3,15}$", flags = Flag.MULTILINE)
private String username;

@NotBlank
@Size(min = 8, max = 255)
private String password;
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,7 @@ public interface ChatMessageRepository extends MongoRepository<ChatMessage, Stri
long countBySenderIdAndRecipientIdAndStatus(String senderId, String recipientId, MessageStatus status);

List<ChatMessage> findByChatId(String chatId);

// get last message
ChatMessage findFirst1ByChatIdOrderByTimestampDesc(String chatId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,28 @@

@Service
public class ChatMessageService {

@Autowired
private ChatMessageRepository repository;
private ChatMessageRepository messageRepository;
@Autowired
private ChatRoomService chatRoomService;
@Autowired
private MongoOperations mongoOperations;

public ChatMessage save(ChatMessage chatMessage) {
chatMessage.setStatus(MessageStatus.RECEIVED);
repository.save(chatMessage);
messageRepository.save(chatMessage);
return chatMessage;
}

public long countNewMessages(String senderId, String recipientId) {
return repository.countBySenderIdAndRecipientIdAndStatus(senderId, recipientId, MessageStatus.RECEIVED);
return messageRepository.countBySenderIdAndRecipientIdAndStatus(senderId, recipientId, MessageStatus.RECEIVED);
}

public List<ChatMessage> findChatMessages(String senderId, String recipientId) {
var chatId = chatRoomService.getChatId(senderId, recipientId, false);

var messages = chatId.map(cId -> repository.findByChatId(cId)).orElse(new ArrayList<>());
var messages = chatId.map(cId -> messageRepository.findByChatId(cId)).orElse(new ArrayList<>());

if (messages.size() > 0) {
updateStatuses(senderId, recipientId, MessageStatus.DELIVERED);
Expand All @@ -47,16 +47,20 @@ public List<ChatMessage> findChatMessages(String senderId, String recipientId) {
}

public ChatMessage findById(String id) {
return repository.findById(id).map(chatMessage -> {
return messageRepository.findById(id).map(chatMessage -> {
chatMessage.setStatus(MessageStatus.DELIVERED);
return repository.save(chatMessage);
return messageRepository.save(chatMessage);
}).orElseThrow(() -> new ResourceNotFoundException("can't find message (" + id + ")"));
}

public ChatMessage findLastMessage(String chatId) {
return messageRepository.findFirst1ByChatIdOrderByTimestampDesc(chatId);
}

public void updateStatuses(String senderId, String recipientId, MessageStatus status) {
Query query = new Query(Criteria.where("senderId").is(senderId).and("recipientId").is(recipientId));
Update update = Update.update("status", status);

mongoOperations.updateMulti(query, update, ChatMessage.class);
}
}

0 comments on commit cea8d6f

Please sign in to comment.