Search in sources :

Example 1 with Email

use of com.pratilipi.data.type.Email in project pratilipi by Pratilipi.

the class AuditLogProcessApi method _createVoteOnCommentCommentorEmail.

private Email _createVoteOnCommentCommentorEmail(Comment comment, Vote vote) {
    DataAccessor dataAccessor = DataAccessorFactory.getDataAccessor();
    Email email = dataAccessor.getEmail(comment.getUserId(), EmailType.VOTE_COMMENT_REVIEW_COMMENTOR, vote.getId());
    if (email == null) {
        email = dataAccessor.newEmail(comment.getUserId(), EmailType.VOTE_COMMENT_REVIEW_COMMENTOR, vote.getId());
    } else if (email.getState() == EmailState.DEFERRED) {
        email.setState(EmailState.PENDING);
        email.setLastUpdated(new Date());
    } else {
        // Do nothing
        return null;
    }
    return email;
}
Also used : Email(com.pratilipi.data.type.Email) DataAccessor(com.pratilipi.data.DataAccessor) Date(java.util.Date)

Example 2 with Email

use of com.pratilipi.data.type.Email in project pratilipi by Pratilipi.

the class AuditLogProcessApi method _updateEmailTable.

private void _updateEmailTable(List<Email> emailList) throws UnexpectedServerException {
    DataAccessor dataAccessor = DataAccessorFactory.getDataAccessor();
    Set<Long> userIds = new HashSet<>(emailList.size());
    for (Email email : emailList) userIds.add(email.getUserId());
    Map<Long, UserPreferenceRtdb> userPreferenceMap = DataAccessorFactory.getRtdbAccessor().getUserPreferences(userIds);
    Map<Long, User> users = dataAccessor.getUsers(userIds);
    List<Email> emailsToUpdate = new ArrayList<>(emailList.size());
    for (Email email : emailList) {
        UserPreferenceRtdb preference = userPreferenceMap.get(email.getUserId());
        User user = users.get(email.getUserId());
        if (user.getEmail() == null)
            continue;
        if (preference.getEmailFrequency() == EmailFrequency.NEVER)
            continue;
        email.setScheduledDate(preference.getEmailFrequency().getNextSchedule(user.getLastEmailedDate()));
        emailsToUpdate.add(email);
    }
    emailsToUpdate = dataAccessor.createOrUpdateEmailList(emailsToUpdate);
}
Also used : Email(com.pratilipi.data.type.Email) User(com.pratilipi.data.type.User) DataAccessor(com.pratilipi.data.DataAccessor) ArrayList(java.util.ArrayList) UserPreferenceRtdb(com.pratilipi.data.type.UserPreferenceRtdb) HashSet(java.util.HashSet)

Example 3 with Email

use of com.pratilipi.data.type.Email in project pratilipi by Pratilipi.

the class AuditLogProcessApi method get.

@Get
public GenericResponse get(GenericRequest request) throws UnexpectedServerException {
    DataAccessor dataAccessor = DataAccessorFactory.getDataAccessor();
    // Fetching AppProperty
    String appPropertyId = "Api.AuditLogProcess";
    AppProperty appProperty = dataAccessor.getAppProperty(appPropertyId);
    if (appProperty == null)
        appProperty = dataAccessor.newAppProperty(appPropertyId);
    // Fetching list of audit logs
    DataListCursorTuple<AuditLog> auditLogDataListCursorTuple = dataAccessor.getAuditLogList(// Tuesday, 1 August 2017 00:00:00 GMT+05:30
    new Date(1501525800000L), (String) appProperty.getValue(), 5000);
    // Make sets of PrimaryContent ids
    Map<Long, Set<Long>> pratilipiUpdateIds = new HashMap<>();
    Set<String> userPratilipiUpdateIds = new HashSet<>();
    Set<String> userAuthorUpdateIds = new HashSet<>();
    Map<String, UserAuthor> userAuthors = new HashMap<>();
    Set<Long> commentUpdateIds = new HashSet<>();
    Set<String> voteUpdateIds = new HashSet<>();
    Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new GsonLongDateAdapter()).create();
    for (AuditLog auditLog : auditLogDataListCursorTuple.getDataList()) {
        // TODO: Delete following condition as soon as 'legacy' module is removed
        if (auditLog.getUserId() == null || auditLog.getPrimaryContentId() == null) {
            continue;
        }
        if (auditLog.getUserId().equals(SystemProperty.SYSTEM_USER_ID)) {
            continue;
        }
        if (auditLog.getAccessType() == AccessType.PRATILIPI_UPDATE) {
            Pratilipi oldPratilipi = gson.fromJson(auditLog.getEventDataOld(), PratilipiEntity.class);
            Pratilipi newPratilipi = gson.fromJson(auditLog.getEventDataNew(), PratilipiEntity.class);
            if (oldPratilipi.getState() == PratilipiState.DRAFTED && newPratilipi.getState() == PratilipiState.PUBLISHED) {
                Set<Long> userIdSet = pratilipiUpdateIds.get(auditLog.getPrimaryContentIdLong());
                if (userIdSet == null) {
                    userIdSet = new HashSet<>();
                    pratilipiUpdateIds.put(auditLog.getPrimaryContentIdLong(), userIdSet);
                }
                userIdSet.add(auditLog.getUserId());
            }
        } else if (auditLog.getAccessType() == AccessType.USER_PRATILIPI_REVIEW) {
            UserPratilipi oldUserPratilipi = gson.fromJson(auditLog.getEventDataOld(), UserPratilipiEntity.class);
            UserPratilipi newUserPratilipi = gson.fromJson(auditLog.getEventDataNew(), UserPratilipiEntity.class);
            if (oldUserPratilipi.getRating() == null && oldUserPratilipi.getReview() == null && (newUserPratilipi.getRating() != null || newUserPratilipi.getReview() != null))
                userPratilipiUpdateIds.add(auditLog.getPrimaryContentId());
        } else if (auditLog.getAccessType() == AccessType.USER_AUTHOR_FOLLOWING) {
            UserAuthor oldUserAuthor = gson.fromJson(auditLog.getEventDataOld(), UserAuthorEntity.class);
            UserAuthor newUserAuthor = gson.fromJson(auditLog.getEventDataNew(), UserAuthorEntity.class);
            if (oldUserAuthor.getFollowState() == null && newUserAuthor.getFollowState() == UserFollowState.FOLLOWING) {
                userAuthorUpdateIds.add(auditLog.getPrimaryContentId());
                userAuthors.put(auditLog.getPrimaryContentId(), newUserAuthor);
            }
        } else if (auditLog.getAccessType() == AccessType.COMMENT_ADD) {
            commentUpdateIds.add(auditLog.getPrimaryContentIdLong());
        } else if (auditLog.getAccessType() == AccessType.VOTE) {
            Vote newVote = gson.fromJson(auditLog.getEventDataNew(), VoteEntity.class);
            if (newVote.getType() == VoteType.LIKE)
                voteUpdateIds.add(auditLog.getPrimaryContentId());
        }
    }
    // Batch get Vote entities
    logger.log(Level.INFO, "Fetching " + voteUpdateIds.size() + " Vote Entities.");
    Map<String, Vote> votes = dataAccessor.getVotes(voteUpdateIds);
    // Batch get Comment and entities
    Set<Long> commentIds = new HashSet<>(commentUpdateIds);
    for (Vote vote : votes.values()) if (vote.getParentType() == VoteParentType.COMMENT)
        commentIds.add(vote.getParentIdLong());
    logger.log(Level.INFO, "Fetching " + commentIds.size() + " Comment Entities.");
    Map<Long, Comment> comments = dataAccessor.getComments(commentIds);
    // Batch get UserPratilipi entities
    Set<String> userPratilipiIds = new HashSet<>(userPratilipiUpdateIds);
    for (Comment comment : comments.values()) if (comment.getParentType() == CommentParentType.REVIEW)
        userPratilipiIds.add(comment.getParentId());
    for (Vote vote : votes.values()) if (vote.getParentType() == VoteParentType.REVIEW)
        userPratilipiIds.add(vote.getParentId());
    logger.log(Level.INFO, "Fetching " + userPratilipiIds.size() + " UserPratilipi Entities.");
    Map<String, UserPratilipi> userPratilipis = dataAccessor.getUserPratilipis(userPratilipiIds);
    // Batch get Pratilipi entities
    Set<Long> pratilipiIds = new HashSet<>(pratilipiUpdateIds.keySet());
    for (UserPratilipi userPratilipi : userPratilipis.values()) pratilipiIds.add(userPratilipi.getPratilipiId());
    logger.log(Level.INFO, "Fetching " + pratilipiIds.size() + " Pratilipi Entities.");
    Map<Long, Pratilipi> pratilipis = dataAccessor.getPratilipis(pratilipiIds);
    // Batch get UserAuthor entities
    logger.log(Level.INFO, "Fetching " + userAuthorUpdateIds.size() + " UserAuthor Entities.");
    // Batch get Author entities
    Set<Long> authorIds = new HashSet<>();
    for (Pratilipi pratilipi : pratilipis.values()) authorIds.add(pratilipi.getAuthorId());
    for (UserAuthor userAuthor : userAuthors.values()) authorIds.add(userAuthor.getAuthorId());
    logger.log(Level.INFO, "Fetching " + authorIds.size() + " Author Entities.");
    Map<Long, Author> authors = dataAccessor.getAuthors(authorIds);
    List<Email> totalEmailList = new ArrayList<>();
    // Get userIds of followers for authors who had published
    List<Long> pratilipiUpdateAuthorIds = new ArrayList<>();
    for (Long pratilipiId : pratilipiUpdateIds.keySet()) pratilipiUpdateAuthorIds.add(pratilipis.get(pratilipiId).getAuthorId());
    Map<Long, List<Long>> authorsFollowersMap = _getUserAuthorFollowList(pratilipiUpdateAuthorIds);
    // auditLog.getAccessType() == AccessType.PRATILIPI_UPDATE
    for (Long pratilipiId : pratilipiUpdateIds.keySet()) {
        Pratilipi pratilipi = pratilipis.get(pratilipiId);
        Set<Long> followerUserIdList = new HashSet<>(authorsFollowersMap.get(pratilipi.getAuthorId()));
        Email email = _createPratilipiPublishedEmail(pratilipi, authors.get(pratilipi.getAuthorId()));
        if (email != null)
            totalEmailList.add(email);
        totalEmailList.addAll(_createPratilipiPublishedEmails(pratilipi, followerUserIdList));
        // Send notification to all AEEs as well
        // only if the content is self-published
        List<Long> aeeUserIdList = _getAeeUserIdList(pratilipi.getLanguage());
        Set<Long> userIdSet = pratilipiUpdateIds.get(pratilipiId);
        for (Long userId : userIdSet) {
            if (!aeeUserIdList.contains(userId)) {
                followerUserIdList.addAll(aeeUserIdList);
                break;
            }
        }
        _createPratilipiPublishedNotification(pratilipi, authors.get(pratilipi.getAuthorId()));
        _createPratilipiPublishedNotifications(pratilipi, followerUserIdList);
    }
    // auditLog.getAccessType() == AccessType.USER_PRATILIPI_REVIEW
    for (String userPratilipiId : userPratilipiUpdateIds) {
        UserPratilipi userPratilipi = userPratilipis.get(userPratilipiId);
        if (userPratilipi.getReviewState() != UserReviewState.PUBLISHED)
            continue;
        Long pratilipiId = userPratilipi.getPratilipiId();
        Email email = _createUserPratilipiReviewEmail(userPratilipi, authors.get(pratilipis.get(pratilipiId).getAuthorId()));
        if (email != null)
            totalEmailList.add(email);
    }
    // auditLog.getAccessType() == AccessType.USER_AUTHOR_FOLLOWING
    for (String userAuthorId : userAuthorUpdateIds) {
        UserAuthor userAuthor = userAuthors.get(userAuthorId);
        _createUserAuthorFollowingNotifications(userAuthor, authors.get(userAuthor.getAuthorId()));
        Email email = _createUserAuthorFollowingEmail(userAuthor, authors.get(userAuthor.getAuthorId()));
        if (email != null)
            totalEmailList.add(email);
    }
    // auditLog.getAccessType() == AccessType.COMMENT_ADD
    for (Long commentId : commentUpdateIds) {
        Comment comment = comments.get(commentId);
        if (comment.getParentType() != CommentParentType.REVIEW)
            continue;
        UserPratilipi userPratilipi = userPratilipis.get(comment.getParentId());
        Email email = _createCommentAddedReviewerEmail(userPratilipi, comment);
        if (email != null)
            totalEmailList.add(email);
    /*	// Business call - Not to send CommentAddedAuthorEmail.
			Pratilipi pratilipi = pratilipis.get( userPratilipi.getPratilipiId() );
			Author author = authors.get( pratilipi.getAuthorId() );
			email = _createCommentAddedAuthorEmail( author, comment );
			if( email != null )
				totalEmailList.add( email );
			*/
    }
    // auditLog.getAccessType() == AccessType.VOTE
    for (String voteId : voteUpdateIds) {
        Vote vote = votes.get(voteId);
        if (vote.getParentType() == VoteParentType.REVIEW) {
            UserPratilipi userPratilipi = userPratilipis.get(vote.getParentId());
            // To the reviewer
            Email email = _createVoteOnReviewReviewerEmail(userPratilipi, vote);
            if (email != null)
                totalEmailList.add(email);
        } else if (vote.getParentType() == VoteParentType.COMMENT) {
            // To the commentor
            Email email = _createVoteOnCommentCommentorEmail(comments.get(vote.getParentIdLong()), vote);
            if (email != null)
                totalEmailList.add(email);
        }
    }
    _updateEmailTable(totalEmailList);
    // Updating AppProperty.
    if (auditLogDataListCursorTuple.getDataList().size() > 0) {
        appProperty.setValue(auditLogDataListCursorTuple.getCursor());
        appProperty = dataAccessor.createOrUpdateAppProperty(appProperty);
    }
    return new GenericResponse();
}
Also used : Set(java.util.Set) HashSet(java.util.HashSet) Email(com.pratilipi.data.type.Email) HashMap(java.util.HashMap) DataAccessor(com.pratilipi.data.DataAccessor) ArrayList(java.util.ArrayList) AuditLog(com.pratilipi.data.type.AuditLog) UserPratilipi(com.pratilipi.data.type.UserPratilipi) UserAuthor(com.pratilipi.data.type.UserAuthor) List(java.util.List) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) HashSet(java.util.HashSet) Comment(com.pratilipi.data.type.Comment) Vote(com.pratilipi.data.type.Vote) GenericResponse(com.pratilipi.api.shared.GenericResponse) Date(java.util.Date) UserAuthor(com.pratilipi.data.type.UserAuthor) Author(com.pratilipi.data.type.Author) UserPratilipi(com.pratilipi.data.type.UserPratilipi) Pratilipi(com.pratilipi.data.type.Pratilipi) AppProperty(com.pratilipi.data.type.AppProperty) GsonLongDateAdapter(com.pratilipi.common.util.GsonLongDateAdapter) UserPratilipiEntity(com.pratilipi.data.type.gae.UserPratilipiEntity) Get(com.pratilipi.api.annotation.Get)

Example 4 with Email

use of com.pratilipi.data.type.Email in project pratilipi by Pratilipi.

the class AuditLogProcessApi method _createVoteOnReviewReviewerEmail.

/*
	private Email _createCommentAddedAuthorEmail( Author author, Comment comment ) {

		DataAccessor dataAccessor = DataAccessorFactory.getDataAccessor();

		if( author.getUserId() == null )
			return null;
		
		Email email = dataAccessor.getEmail(
				author.getUserId(),
				EmailType.COMMENT_REVIEW_AUTHOR, 
				comment.getId() );

		
		if( email == null ) {
			email = dataAccessor.newEmail(
						author.getUserId(),
						EmailType.COMMENT_REVIEW_AUTHOR, 
						comment.getId() );
		} else if( email.getState() == EmailState.DEFERRED ) {
			email.setState( EmailState.PENDING );
			email.setLastUpdated( new Date() );
		} else {
			return null; // Do nothing
		}


		return email;

	}
	*/
private Email _createVoteOnReviewReviewerEmail(UserPratilipi userPratilipi, Vote vote) {
    DataAccessor dataAccessor = DataAccessorFactory.getDataAccessor();
    Email email = dataAccessor.getEmail(userPratilipi.getUserId(), EmailType.VOTE_REVIEW_REVIEWER, vote.getId());
    if (email == null) {
        email = dataAccessor.newEmail(userPratilipi.getUserId(), EmailType.VOTE_REVIEW_REVIEWER, vote.getId());
    } else if (email.getState() == EmailState.DEFERRED) {
        email.setState(EmailState.PENDING);
        email.setLastUpdated(new Date());
    } else {
        // Do nothing
        return null;
    }
    return email;
}
Also used : Email(com.pratilipi.data.type.Email) DataAccessor(com.pratilipi.data.DataAccessor) Date(java.util.Date)

Example 5 with Email

use of com.pratilipi.data.type.Email in project pratilipi by Pratilipi.

the class AuditLogProcessApi method _createPratilipiPublishedEmails.

private List<Email> _createPratilipiPublishedEmails(Pratilipi pratilipi, Set<Long> followersSet) {
    DataAccessor dataAccessor = DataAccessorFactory.getDataAccessor();
    List<Long> followers = new ArrayList<Long>(followersSet);
    List<Email> existingEmailList = dataAccessor.getEmailList(null, EmailType.PRATILIPI_PUBLISHED_FOLLOWER, pratilipi.getId(), null, null);
    List<Email> emailList = new LinkedList<>();
    for (Email email : existingEmailList) {
        followers.remove(email.getUserId());
        if (email.getState() == EmailState.DEFERRED) {
            // Updating existing email state, if required
            email.setState(EmailState.PENDING);
            email.setLastUpdated(new Date());
            emailList.add(email);
        }
    }
    // Creating new e-mails
    for (Long follower : followers) {
        emailList.add(dataAccessor.newEmail(follower, EmailType.PRATILIPI_PUBLISHED_FOLLOWER, pratilipi.getId()));
    }
    return emailList;
}
Also used : Email(com.pratilipi.data.type.Email) DataAccessor(com.pratilipi.data.DataAccessor) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) Date(java.util.Date)

Aggregations

DataAccessor (com.pratilipi.data.DataAccessor)13 Email (com.pratilipi.data.type.Email)13 Date (java.util.Date)11 ArrayList (java.util.ArrayList)5 HashSet (java.util.HashSet)3 Get (com.pratilipi.api.annotation.Get)2 GenericResponse (com.pratilipi.api.shared.GenericResponse)2 UserData (com.pratilipi.data.client.UserData)2 User (com.pratilipi.data.type.User)2 UserPreferenceRtdb (com.pratilipi.data.type.UserPreferenceRtdb)2 LinkedList (java.util.LinkedList)2 Matcher (java.util.regex.Matcher)2 Pattern (java.util.regex.Pattern)2 GsonLongDateAdapter (com.pratilipi.common.util.GsonLongDateAdapter)1 RtdbAccessor (com.pratilipi.data.RtdbAccessor)1 AppProperty (com.pratilipi.data.type.AppProperty)1 AuditLog (com.pratilipi.data.type.AuditLog)1 Author (com.pratilipi.data.type.Author)1 Comment (com.pratilipi.data.type.Comment)1 Pratilipi (com.pratilipi.data.type.Pratilipi)1