SlideShare a Scribd company logo
Creating a WhatsApp Clone - Part XIII
@Service
public class UserService {
@Autowired
private UserRepository users;
@Autowired
private ChatGroupRepository groups;
@Autowired
private ChatMessageRepository messages;
@Autowired
private APIKeys keys;
@Autowired
private PasswordEncoder encoder;
@Autowired
private MediaRepository medias;
e
UserService
@Service
public class UserService {
@Autowired
private UserRepository users;
@Autowired
private ChatGroupRepository groups;
@Autowired
private ChatMessageRepository messages;
@Autowired
private APIKeys keys;
@Autowired
private PasswordEncoder encoder;
@Autowired
private MediaRepository medias;
e
UserService
@Service
public class UserService {
@Autowired
private UserRepository users;
@Autowired
private ChatGroupRepository groups;
@Autowired
private ChatMessageRepository messages;
@Autowired
private APIKeys keys;
@Autowired
private PasswordEncoder encoder;
@Autowired
private MediaRepository medias;
e
UserService
@Service
public class UserService {
@Autowired
private UserRepository users;
@Autowired
private ChatGroupRepository groups;
@Autowired
private ChatMessageRepository messages;
@Autowired
private APIKeys keys;
@Autowired
private PasswordEncoder encoder;
@Autowired
private MediaRepository medias;
e
UserService
@Autowired
private ChatGroupRepository groups;
@Autowired
private ChatMessageRepository messages;
@Autowired
private APIKeys keys;
@Autowired
private PasswordEncoder encoder;
@Autowired
private MediaRepository medias;
@Autowired
private NotificationService notifications;
private void sendActivationSMS(String number, String text) {
Twilio.init(keys.get("twilio.sid"), keys.get("twilio.auth"));
e
UserService
private PasswordEncoder encoder;
@Autowired
private MediaRepository medias;
@Autowired
private NotificationService notifications;
private void sendActivationSMS(String number, String text) {
Twilio.init(keys.get("twilio.sid"), keys.get("twilio.auth"));
Message message = Message
.creator(new PhoneNumber(number),
new PhoneNumber(keys.get("twilio.phone")),
text)
.create();
message.getSid();
}
public UserDAO login(String phone, String auth)
throws LoginException {
List<User> userList;
userList = users.findByPhone(phone);
e
UserService
new PhoneNumber(keys.get("twilio.phone")),
text)
.create();
message.getSid();
}
public UserDAO login(String phone, String auth)
throws LoginException {
List<User> userList;
userList = users.findByPhone(phone);
if (userList != null && userList.size() == 1) {
User u = userList.get(0);
if (encoder.matches(auth, u.getAuthtoken())) {
return u.getLoginDAO();
}
throw new LoginException("Authentication error!");
}
throw new LoginException("User not found!");
}
private String createVerificationCode(int length) {
StringBuilder k = new StringBuilder();
e
UserService
new PhoneNumber(keys.get("twilio.phone")),
text)
.create();
message.getSid();
}
public UserDAO login(String phone, String auth)
throws LoginException {
List<User> userList;
userList = users.findByPhone(phone);
if (userList != null && userList.size() == 1) {
User u = userList.get(0);
if (encoder.matches(auth, u.getAuthtoken())) {
return u.getLoginDAO();
}
throw new LoginException("Authentication error!");
}
throw new LoginException("User not found!");
}
private String createVerificationCode(int length) {
StringBuilder k = new StringBuilder();
e
UserService
new PhoneNumber(keys.get("twilio.phone")),
text)
.create();
message.getSid();
}
public UserDAO login(String phone, String auth)
throws LoginException {
List<User> userList;
userList = users.findByPhone(phone);
if (userList != null && userList.size() == 1) {
User u = userList.get(0);
if (encoder.matches(auth, u.getAuthtoken())) {
return u.getLoginDAO();
}
throw new LoginException("Authentication error!");
}
throw new LoginException("User not found!");
}
private String createVerificationCode(int length) {
StringBuilder k = new StringBuilder();
e
UserService
if (encoder.matches(auth, u.getAuthtoken())) {
return u.getLoginDAO();
}
throw new LoginException("Authentication error!");
}
throw new LoginException("User not found!");
}
private String createVerificationCode(int length) {
StringBuilder k = new StringBuilder();
Random r = new Random();
for (int iter = 0; iter < length; iter++) {
k.append(r.nextInt(10));
}
return k.toString();
}
public UserDAO signup(UserDAO user) throws SignupException {
List<User> ul = users.findByPhone(user.getPhone());
if (ul != null && ul.size() > 0) {
throw new SignupException(
e
UserService
}
public UserDAO signup(UserDAO user) throws SignupException {
List<User> ul = users.findByPhone(user.getPhone());
if (ul != null && ul.size() > 0) {
throw new SignupException(
"The phone number is already registered!");
}
User u = new User();
setProps(user, u);
u.setAuthtoken(UUID.randomUUID().toString());
u.setVerificationCode(createVerificationCode(4));
users.save(u);
sendActivationSMS(user.getPhone(), "Activation key: " + u.
getVerificationCode());
return u.getLoginDAO();
}
e
UserService
}
public UserDAO signup(UserDAO user) throws SignupException {
List<User> ul = users.findByPhone(user.getPhone());
if (ul != null && ul.size() > 0) {
throw new SignupException(
"The phone number is already registered!");
}
User u = new User();
setProps(user, u);
u.setAuthtoken(UUID.randomUUID().toString());
u.setVerificationCode(createVerificationCode(4));
users.save(u);
sendActivationSMS(user.getPhone(), "Activation key: " + u.
getVerificationCode());
return u.getLoginDAO();
}
e
UserService
}
public UserDAO signup(UserDAO user) throws SignupException {
List<User> ul = users.findByPhone(user.getPhone());
if (ul != null && ul.size() > 0) {
throw new SignupException(
"The phone number is already registered!");
}
User u = new User();
setProps(user, u);
u.setAuthtoken(UUID.randomUUID().toString());
u.setVerificationCode(createVerificationCode(4));
users.save(u);
sendActivationSMS(user.getPhone(), "Activation key: " + u.
getVerificationCode());
return u.getLoginDAO();
}
e
UserService
}
public UserDAO signup(UserDAO user) throws SignupException {
List<User> ul = users.findByPhone(user.getPhone());
if (ul != null && ul.size() > 0) {
throw new SignupException(
"The phone number is already registered!");
}
User u = new User();
setProps(user, u);
u.setAuthtoken(UUID.randomUUID().toString());
u.setVerificationCode(createVerificationCode(4));
users.save(u);
sendActivationSMS(user.getPhone(), "Activation key: " + u.
getVerificationCode());
return u.getLoginDAO();
}
e
UserService
sendActivationSMS(user.getPhone(), "Activation key: " + u.
getVerificationCode());
return u.getLoginDAO();
}
public boolean verifyPhone(String userId, String code) {
User u = users.findById(userId).get();
if (u.getVerificationCode().equals(code)) {
u.setVerificationCode(null);
u.setVerified(true);
users.save(u);
return true;
}
return false;
}
private void setProps(UserDAO user, User u) {
u.setName(user.getName());
u.setTagline(user.getTagline());
}
e
UserService
sendActivationSMS(user.getPhone(), "Activation key: " + u.
getVerificationCode());
return u.getLoginDAO();
}
public boolean verifyPhone(String userId, String code) {
User u = users.findById(userId).get();
if (u.getVerificationCode().equals(code)) {
u.setVerificationCode(null);
u.setVerified(true);
users.save(u);
return true;
}
return false;
}
private void setProps(UserDAO user, User u) {
u.setName(user.getName());
u.setTagline(user.getTagline());
}
e
UserService
private void setProps(UserDAO user, User u) {
u.setName(user.getName());
u.setTagline(user.getTagline());
}
public void update(String auth, UserDAO user) {
User u = users.findById(user.getId()).get();
if (encoder.matches(auth, u.getAuthtoken())) {
setProps(user, u);
users.save(u);
}
}
public byte[] getAvatar(String userId) {
User u = users.findById(userId).get();
if (u.getAvatar() != null) {
return u.getAvatar().getData();
}
return null;
}
e
UserService
users.save(u);
}
}
public byte[] getAvatar(String userId) {
User u = users.findById(userId).get();
if (u.getAvatar() != null) {
return u.getAvatar().getData();
}
return null;
}
public void setAvatar(String auth, String userId, String mediaId) {
Media m = medias.findById(mediaId).get();
User u = users.findById(userId).get();
if (encoder.matches(auth, u.getAuthtoken())) {
u.setAvatar(m);
users.save(u);
}
}
public void userTyping(String userId, String toUser, boolean t) {
e
UserService
User u = users.findById(userId).get();
if (encoder.matches(auth, u.getAuthtoken())) {
u.setAvatar(m);
users.save(u);
}
}
public void userTyping(String userId, String toUser, boolean t) {
Optional<User> to = users.findById(toUser);
if(to.isPresent()) {
AppSocket.sendUserTyping(to.get().getAuthtoken(), userId, t);
} else {
ChatGroup g = groups.findById(toUser).get();
for(User u : g.getMembers()) {
AppSocket.sendUserTyping(u.getAuthtoken(), userId, t);
}
}
}
public MessageDAO sendMessage(MessageDAO m) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById(m.getAuthorId()).get());
e
UserService
User u = users.findById(userId).get();
if (encoder.matches(auth, u.getAuthtoken())) {
u.setAvatar(m);
users.save(u);
}
}
public void userTyping(String userId, String toUser, boolean t) {
Optional<User> to = users.findById(toUser);
if(to.isPresent()) {
AppSocket.sendUserTyping(to.get().getAuthtoken(), userId, t);
} else {
ChatGroup g = groups.findById(toUser).get();
for(User u : g.getMembers()) {
AppSocket.sendUserTyping(u.getAuthtoken(), userId, t);
}
}
}
public MessageDAO sendMessage(MessageDAO m) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById(m.getAuthorId()).get());
e
UserService
User u = users.findById(userId).get();
if (encoder.matches(auth, u.getAuthtoken())) {
u.setAvatar(m);
users.save(u);
}
}
public void userTyping(String userId, String toUser, boolean t) {
Optional<User> to = users.findById(toUser);
if(to.isPresent()) {
AppSocket.sendUserTyping(to.get().getAuthtoken(), userId, t);
} else {
ChatGroup g = groups.findById(toUser).get();
for(User u : g.getMembers()) {
AppSocket.sendUserTyping(u.getAuthtoken(), userId, t);
}
}
}
public MessageDAO sendMessage(MessageDAO m) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById(m.getAuthorId()).get());
e
UserService
User u = users.findById(userId).get();
if (encoder.matches(auth, u.getAuthtoken())) {
u.setAvatar(m);
users.save(u);
}
}
public void userTyping(String userId, String toUser, boolean t) {
Optional<User> to = users.findById(toUser);
if(to.isPresent()) {
AppSocket.sendUserTyping(to.get().getAuthtoken(), userId, t);
} else {
ChatGroup g = groups.findById(toUser).get();
for(User u : g.getMembers()) {
AppSocket.sendUserTyping(u.getAuthtoken(), userId, t);
}
}
}
public MessageDAO sendMessage(MessageDAO m) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById(m.getAuthorId()).get());
e
UserService
}
}
public MessageDAO sendMessage(MessageDAO m) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById(m.getAuthorId()).get());
cm.setBody(m.getBody());
cm.setMessageTime(new Date());
Optional<User> to = users.findById(m.getSentTo());
if(to.isPresent()) {
cm.setSentTo(to.get());
String json = createMessageImpl(m.getSentTo(), cm);
User usr = to.get();
sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json,
m.getBody());
} else {
ChatGroup g = groups.findById(m.getSentTo()).get();
cm.setSentToGroup(g);
String json = createMessageImpl(m.getSentTo(), cm);
for(User u : g.getMembers()) {
sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json,
e
UserService
}
}
public MessageDAO sendMessage(MessageDAO m) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById(m.getAuthorId()).get());
cm.setBody(m.getBody());
cm.setMessageTime(new Date());
Optional<User> to = users.findById(m.getSentTo());
if(to.isPresent()) {
cm.setSentTo(to.get());
String json = createMessageImpl(m.getSentTo(), cm);
User usr = to.get();
sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json,
m.getBody());
} else {
ChatGroup g = groups.findById(m.getSentTo()).get();
cm.setSentToGroup(g);
String json = createMessageImpl(m.getSentTo(), cm);
for(User u : g.getMembers()) {
sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json,
e
UserService
}
}
public MessageDAO sendMessage(MessageDAO m) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById(m.getAuthorId()).get());
cm.setBody(m.getBody());
cm.setMessageTime(new Date());
Optional<User> to = users.findById(m.getSentTo());
if(to.isPresent()) {
cm.setSentTo(to.get());
String json = createMessageImpl(m.getSentTo(), cm);
User usr = to.get();
sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json,
m.getBody());
} else {
ChatGroup g = groups.findById(m.getSentTo()).get();
cm.setSentToGroup(g);
String json = createMessageImpl(m.getSentTo(), cm);
for(User u : g.getMembers()) {
sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json,
e
UserService
public MessageDAO sendMessage(MessageDAO m) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById(m.getAuthorId()).get());
cm.setBody(m.getBody());
cm.setMessageTime(new Date());
Optional<User> to = users.findById(m.getSentTo());
if(to.isPresent()) {
cm.setSentTo(to.get());
String json = createMessageImpl(m.getSentTo(), cm);
User usr = to.get();
sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json,
m.getBody());
} else {
ChatGroup g = groups.findById(m.getSentTo()).get();
cm.setSentToGroup(g);
String json = createMessageImpl(m.getSentTo(), cm);
for(User u : g.getMembers()) {
sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json,
m.getBody());
}
}
return cm.getDAO();
}
e
UserService
public MessageDAO sendMessage(MessageDAO m) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById(m.getAuthorId()).get());
cm.setBody(m.getBody());
cm.setMessageTime(new Date());
Optional<User> to = users.findById(m.getSentTo());
if(to.isPresent()) {
cm.setSentTo(to.get());
String json = createMessageImpl(m.getSentTo(), cm);
User usr = to.get();
sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json,
m.getBody());
} else {
ChatGroup g = groups.findById(m.getSentTo()).get();
cm.setSentToGroup(g);
String json = createMessageImpl(m.getSentTo(), cm);
for(User u : g.getMembers()) {
sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json,
m.getBody());
}
}
return cm.getDAO();
}
e
UserService
public MessageDAO sendMessage(MessageDAO m) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById(m.getAuthorId()).get());
cm.setBody(m.getBody());
cm.setMessageTime(new Date());
Optional<User> to = users.findById(m.getSentTo());
if(to.isPresent()) {
cm.setSentTo(to.get());
String json = createMessageImpl(m.getSentTo(), cm);
User usr = to.get();
sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json,
m.getBody());
} else {
ChatGroup g = groups.findById(m.getSentTo()).get();
cm.setSentToGroup(g);
String json = createMessageImpl(m.getSentTo(), cm);
for(User u : g.getMembers()) {
sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json,
m.getBody());
}
}
return cm.getDAO();
}
e
UserService
for(User u : g.getMembers()) {
sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json,
m.getBody());
}
}
return cm.getDAO();
}
private void sendMessageImpl(String authToken, String pushKey,
String json, String message) {
if(!AppSocket.sendMessage(authToken, json)) {
notifications.sendPushNotification(pushKey, message, 1);
}
}
public void sendMessage(String toUser,
Map<String, Object> parsedJSON) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById((String)parsedJSON.get("authorId")).
get());
cm.setBody((String)parsedJSON.get("body"));
cm.setMessageTime(new Date());
e
UserService
for(User u : g.getMembers()) {
sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json,
m.getBody());
}
}
return cm.getDAO();
}
private void sendMessageImpl(String authToken, String pushKey,
String json, String message) {
if(!AppSocket.sendMessage(authToken, json)) {
notifications.sendPushNotification(pushKey, message, 1);
}
}
public void sendMessage(String toUser,
Map<String, Object> parsedJSON) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById((String)parsedJSON.get("authorId")).
get());
cm.setBody((String)parsedJSON.get("body"));
cm.setMessageTime(new Date());
e
UserService
}
}
public void sendMessage(String toUser,
Map<String, Object> parsedJSON) {
ChatMessage cm = new ChatMessage();
cm.setAuthor(users.findById((String)parsedJSON.get("authorId")).
get());
cm.setBody((String)parsedJSON.get("body"));
cm.setMessageTime(new Date());
Optional<User> to = users.findById(toUser);
if(to.isPresent()) {
cm.setSentTo(to.get());
String json = createMessageImpl(toUser, cm);
User usr = to.get();
sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(),
json, cm.getBody());
} else {
ChatGroup g = groups.findById(toUser).get();
cm.setSentToGroup(g);
String json = createMessageImpl(toUser, cm);
for(User u : g.getMembers()) {
e
UserService
String json = createMessageImpl(toUser, cm);
for(User u : g.getMembers()) {
sendMessageImpl(u.getAuthtoken(), u.getPushKey(),
json, cm.getBody());
}
}
}
private String createMessageImpl(String toUser, ChatMessage cm) {
cm = messages.save(cm);
ObjectMapper objectMapper = new ObjectMapper();
try {
String dao = objectMapper.writeValueAsString(cm.getDAO());
return dao;
} catch(JsonProcessingException err) {
throw new RuntimeException(err);
}
}
public void sendJSONTo(String toUser, String json) {
Optional<User> to = users.findById(toUser);
if(to.isPresent()) {
e
UserService
String json = createMessageImpl(toUser, cm);
for(User u : g.getMembers()) {
sendMessageImpl(u.getAuthtoken(), u.getPushKey(),
json, cm.getBody());
}
}
}
private String createMessageImpl(String toUser, ChatMessage cm) {
cm = messages.save(cm);
ObjectMapper objectMapper = new ObjectMapper();
try {
String dao = objectMapper.writeValueAsString(cm.getDAO());
return dao;
} catch(JsonProcessingException err) {
throw new RuntimeException(err);
}
}
public void sendJSONTo(String toUser, String json) {
Optional<User> to = users.findById(toUser);
if(to.isPresent()) {
e
UserService
return dao;
} catch(JsonProcessingException err) {
throw new RuntimeException(err);
}
}
public void sendJSONTo(String toUser, String json) {
Optional<User> to = users.findById(toUser);
if(to.isPresent()) {
AppSocket.sendMessage(to.get().getAuthtoken(), json);
} else {
ChatGroup g = groups.findById(toUser).get();
for(User u : g.getMembers()) {
AppSocket.sendMessage(u.getAuthtoken(), json);
}
}
}
public UserDAO findRegisteredUser(String phone) {
return fromList(users.findByPhone(phone));
}
e
UserService
AppSocket.sendMessage(u.getAuthtoken(), json);
}
}
}
public UserDAO findRegisteredUser(String phone) {
return fromList(users.findByPhone(phone));
}
private UserDAO fromList(List<User> ul) {
if(ul.isEmpty()) {
return null;
}
User u = ul.get(0);
if(!u.isVerified()) {
return null;
}
return u.getDAO();
}
public UserDAO findRegisteredUserById(String id) {
return users.findById(id).get().getDAO();
e
UserService
AppSocket.sendMessage(u.getAuthtoken(), json);
}
}
}
public UserDAO findRegisteredUser(String phone) {
return fromList(users.findByPhone(phone));
}
private UserDAO fromList(List<User> ul) {
if(ul.isEmpty()) {
return null;
}
User u = ul.get(0);
if(!u.isVerified()) {
return null;
}
return u.getDAO();
}
public UserDAO findRegisteredUserById(String id) {
return users.findById(id).get().getDAO();
e
UserService
public UserDAO findRegisteredUserById(String id) {
return users.findById(id).get().getDAO();
}
public void ackMessage(String id) {
ChatMessage m = messages.findById(id).get();
m.setAck(true);
messages.save(m);
}
public void sendUnAckedMessages(String toUser) {
List<ChatMessage> mess = messages.findByUnAcked(toUser);
for(ChatMessage m : mess) {
sendMessage(m.getDAO());
}
}
public void updatePushKey(String auth, String id, String key) {
User u = users.findById(auth).get();
if (encoder.matches(auth, u.getAuthtoken())) {
u.setPushKey(key);
users.save(u);
e
UserService
public UserDAO findRegisteredUserById(String id) {
return users.findById(id).get().getDAO();
}
public void ackMessage(String id) {
ChatMessage m = messages.findById(id).get();
m.setAck(true);
messages.save(m);
}
public void sendUnAckedMessages(String toUser) {
List<ChatMessage> mess = messages.findByUnAcked(toUser);
for(ChatMessage m : mess) {
sendMessage(m.getDAO());
}
}
public void updatePushKey(String auth, String id, String key) {
User u = users.findById(auth).get();
if (encoder.matches(auth, u.getAuthtoken())) {
u.setPushKey(key);
users.save(u);
e
UserService
public void ackMessage(String id) {
ChatMessage m = messages.findById(id).get();
m.setAck(true);
messages.save(m);
}
public void sendUnAckedMessages(String toUser) {
List<ChatMessage> mess = messages.findByUnAcked(toUser);
for(ChatMessage m : mess) {
sendMessage(m.getDAO());
}
}
public void updatePushKey(String auth, String id, String key) {
User u = users.findById(auth).get();
if (encoder.matches(auth, u.getAuthtoken())) {
u.setPushKey(key);
users.save(u);
}
}
}
e
UserService

More Related Content

Similar to Creating a Whatsapp Clone - Part XIII.pdf

Testando API's de forma unitária mocando as dependências
Testando API's de forma unitária mocando as dependênciasTestando API's de forma unitária mocando as dependências
Testando API's de forma unitária mocando as dependências
Marcelo Aymone
 
Creating a Facebook Clone - Part XLV - Transcript.pdf
Creating a Facebook Clone - Part XLV - Transcript.pdfCreating a Facebook Clone - Part XLV - Transcript.pdf
Creating a Facebook Clone - Part XLV - Transcript.pdf
ShaiAlmog1
 
Creating a Facebook Clone - Part XLV.pdf
Creating a Facebook Clone - Part XLV.pdfCreating a Facebook Clone - Part XLV.pdf
Creating a Facebook Clone - Part XLV.pdf
ShaiAlmog1
 
Android Testing
Android TestingAndroid Testing
Android Testing
Evan Lin
 
Creating a Facebook Clone - Part XXII.pdf
Creating a Facebook Clone - Part XXII.pdfCreating a Facebook Clone - Part XXII.pdf
Creating a Facebook Clone - Part XXII.pdf
ShaiAlmog1
 
Laporan multi client
Laporan multi clientLaporan multi client
Laporan multi client
ichsanbarokah
 
Include- Modularity using design patterns- Fault tolerance and Compone.pdf
Include- Modularity using design patterns- Fault tolerance and Compone.pdfInclude- Modularity using design patterns- Fault tolerance and Compone.pdf
Include- Modularity using design patterns- Fault tolerance and Compone.pdf
RyanF2PLeev
 
Creating a Facebook Clone - Part XXIV.pdf
Creating a Facebook Clone - Part XXIV.pdfCreating a Facebook Clone - Part XXIV.pdf
Creating a Facebook Clone - Part XXIV.pdf
ShaiAlmog1
 
Creating a Facebook Clone - Part XXV - Transcript.pdf
Creating a Facebook Clone - Part XXV - Transcript.pdfCreating a Facebook Clone - Part XXV - Transcript.pdf
Creating a Facebook Clone - Part XXV - Transcript.pdf
ShaiAlmog1
 
Codemotion appengine
Codemotion appengineCodemotion appengine
Codemotion appengine
Ignacio Coloma
 
Integrating Security Roles into Microsoft Silverlight Applications
Integrating Security Roles into Microsoft Silverlight ApplicationsIntegrating Security Roles into Microsoft Silverlight Applications
Integrating Security Roles into Microsoft Silverlight Applications
Dan Wahlin
 
Creating an Uber Clone - Part XIII.pdf
Creating an Uber Clone - Part XIII.pdfCreating an Uber Clone - Part XIII.pdf
Creating an Uber Clone - Part XIII.pdf
ShaiAlmog1
 
Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"
Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"
Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"
LogeekNightUkraine
 
Webauthn Tutorial
Webauthn TutorialWebauthn Tutorial
Webauthn Tutorial
FIDO Alliance
 
Creating a Whatsapp Clone - Part XIV.pdf
Creating a Whatsapp Clone - Part XIV.pdfCreating a Whatsapp Clone - Part XIV.pdf
Creating a Whatsapp Clone - Part XIV.pdf
ShaiAlmog1
 
Aprimorando sua Aplicação com Ext JS 4 - BrazilJS
Aprimorando sua Aplicação com Ext JS 4 - BrazilJSAprimorando sua Aplicação com Ext JS 4 - BrazilJS
Aprimorando sua Aplicação com Ext JS 4 - BrazilJS
Loiane Groner
 
Lesson_07_Spring_Security_Register_NEW.pdf
Lesson_07_Spring_Security_Register_NEW.pdfLesson_07_Spring_Security_Register_NEW.pdf
Lesson_07_Spring_Security_Register_NEW.pdf
Scott Anderson
 
Neues aus dem Tindergarten: Auswertung "privater" APIs mit Apache Ignite
Neues aus dem Tindergarten: Auswertung "privater" APIs mit Apache IgniteNeues aus dem Tindergarten: Auswertung "privater" APIs mit Apache Ignite
Neues aus dem Tindergarten: Auswertung "privater" APIs mit Apache Ignite
QAware GmbH
 
CDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptorCDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptor
Caelum
 
AuthN deep.dive—ASP.NET Authentication Internals.pdf
AuthN deep.dive—ASP.NET Authentication Internals.pdfAuthN deep.dive—ASP.NET Authentication Internals.pdf
AuthN deep.dive—ASP.NET Authentication Internals.pdf
ondrejl1
 

Similar to Creating a Whatsapp Clone - Part XIII.pdf (20)

Testando API's de forma unitária mocando as dependências
Testando API's de forma unitária mocando as dependênciasTestando API's de forma unitária mocando as dependências
Testando API's de forma unitária mocando as dependências
 
Creating a Facebook Clone - Part XLV - Transcript.pdf
Creating a Facebook Clone - Part XLV - Transcript.pdfCreating a Facebook Clone - Part XLV - Transcript.pdf
Creating a Facebook Clone - Part XLV - Transcript.pdf
 
Creating a Facebook Clone - Part XLV.pdf
Creating a Facebook Clone - Part XLV.pdfCreating a Facebook Clone - Part XLV.pdf
Creating a Facebook Clone - Part XLV.pdf
 
Android Testing
Android TestingAndroid Testing
Android Testing
 
Creating a Facebook Clone - Part XXII.pdf
Creating a Facebook Clone - Part XXII.pdfCreating a Facebook Clone - Part XXII.pdf
Creating a Facebook Clone - Part XXII.pdf
 
Laporan multi client
Laporan multi clientLaporan multi client
Laporan multi client
 
Include- Modularity using design patterns- Fault tolerance and Compone.pdf
Include- Modularity using design patterns- Fault tolerance and Compone.pdfInclude- Modularity using design patterns- Fault tolerance and Compone.pdf
Include- Modularity using design patterns- Fault tolerance and Compone.pdf
 
Creating a Facebook Clone - Part XXIV.pdf
Creating a Facebook Clone - Part XXIV.pdfCreating a Facebook Clone - Part XXIV.pdf
Creating a Facebook Clone - Part XXIV.pdf
 
Creating a Facebook Clone - Part XXV - Transcript.pdf
Creating a Facebook Clone - Part XXV - Transcript.pdfCreating a Facebook Clone - Part XXV - Transcript.pdf
Creating a Facebook Clone - Part XXV - Transcript.pdf
 
Codemotion appengine
Codemotion appengineCodemotion appengine
Codemotion appengine
 
Integrating Security Roles into Microsoft Silverlight Applications
Integrating Security Roles into Microsoft Silverlight ApplicationsIntegrating Security Roles into Microsoft Silverlight Applications
Integrating Security Roles into Microsoft Silverlight Applications
 
Creating an Uber Clone - Part XIII.pdf
Creating an Uber Clone - Part XIII.pdfCreating an Uber Clone - Part XIII.pdf
Creating an Uber Clone - Part XIII.pdf
 
Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"
Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"
Vasyl Aleksashyn "How to Stop Shooting Yourself in the Foot"
 
Webauthn Tutorial
Webauthn TutorialWebauthn Tutorial
Webauthn Tutorial
 
Creating a Whatsapp Clone - Part XIV.pdf
Creating a Whatsapp Clone - Part XIV.pdfCreating a Whatsapp Clone - Part XIV.pdf
Creating a Whatsapp Clone - Part XIV.pdf
 
Aprimorando sua Aplicação com Ext JS 4 - BrazilJS
Aprimorando sua Aplicação com Ext JS 4 - BrazilJSAprimorando sua Aplicação com Ext JS 4 - BrazilJS
Aprimorando sua Aplicação com Ext JS 4 - BrazilJS
 
Lesson_07_Spring_Security_Register_NEW.pdf
Lesson_07_Spring_Security_Register_NEW.pdfLesson_07_Spring_Security_Register_NEW.pdf
Lesson_07_Spring_Security_Register_NEW.pdf
 
Neues aus dem Tindergarten: Auswertung "privater" APIs mit Apache Ignite
Neues aus dem Tindergarten: Auswertung "privater" APIs mit Apache IgniteNeues aus dem Tindergarten: Auswertung "privater" APIs mit Apache Ignite
Neues aus dem Tindergarten: Auswertung "privater" APIs mit Apache Ignite
 
CDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptorCDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptor
 
AuthN deep.dive—ASP.NET Authentication Internals.pdf
AuthN deep.dive—ASP.NET Authentication Internals.pdfAuthN deep.dive—ASP.NET Authentication Internals.pdf
AuthN deep.dive—ASP.NET Authentication Internals.pdf
 

More from ShaiAlmog1

The Duck Teaches Learn to debug from the masters. Local to production- kill ...
The Duck Teaches  Learn to debug from the masters. Local to production- kill ...The Duck Teaches  Learn to debug from the masters. Local to production- kill ...
The Duck Teaches Learn to debug from the masters. Local to production- kill ...
ShaiAlmog1
 
create-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdfcreate-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdf
ShaiAlmog1
 
create-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdfcreate-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdf
ShaiAlmog1
 
create-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdfcreate-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdf
ShaiAlmog1
 
create-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdfcreate-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdf
ShaiAlmog1
 
create-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdfcreate-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdf
ShaiAlmog1
 
create-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdfcreate-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdf
ShaiAlmog1
 
create-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdfcreate-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdf
ShaiAlmog1
 
create-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdfcreate-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdf
ShaiAlmog1
 
create-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdfcreate-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdf
ShaiAlmog1
 
create-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdfcreate-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdf
ShaiAlmog1
 
create-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdfcreate-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdf
ShaiAlmog1
 
create-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdfcreate-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdf
ShaiAlmog1
 
Creating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdfCreating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdf
ShaiAlmog1
 
Creating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdfCreating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdf
ShaiAlmog1
 
Creating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdfCreating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdf
ShaiAlmog1
 
Creating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdfCreating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdf
ShaiAlmog1
 
Creating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdfCreating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdf
ShaiAlmog1
 
Creating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdfCreating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdf
ShaiAlmog1
 
Creating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdfCreating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdf
ShaiAlmog1
 

More from ShaiAlmog1 (20)

The Duck Teaches Learn to debug from the masters. Local to production- kill ...
The Duck Teaches  Learn to debug from the masters. Local to production- kill ...The Duck Teaches  Learn to debug from the masters. Local to production- kill ...
The Duck Teaches Learn to debug from the masters. Local to production- kill ...
 
create-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdfcreate-netflix-clone-06-client-ui.pdf
create-netflix-clone-06-client-ui.pdf
 
create-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdfcreate-netflix-clone-01-introduction_transcript.pdf
create-netflix-clone-01-introduction_transcript.pdf
 
create-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdfcreate-netflix-clone-02-server_transcript.pdf
create-netflix-clone-02-server_transcript.pdf
 
create-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdfcreate-netflix-clone-04-server-continued_transcript.pdf
create-netflix-clone-04-server-continued_transcript.pdf
 
create-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdfcreate-netflix-clone-01-introduction.pdf
create-netflix-clone-01-introduction.pdf
 
create-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdfcreate-netflix-clone-06-client-ui_transcript.pdf
create-netflix-clone-06-client-ui_transcript.pdf
 
create-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdfcreate-netflix-clone-03-server.pdf
create-netflix-clone-03-server.pdf
 
create-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdfcreate-netflix-clone-04-server-continued.pdf
create-netflix-clone-04-server-continued.pdf
 
create-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdfcreate-netflix-clone-05-client-model_transcript.pdf
create-netflix-clone-05-client-model_transcript.pdf
 
create-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdfcreate-netflix-clone-03-server_transcript.pdf
create-netflix-clone-03-server_transcript.pdf
 
create-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdfcreate-netflix-clone-02-server.pdf
create-netflix-clone-02-server.pdf
 
create-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdfcreate-netflix-clone-05-client-model.pdf
create-netflix-clone-05-client-model.pdf
 
Creating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdfCreating a Whatsapp Clone - Part II.pdf
Creating a Whatsapp Clone - Part II.pdf
 
Creating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdfCreating a Whatsapp Clone - Part IX - Transcript.pdf
Creating a Whatsapp Clone - Part IX - Transcript.pdf
 
Creating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdfCreating a Whatsapp Clone - Part II - Transcript.pdf
Creating a Whatsapp Clone - Part II - Transcript.pdf
 
Creating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdfCreating a Whatsapp Clone - Part V - Transcript.pdf
Creating a Whatsapp Clone - Part V - Transcript.pdf
 
Creating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdfCreating a Whatsapp Clone - Part IV - Transcript.pdf
Creating a Whatsapp Clone - Part IV - Transcript.pdf
 
Creating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdfCreating a Whatsapp Clone - Part IV.pdf
Creating a Whatsapp Clone - Part IV.pdf
 
Creating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdfCreating a Whatsapp Clone - Part I - Transcript.pdf
Creating a Whatsapp Clone - Part I - Transcript.pdf
 

Recently uploaded

Trusted Execution Environment for Decentralized Process Mining
Trusted Execution Environment for Decentralized Process MiningTrusted Execution Environment for Decentralized Process Mining
Trusted Execution Environment for Decentralized Process Mining
LucaBarbaro3
 
Nunit vs XUnit vs MSTest Differences Between These Unit Testing Frameworks.pdf
Nunit vs XUnit vs MSTest Differences Between These Unit Testing Frameworks.pdfNunit vs XUnit vs MSTest Differences Between These Unit Testing Frameworks.pdf
Nunit vs XUnit vs MSTest Differences Between These Unit Testing Frameworks.pdf
flufftailshop
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
Ivanti
 
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...
alexjohnson7307
 
Building Production Ready Search Pipelines with Spark and Milvus
Building Production Ready Search Pipelines with Spark and MilvusBuilding Production Ready Search Pipelines with Spark and Milvus
Building Production Ready Search Pipelines with Spark and Milvus
Zilliz
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
Zilliz
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
Jason Packer
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
DanBrown980551
 
Generating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and MilvusGenerating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and Milvus
Zilliz
 
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying AheadDigital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Wask
 
Skybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoptionSkybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoption
Tatiana Kojar
 
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfHow to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
Chart Kalyan
 
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAUHCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
panagenda
 
Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
Octavian Nadolu
 
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy SurveyTrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc
 
WeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation TechniquesWeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation Techniques
Postman
 
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdfUnlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Malak Abu Hammad
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
innovationoecd
 
Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...
Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...
Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...
Jeffrey Haguewood
 
Nordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptxNordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptx
MichaelKnudsen27
 

Recently uploaded (20)

Trusted Execution Environment for Decentralized Process Mining
Trusted Execution Environment for Decentralized Process MiningTrusted Execution Environment for Decentralized Process Mining
Trusted Execution Environment for Decentralized Process Mining
 
Nunit vs XUnit vs MSTest Differences Between These Unit Testing Frameworks.pdf
Nunit vs XUnit vs MSTest Differences Between These Unit Testing Frameworks.pdfNunit vs XUnit vs MSTest Differences Between These Unit Testing Frameworks.pdf
Nunit vs XUnit vs MSTest Differences Between These Unit Testing Frameworks.pdf
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
 
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...
leewayhertz.com-AI in predictive maintenance Use cases technologies benefits ...
 
Building Production Ready Search Pipelines with Spark and Milvus
Building Production Ready Search Pipelines with Spark and MilvusBuilding Production Ready Search Pipelines with Spark and Milvus
Building Production Ready Search Pipelines with Spark and Milvus
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
 
5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides5th LF Energy Power Grid Model Meet-up Slides
5th LF Energy Power Grid Model Meet-up Slides
 
Generating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and MilvusGenerating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and Milvus
 
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying AheadDigital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying Ahead
 
Skybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoptionSkybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoption
 
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdfHow to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
How to Interpret Trends in the Kalyan Rajdhani Mix Chart.pdf
 
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAUHCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
HCL Notes und Domino Lizenzkostenreduzierung in der Welt von DLAU
 
Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
 
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy SurveyTrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy Survey
 
WeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation TechniquesWeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation Techniques
 
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdfUnlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
 
Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...
Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...
Salesforce Integration for Bonterra Impact Management (fka Social Solutions A...
 
Nordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptxNordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptx
 

Creating a Whatsapp Clone - Part XIII.pdf

  • 1. Creating a WhatsApp Clone - Part XIII
  • 2. @Service public class UserService { @Autowired private UserRepository users; @Autowired private ChatGroupRepository groups; @Autowired private ChatMessageRepository messages; @Autowired private APIKeys keys; @Autowired private PasswordEncoder encoder; @Autowired private MediaRepository medias; e UserService
  • 3. @Service public class UserService { @Autowired private UserRepository users; @Autowired private ChatGroupRepository groups; @Autowired private ChatMessageRepository messages; @Autowired private APIKeys keys; @Autowired private PasswordEncoder encoder; @Autowired private MediaRepository medias; e UserService
  • 4. @Service public class UserService { @Autowired private UserRepository users; @Autowired private ChatGroupRepository groups; @Autowired private ChatMessageRepository messages; @Autowired private APIKeys keys; @Autowired private PasswordEncoder encoder; @Autowired private MediaRepository medias; e UserService
  • 5. @Service public class UserService { @Autowired private UserRepository users; @Autowired private ChatGroupRepository groups; @Autowired private ChatMessageRepository messages; @Autowired private APIKeys keys; @Autowired private PasswordEncoder encoder; @Autowired private MediaRepository medias; e UserService
  • 6. @Autowired private ChatGroupRepository groups; @Autowired private ChatMessageRepository messages; @Autowired private APIKeys keys; @Autowired private PasswordEncoder encoder; @Autowired private MediaRepository medias; @Autowired private NotificationService notifications; private void sendActivationSMS(String number, String text) { Twilio.init(keys.get("twilio.sid"), keys.get("twilio.auth")); e UserService
  • 7. private PasswordEncoder encoder; @Autowired private MediaRepository medias; @Autowired private NotificationService notifications; private void sendActivationSMS(String number, String text) { Twilio.init(keys.get("twilio.sid"), keys.get("twilio.auth")); Message message = Message .creator(new PhoneNumber(number), new PhoneNumber(keys.get("twilio.phone")), text) .create(); message.getSid(); } public UserDAO login(String phone, String auth) throws LoginException { List<User> userList; userList = users.findByPhone(phone); e UserService
  • 8. new PhoneNumber(keys.get("twilio.phone")), text) .create(); message.getSid(); } public UserDAO login(String phone, String auth) throws LoginException { List<User> userList; userList = users.findByPhone(phone); if (userList != null && userList.size() == 1) { User u = userList.get(0); if (encoder.matches(auth, u.getAuthtoken())) { return u.getLoginDAO(); } throw new LoginException("Authentication error!"); } throw new LoginException("User not found!"); } private String createVerificationCode(int length) { StringBuilder k = new StringBuilder(); e UserService
  • 9. new PhoneNumber(keys.get("twilio.phone")), text) .create(); message.getSid(); } public UserDAO login(String phone, String auth) throws LoginException { List<User> userList; userList = users.findByPhone(phone); if (userList != null && userList.size() == 1) { User u = userList.get(0); if (encoder.matches(auth, u.getAuthtoken())) { return u.getLoginDAO(); } throw new LoginException("Authentication error!"); } throw new LoginException("User not found!"); } private String createVerificationCode(int length) { StringBuilder k = new StringBuilder(); e UserService
  • 10. new PhoneNumber(keys.get("twilio.phone")), text) .create(); message.getSid(); } public UserDAO login(String phone, String auth) throws LoginException { List<User> userList; userList = users.findByPhone(phone); if (userList != null && userList.size() == 1) { User u = userList.get(0); if (encoder.matches(auth, u.getAuthtoken())) { return u.getLoginDAO(); } throw new LoginException("Authentication error!"); } throw new LoginException("User not found!"); } private String createVerificationCode(int length) { StringBuilder k = new StringBuilder(); e UserService
  • 11. if (encoder.matches(auth, u.getAuthtoken())) { return u.getLoginDAO(); } throw new LoginException("Authentication error!"); } throw new LoginException("User not found!"); } private String createVerificationCode(int length) { StringBuilder k = new StringBuilder(); Random r = new Random(); for (int iter = 0; iter < length; iter++) { k.append(r.nextInt(10)); } return k.toString(); } public UserDAO signup(UserDAO user) throws SignupException { List<User> ul = users.findByPhone(user.getPhone()); if (ul != null && ul.size() > 0) { throw new SignupException( e UserService
  • 12. } public UserDAO signup(UserDAO user) throws SignupException { List<User> ul = users.findByPhone(user.getPhone()); if (ul != null && ul.size() > 0) { throw new SignupException( "The phone number is already registered!"); } User u = new User(); setProps(user, u); u.setAuthtoken(UUID.randomUUID().toString()); u.setVerificationCode(createVerificationCode(4)); users.save(u); sendActivationSMS(user.getPhone(), "Activation key: " + u. getVerificationCode()); return u.getLoginDAO(); } e UserService
  • 13. } public UserDAO signup(UserDAO user) throws SignupException { List<User> ul = users.findByPhone(user.getPhone()); if (ul != null && ul.size() > 0) { throw new SignupException( "The phone number is already registered!"); } User u = new User(); setProps(user, u); u.setAuthtoken(UUID.randomUUID().toString()); u.setVerificationCode(createVerificationCode(4)); users.save(u); sendActivationSMS(user.getPhone(), "Activation key: " + u. getVerificationCode()); return u.getLoginDAO(); } e UserService
  • 14. } public UserDAO signup(UserDAO user) throws SignupException { List<User> ul = users.findByPhone(user.getPhone()); if (ul != null && ul.size() > 0) { throw new SignupException( "The phone number is already registered!"); } User u = new User(); setProps(user, u); u.setAuthtoken(UUID.randomUUID().toString()); u.setVerificationCode(createVerificationCode(4)); users.save(u); sendActivationSMS(user.getPhone(), "Activation key: " + u. getVerificationCode()); return u.getLoginDAO(); } e UserService
  • 15. } public UserDAO signup(UserDAO user) throws SignupException { List<User> ul = users.findByPhone(user.getPhone()); if (ul != null && ul.size() > 0) { throw new SignupException( "The phone number is already registered!"); } User u = new User(); setProps(user, u); u.setAuthtoken(UUID.randomUUID().toString()); u.setVerificationCode(createVerificationCode(4)); users.save(u); sendActivationSMS(user.getPhone(), "Activation key: " + u. getVerificationCode()); return u.getLoginDAO(); } e UserService
  • 16. sendActivationSMS(user.getPhone(), "Activation key: " + u. getVerificationCode()); return u.getLoginDAO(); } public boolean verifyPhone(String userId, String code) { User u = users.findById(userId).get(); if (u.getVerificationCode().equals(code)) { u.setVerificationCode(null); u.setVerified(true); users.save(u); return true; } return false; } private void setProps(UserDAO user, User u) { u.setName(user.getName()); u.setTagline(user.getTagline()); } e UserService
  • 17. sendActivationSMS(user.getPhone(), "Activation key: " + u. getVerificationCode()); return u.getLoginDAO(); } public boolean verifyPhone(String userId, String code) { User u = users.findById(userId).get(); if (u.getVerificationCode().equals(code)) { u.setVerificationCode(null); u.setVerified(true); users.save(u); return true; } return false; } private void setProps(UserDAO user, User u) { u.setName(user.getName()); u.setTagline(user.getTagline()); } e UserService
  • 18. private void setProps(UserDAO user, User u) { u.setName(user.getName()); u.setTagline(user.getTagline()); } public void update(String auth, UserDAO user) { User u = users.findById(user.getId()).get(); if (encoder.matches(auth, u.getAuthtoken())) { setProps(user, u); users.save(u); } } public byte[] getAvatar(String userId) { User u = users.findById(userId).get(); if (u.getAvatar() != null) { return u.getAvatar().getData(); } return null; } e UserService
  • 19. users.save(u); } } public byte[] getAvatar(String userId) { User u = users.findById(userId).get(); if (u.getAvatar() != null) { return u.getAvatar().getData(); } return null; } public void setAvatar(String auth, String userId, String mediaId) { Media m = medias.findById(mediaId).get(); User u = users.findById(userId).get(); if (encoder.matches(auth, u.getAuthtoken())) { u.setAvatar(m); users.save(u); } } public void userTyping(String userId, String toUser, boolean t) { e UserService
  • 20. User u = users.findById(userId).get(); if (encoder.matches(auth, u.getAuthtoken())) { u.setAvatar(m); users.save(u); } } public void userTyping(String userId, String toUser, boolean t) { Optional<User> to = users.findById(toUser); if(to.isPresent()) { AppSocket.sendUserTyping(to.get().getAuthtoken(), userId, t); } else { ChatGroup g = groups.findById(toUser).get(); for(User u : g.getMembers()) { AppSocket.sendUserTyping(u.getAuthtoken(), userId, t); } } } public MessageDAO sendMessage(MessageDAO m) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById(m.getAuthorId()).get()); e UserService
  • 21. User u = users.findById(userId).get(); if (encoder.matches(auth, u.getAuthtoken())) { u.setAvatar(m); users.save(u); } } public void userTyping(String userId, String toUser, boolean t) { Optional<User> to = users.findById(toUser); if(to.isPresent()) { AppSocket.sendUserTyping(to.get().getAuthtoken(), userId, t); } else { ChatGroup g = groups.findById(toUser).get(); for(User u : g.getMembers()) { AppSocket.sendUserTyping(u.getAuthtoken(), userId, t); } } } public MessageDAO sendMessage(MessageDAO m) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById(m.getAuthorId()).get()); e UserService
  • 22. User u = users.findById(userId).get(); if (encoder.matches(auth, u.getAuthtoken())) { u.setAvatar(m); users.save(u); } } public void userTyping(String userId, String toUser, boolean t) { Optional<User> to = users.findById(toUser); if(to.isPresent()) { AppSocket.sendUserTyping(to.get().getAuthtoken(), userId, t); } else { ChatGroup g = groups.findById(toUser).get(); for(User u : g.getMembers()) { AppSocket.sendUserTyping(u.getAuthtoken(), userId, t); } } } public MessageDAO sendMessage(MessageDAO m) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById(m.getAuthorId()).get()); e UserService
  • 23. User u = users.findById(userId).get(); if (encoder.matches(auth, u.getAuthtoken())) { u.setAvatar(m); users.save(u); } } public void userTyping(String userId, String toUser, boolean t) { Optional<User> to = users.findById(toUser); if(to.isPresent()) { AppSocket.sendUserTyping(to.get().getAuthtoken(), userId, t); } else { ChatGroup g = groups.findById(toUser).get(); for(User u : g.getMembers()) { AppSocket.sendUserTyping(u.getAuthtoken(), userId, t); } } } public MessageDAO sendMessage(MessageDAO m) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById(m.getAuthorId()).get()); e UserService
  • 24. } } public MessageDAO sendMessage(MessageDAO m) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById(m.getAuthorId()).get()); cm.setBody(m.getBody()); cm.setMessageTime(new Date()); Optional<User> to = users.findById(m.getSentTo()); if(to.isPresent()) { cm.setSentTo(to.get()); String json = createMessageImpl(m.getSentTo(), cm); User usr = to.get(); sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json, m.getBody()); } else { ChatGroup g = groups.findById(m.getSentTo()).get(); cm.setSentToGroup(g); String json = createMessageImpl(m.getSentTo(), cm); for(User u : g.getMembers()) { sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json, e UserService
  • 25. } } public MessageDAO sendMessage(MessageDAO m) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById(m.getAuthorId()).get()); cm.setBody(m.getBody()); cm.setMessageTime(new Date()); Optional<User> to = users.findById(m.getSentTo()); if(to.isPresent()) { cm.setSentTo(to.get()); String json = createMessageImpl(m.getSentTo(), cm); User usr = to.get(); sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json, m.getBody()); } else { ChatGroup g = groups.findById(m.getSentTo()).get(); cm.setSentToGroup(g); String json = createMessageImpl(m.getSentTo(), cm); for(User u : g.getMembers()) { sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json, e UserService
  • 26. } } public MessageDAO sendMessage(MessageDAO m) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById(m.getAuthorId()).get()); cm.setBody(m.getBody()); cm.setMessageTime(new Date()); Optional<User> to = users.findById(m.getSentTo()); if(to.isPresent()) { cm.setSentTo(to.get()); String json = createMessageImpl(m.getSentTo(), cm); User usr = to.get(); sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json, m.getBody()); } else { ChatGroup g = groups.findById(m.getSentTo()).get(); cm.setSentToGroup(g); String json = createMessageImpl(m.getSentTo(), cm); for(User u : g.getMembers()) { sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json, e UserService
  • 27. public MessageDAO sendMessage(MessageDAO m) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById(m.getAuthorId()).get()); cm.setBody(m.getBody()); cm.setMessageTime(new Date()); Optional<User> to = users.findById(m.getSentTo()); if(to.isPresent()) { cm.setSentTo(to.get()); String json = createMessageImpl(m.getSentTo(), cm); User usr = to.get(); sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json, m.getBody()); } else { ChatGroup g = groups.findById(m.getSentTo()).get(); cm.setSentToGroup(g); String json = createMessageImpl(m.getSentTo(), cm); for(User u : g.getMembers()) { sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json, m.getBody()); } } return cm.getDAO(); } e UserService
  • 28. public MessageDAO sendMessage(MessageDAO m) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById(m.getAuthorId()).get()); cm.setBody(m.getBody()); cm.setMessageTime(new Date()); Optional<User> to = users.findById(m.getSentTo()); if(to.isPresent()) { cm.setSentTo(to.get()); String json = createMessageImpl(m.getSentTo(), cm); User usr = to.get(); sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json, m.getBody()); } else { ChatGroup g = groups.findById(m.getSentTo()).get(); cm.setSentToGroup(g); String json = createMessageImpl(m.getSentTo(), cm); for(User u : g.getMembers()) { sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json, m.getBody()); } } return cm.getDAO(); } e UserService
  • 29. public MessageDAO sendMessage(MessageDAO m) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById(m.getAuthorId()).get()); cm.setBody(m.getBody()); cm.setMessageTime(new Date()); Optional<User> to = users.findById(m.getSentTo()); if(to.isPresent()) { cm.setSentTo(to.get()); String json = createMessageImpl(m.getSentTo(), cm); User usr = to.get(); sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json, m.getBody()); } else { ChatGroup g = groups.findById(m.getSentTo()).get(); cm.setSentToGroup(g); String json = createMessageImpl(m.getSentTo(), cm); for(User u : g.getMembers()) { sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json, m.getBody()); } } return cm.getDAO(); } e UserService
  • 30. for(User u : g.getMembers()) { sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json, m.getBody()); } } return cm.getDAO(); } private void sendMessageImpl(String authToken, String pushKey, String json, String message) { if(!AppSocket.sendMessage(authToken, json)) { notifications.sendPushNotification(pushKey, message, 1); } } public void sendMessage(String toUser, Map<String, Object> parsedJSON) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById((String)parsedJSON.get("authorId")). get()); cm.setBody((String)parsedJSON.get("body")); cm.setMessageTime(new Date()); e UserService
  • 31. for(User u : g.getMembers()) { sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json, m.getBody()); } } return cm.getDAO(); } private void sendMessageImpl(String authToken, String pushKey, String json, String message) { if(!AppSocket.sendMessage(authToken, json)) { notifications.sendPushNotification(pushKey, message, 1); } } public void sendMessage(String toUser, Map<String, Object> parsedJSON) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById((String)parsedJSON.get("authorId")). get()); cm.setBody((String)parsedJSON.get("body")); cm.setMessageTime(new Date()); e UserService
  • 32. } } public void sendMessage(String toUser, Map<String, Object> parsedJSON) { ChatMessage cm = new ChatMessage(); cm.setAuthor(users.findById((String)parsedJSON.get("authorId")). get()); cm.setBody((String)parsedJSON.get("body")); cm.setMessageTime(new Date()); Optional<User> to = users.findById(toUser); if(to.isPresent()) { cm.setSentTo(to.get()); String json = createMessageImpl(toUser, cm); User usr = to.get(); sendMessageImpl(usr.getAuthtoken(), usr.getPushKey(), json, cm.getBody()); } else { ChatGroup g = groups.findById(toUser).get(); cm.setSentToGroup(g); String json = createMessageImpl(toUser, cm); for(User u : g.getMembers()) { e UserService
  • 33. String json = createMessageImpl(toUser, cm); for(User u : g.getMembers()) { sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json, cm.getBody()); } } } private String createMessageImpl(String toUser, ChatMessage cm) { cm = messages.save(cm); ObjectMapper objectMapper = new ObjectMapper(); try { String dao = objectMapper.writeValueAsString(cm.getDAO()); return dao; } catch(JsonProcessingException err) { throw new RuntimeException(err); } } public void sendJSONTo(String toUser, String json) { Optional<User> to = users.findById(toUser); if(to.isPresent()) { e UserService
  • 34. String json = createMessageImpl(toUser, cm); for(User u : g.getMembers()) { sendMessageImpl(u.getAuthtoken(), u.getPushKey(), json, cm.getBody()); } } } private String createMessageImpl(String toUser, ChatMessage cm) { cm = messages.save(cm); ObjectMapper objectMapper = new ObjectMapper(); try { String dao = objectMapper.writeValueAsString(cm.getDAO()); return dao; } catch(JsonProcessingException err) { throw new RuntimeException(err); } } public void sendJSONTo(String toUser, String json) { Optional<User> to = users.findById(toUser); if(to.isPresent()) { e UserService
  • 35. return dao; } catch(JsonProcessingException err) { throw new RuntimeException(err); } } public void sendJSONTo(String toUser, String json) { Optional<User> to = users.findById(toUser); if(to.isPresent()) { AppSocket.sendMessage(to.get().getAuthtoken(), json); } else { ChatGroup g = groups.findById(toUser).get(); for(User u : g.getMembers()) { AppSocket.sendMessage(u.getAuthtoken(), json); } } } public UserDAO findRegisteredUser(String phone) { return fromList(users.findByPhone(phone)); } e UserService
  • 36. AppSocket.sendMessage(u.getAuthtoken(), json); } } } public UserDAO findRegisteredUser(String phone) { return fromList(users.findByPhone(phone)); } private UserDAO fromList(List<User> ul) { if(ul.isEmpty()) { return null; } User u = ul.get(0); if(!u.isVerified()) { return null; } return u.getDAO(); } public UserDAO findRegisteredUserById(String id) { return users.findById(id).get().getDAO(); e UserService
  • 37. AppSocket.sendMessage(u.getAuthtoken(), json); } } } public UserDAO findRegisteredUser(String phone) { return fromList(users.findByPhone(phone)); } private UserDAO fromList(List<User> ul) { if(ul.isEmpty()) { return null; } User u = ul.get(0); if(!u.isVerified()) { return null; } return u.getDAO(); } public UserDAO findRegisteredUserById(String id) { return users.findById(id).get().getDAO(); e UserService
  • 38. public UserDAO findRegisteredUserById(String id) { return users.findById(id).get().getDAO(); } public void ackMessage(String id) { ChatMessage m = messages.findById(id).get(); m.setAck(true); messages.save(m); } public void sendUnAckedMessages(String toUser) { List<ChatMessage> mess = messages.findByUnAcked(toUser); for(ChatMessage m : mess) { sendMessage(m.getDAO()); } } public void updatePushKey(String auth, String id, String key) { User u = users.findById(auth).get(); if (encoder.matches(auth, u.getAuthtoken())) { u.setPushKey(key); users.save(u); e UserService
  • 39. public UserDAO findRegisteredUserById(String id) { return users.findById(id).get().getDAO(); } public void ackMessage(String id) { ChatMessage m = messages.findById(id).get(); m.setAck(true); messages.save(m); } public void sendUnAckedMessages(String toUser) { List<ChatMessage> mess = messages.findByUnAcked(toUser); for(ChatMessage m : mess) { sendMessage(m.getDAO()); } } public void updatePushKey(String auth, String id, String key) { User u = users.findById(auth).get(); if (encoder.matches(auth, u.getAuthtoken())) { u.setPushKey(key); users.save(u); e UserService
  • 40. public void ackMessage(String id) { ChatMessage m = messages.findById(id).get(); m.setAck(true); messages.save(m); } public void sendUnAckedMessages(String toUser) { List<ChatMessage> mess = messages.findByUnAcked(toUser); for(ChatMessage m : mess) { sendMessage(m.getDAO()); } } public void updatePushKey(String auth, String id, String key) { User u = users.findById(auth).get(); if (encoder.matches(auth, u.getAuthtoken())) { u.setPushKey(key); users.save(u); } } } e UserService