Add APIs for APPM review management

feature/appm-store/pbac
lasanthaDLPDS 6 years ago
parent 8a6411bac6
commit 25d9569952

@ -122,8 +122,6 @@
<groupId>org.codehaus.jackson</groupId> <groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId> <artifactId>jackson-core-asl</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

@ -23,8 +23,8 @@ import io.swagger.annotations.ApiModelProperty;
import java.sql.Timestamp; import java.sql.Timestamp;
@ApiModel(value = "Review", description = "Review represents the user's review for an application release") @ApiModel(value = "ReviewTmp", description = "ReviewTmp represents the user's review for an application release")
public class Review { public class ReviewTmp {
@ApiModelProperty(name = "id", @ApiModelProperty(name = "id",
value = "The Id given to the comment when it store to the App manager") value = "The Id given to the comment when it store to the App manager")
@ -55,9 +55,9 @@ public class Review {
value = "Rating value of the application release") value = "Rating value of the application release")
private int rating; private int rating;
@ApiModelProperty(name = "replyReview", @ApiModelProperty(name = "replyReviewTmp",
value = "Replying review") value = "Replying review")
private Review replyReview; private ReviewTmp replyReviewTmp;
public int getId() { public int getId() {
return id; return id;
@ -115,12 +115,12 @@ public class Review {
this.parentId = parentId; this.parentId = parentId;
} }
public Review getReplyReview() { public ReviewTmp getReplyReviewTmp() {
return replyReview; return replyReviewTmp;
} }
public void setReplyReview(Review replyReview) { public void setReplyReviewTmp(ReviewTmp replyReviewTmp) {
this.replyReview = replyReview; this.replyReviewTmp = replyReviewTmp;
} }
} }

@ -0,0 +1,87 @@
/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.application.mgt.common.dto;
import java.sql.Timestamp;
public class ReviewDTO {
private int id;
private String content;
private String username;
private Timestamp createdAt;
private Timestamp modifiedAt;
private int rating;
private int rootParentId;
private int immediateParentId;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Timestamp getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Timestamp createdAt) {
this.createdAt = createdAt;
}
public Timestamp getModifiedAt() {
return modifiedAt;
}
public void setModifiedAt(Timestamp modifiedAt) {
this.modifiedAt = modifiedAt;
}
public int getRating() {
return rating;
}
public void setRating(int rating) {
this.rating = rating;
}
public int getRootParentId() { return rootParentId; }
public void setRootParentId(int rootParentId) { this.rootParentId = rootParentId; }
public int getImmediateParentId() { return immediateParentId; }
public void setImmediateParentId(int immediateParentId) { this.immediateParentId = immediateParentId; }
}

@ -0,0 +1,106 @@
/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.application.mgt.common.response;
import java.sql.Timestamp;
import java.util.TreeMap;
public class Review {
private int id;
private String content;
private int rootParentId;
private int immediateParentId;
private String username;
private Timestamp createdAt;
private Timestamp modifiedAt;
private int rating;
private TreeMap<Integer, Review> replyComments;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getRootParentId() {
return rootParentId;
}
public void setRootParentId(int rootParentId) {
this.rootParentId = rootParentId;
}
public int getImmediateParentId() {
return immediateParentId;
}
public void setImmediateParentId(int immediateParentId) {
this.immediateParentId = immediateParentId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Timestamp getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Timestamp createdAt) {
this.createdAt = createdAt;
}
public Timestamp getModifiedAt() {
return modifiedAt;
}
public void setModifiedAt(Timestamp modifiedAt) {
this.modifiedAt = modifiedAt;
}
public int getRating() {
return rating;
}
public void setRating(int rating) {
this.rating = rating;
}
public TreeMap<Integer, Review> getReplyComments() {
return replyComments;
}
public void setReplyComments(TreeMap<Integer, Review> replyComments) {
this.replyComments = replyComments;
}
}

@ -18,16 +18,14 @@
*/ */
package org.wso2.carbon.device.application.mgt.common.services; package org.wso2.carbon.device.application.mgt.common.services;
import javassist.NotFoundException;
import org.wso2.carbon.device.application.mgt.common.Rating; import org.wso2.carbon.device.application.mgt.common.Rating;
import org.wso2.carbon.device.application.mgt.common.Review; import org.wso2.carbon.device.application.mgt.common.ReviewTmp;
import org.wso2.carbon.device.application.mgt.common.PaginationRequest; import org.wso2.carbon.device.application.mgt.common.PaginationRequest;
import org.wso2.carbon.device.application.mgt.common.PaginationResult; import org.wso2.carbon.device.application.mgt.common.PaginationResult;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException;
import org.wso2.carbon.device.application.mgt.common.exception.ReviewDoesNotExistException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewDoesNotExistException;
import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException;
import org.wso2.carbon.device.application.mgt.common.wrapper.ReviewWrapper;
/** /**
* ReviewManager is responsible for handling all the add/update/delete/get operations related with * ReviewManager is responsible for handling all the add/update/delete/get operations related with
@ -35,15 +33,16 @@ import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementE
public interface ReviewManager { public interface ReviewManager {
/** /**
* To add a review to an application release * To add a reviewTmp to an application release
* *
* @param review review of the application. * @param reviewWrapper reviewTmp of the application.
* @param uuid uuid of the application release. * @param uuid uuid of the application release.
* @return {@link Review} Review added * @return {@link ReviewTmp} ReviewTmp added
* @throws ReviewManagementException Exceptions of the review management. * @throws ReviewManagementException Exceptions of the reviewTmp management.
*/ */
boolean addReview(Review review, String uuid) boolean addReview(ReviewWrapper reviewWrapper, String uuid) throws ReviewManagementException, ApplicationManagementException;
throws ReviewManagementException, RequestValidatingException, ApplicationManagementException;
boolean addReplyComment(ReviewWrapper reviewWrapper, String uuid, int parentReviewId) throws ReviewManagementException, ApplicationManagementException;
/** /**
* Get all review with pagination * Get all review with pagination
@ -67,24 +66,21 @@ public interface ReviewManager {
throws ReviewManagementException, ReviewDoesNotExistException; throws ReviewManagementException, ReviewDoesNotExistException;
/** /**
* To update a review. * To update a reviewTmp.
* *
* @param review review of the application. * @param reviewId id of the reviewTmp
* @param reviewId id of the review
* @param uuid UUID of the application release * @param uuid UUID of the application release
* @param existingReview Pass existing review when same user adding a review for same application release, * @return {@link ReviewTmp}updated reviewTmp
* otherwise pass null * @throws ReviewManagementException Exceptions of the reviewTmp management
* @return {@link Review}updated review
* @throws ReviewManagementException Exceptions of the review management
*/ */
boolean updateReview(Review review, int reviewId, String uuid, Review existingReview) boolean updateReview(ReviewWrapper updatingReview, int reviewId, String uuid)
throws ReviewManagementException, RequestValidatingException; throws ReviewManagementException, ApplicationManagementException;
/** /**
* To get the overall rating for a application release * To get the overall rating for a application release
* *
* @param appReleaseUuuid UUID of the application release. * @param appReleaseUuuid UUID of the application release.
* @return {@link Review}updated review * @return {@link ReviewTmp}updated review
* @throws ReviewManagementException Exceptions of the review management * @throws ReviewManagementException Exceptions of the review management
*/ */
Rating getRating(String appReleaseUuuid) throws ReviewManagementException; Rating getRating(String appReleaseUuuid) throws ReviewManagementException;

@ -0,0 +1,39 @@
/* Copyright (c) 2019, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
*
* Entgra (Pvt) Ltd. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.wso2.carbon.device.application.mgt.common.wrapper;
public class ReviewWrapper {
private String content;
private int rating;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getRating() {
return rating;
}
public void setRating(int rating) {
this.rating = rating;
}
}

@ -18,8 +18,9 @@
*/ */
package org.wso2.carbon.device.application.mgt.core.dao; package org.wso2.carbon.device.application.mgt.core.dao;
import org.wso2.carbon.device.application.mgt.common.Review; import org.wso2.carbon.device.application.mgt.common.ReviewTmp;
import org.wso2.carbon.device.application.mgt.common.PaginationRequest; import org.wso2.carbon.device.application.mgt.common.PaginationRequest;
import org.wso2.carbon.device.application.mgt.common.dto.ReviewDTO;
import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException;
import org.wso2.carbon.device.application.mgt.core.exception.ReviewManagementDAOException; import org.wso2.carbon.device.application.mgt.core.exception.ReviewManagementDAOException;
@ -34,15 +35,15 @@ import java.util.List;
public interface ReviewDAO { public interface ReviewDAO {
/** /**
* To add a review to an application release. * To add a reviewTmp to an application release.
* *
* @param tenantId tenantId. * @param tenantId tenantId.
* @param review review of the application. * @param reviewDTO reviewTmp of the application.
* @param uuid UUID of the application release * @param appReleaseId UUID of the application release
* @return If review is added successfully, it return true otherwise false * @return If reviewTmp is added successfully, it return true otherwise false
* @throws ReviewManagementDAOException Exceptions of the review management DAO. * @throws ReviewManagementDAOException Exceptions of the reviewTmp management DAO.
*/ */
boolean addReview(Review review, String uuid, int tenantId) throws ReviewManagementDAOException; boolean addReview(ReviewDTO reviewDTO, int appReleaseId, int tenantId) throws ReviewManagementDAOException;
/** /**
* To verify whether user has already commented for the application release or not. * To verify whether user has already commented for the application release or not.
@ -53,19 +54,19 @@ import java.util.List;
* @return If review exists, review returns * @return If review exists, review returns
* @throws ReviewManagementDAOException Exceptions of the review management DAO. * @throws ReviewManagementDAOException Exceptions of the review management DAO.
*/ */
Review haveUerCommented(String uuid, String username, int tenantId) throws ReviewManagementDAOException; boolean haveUerReviewed(int appReleaseId, String username, int tenantId) throws ReviewManagementDAOException;
/** /**
* To update already added comment. * To update already added comment.
* *
* @param review Updating review * @param reviewDTO Updating reviewTmp
* @param reviewId id of the updating review * @param reviewId id of the updating reviewTmp
* @param username review owner * @param username reviewTmp owner
* @param tenantId tenant id * @param tenantId tenant id
* @return row count if updating is succeed otherwise 0 * @return row count if updating is succeed otherwise 0
* @throws ReviewManagementDAOException Exceptions of the review management. * @throws ReviewManagementDAOException Exceptions of the reviewTmp management.
*/ */
int updateReview(Review review, int reviewId, String username, int tenantId) int updateReview(ReviewDTO reviewDTO, int reviewId, int tenantId)
throws ReviewManagementDAOException; throws ReviewManagementDAOException;
@ -73,10 +74,13 @@ import java.util.List;
* To get the comment with id. * To get the comment with id.
* *
* @param reviewId id of the review * @param reviewId id of the review
* @return {@link Review}Review * @return {@link ReviewTmp}ReviewTmp
* @throws ReviewManagementDAOException Exceptions of the review management DAO. * @throws ReviewManagementDAOException Exceptions of the review management DAO.
*/ */
Review getReview(int reviewId) throws ReviewManagementDAOException; ReviewDTO getReview(int reviewId) throws ReviewManagementDAOException;
ReviewDTO getReview(int appReleaseId, int reviewId) throws ReviewManagementDAOException;
/** /**
* To get all reviews * To get all reviews
@ -85,9 +89,9 @@ import java.util.List;
* @param request {@link PaginationRequest}pagination request with offSet and limit * @param request {@link PaginationRequest}pagination request with offSet and limit
* @param tenantId Tenant id * @param tenantId Tenant id
* @return {@link List}List of all reviews for the application release * @return {@link List}List of all reviews for the application release
* @throws ReviewManagementDAOException Review management DAO exception * @throws ReviewManagementDAOException ReviewTmp management DAO exception
**/ **/
List<Review> getAllReviews(String uuid, PaginationRequest request, int tenantId) List<ReviewDTO> getAllReviews(String uuid, PaginationRequest request, int tenantId)
throws ReviewManagementDAOException; throws ReviewManagementDAOException;
/** /**
@ -119,7 +123,7 @@ import java.util.List;
* @param username username of the review owner * @param username username of the review owner
* @param reviewId id of the review * @param reviewId id of the review
* @return If review is successfully deleted return 1, otherwise returns 0. * @return If review is successfully deleted return 1, otherwise returns 0.
* @throws ReviewManagementDAOException Review management DAO exception. * @throws ReviewManagementDAOException ReviewTmp management DAO exception.
*/ */
int deleteReview(String username, int reviewId) throws ReviewManagementDAOException; int deleteReview(String username, int reviewId) throws ReviewManagementDAOException;
@ -137,8 +141,8 @@ import java.util.List;
* To get review count for a specific application release * To get review count for a specific application release
* *
* @param uuid uuid of the application release * @param uuid uuid of the application release
* @return Review count * @return ReviewTmp count
* @throws ReviewManagementDAOException Review management DAO exception * @throws ReviewManagementDAOException ReviewTmp management DAO exception
*/ */
int getReviewCount(String uuid) throws ReviewManagementDAOException; int getReviewCount(String uuid) throws ReviewManagementDAOException;
} }

@ -21,8 +21,9 @@ package org.wso2.carbon.device.application.mgt.core.dao.impl.Review;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.application.mgt.common.Review; import org.wso2.carbon.device.application.mgt.common.ReviewTmp;
import org.wso2.carbon.device.application.mgt.common.PaginationRequest; import org.wso2.carbon.device.application.mgt.common.PaginationRequest;
import org.wso2.carbon.device.application.mgt.common.dto.ReviewDTO;
import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException;
import org.wso2.carbon.device.application.mgt.core.dao.ReviewDAO; import org.wso2.carbon.device.application.mgt.core.dao.ReviewDAO;
@ -49,162 +50,227 @@ public class ReviewDAOImpl extends AbstractDAOImpl implements ReviewDAO {
private String sql; private String sql;
@Override @Override
public boolean addReview(Review review, String uuid, int tenantId) throws ReviewManagementDAOException { public boolean addReview(ReviewDTO reviewDTO, int appReleaseId, int tenantId) throws ReviewManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Request received in DAO Layer to add review for application release. ApplicationDTO UUID: " + uuid); log.debug("Request received in DAO Layer to add review for application release. Application Release UUID: "
} + appReleaseId);
PreparedStatement statement = null; }
ResultSet rs = null; sql = "INSERT INTO AP_APP_REVIEW "
sql = "INSERT INTO AP_APP_REVIEW (TENANT_ID, COMMENT, PARENT_ID, RATING, USERNAME,CREATED_AT, MODIFIED_AT, " + "(TENANT_ID, "
+ "AP_APP_RELEASE_ID, AP_APP_ID) VALUES (?,?,?,?,?,?,?,(SELECT ID FROM AP_APP_RELEASE WHERE UUID= ?)," + "COMMENT, "
+ "(SELECT AP_APP_ID FROM AP_APP_RELEASE WHERE UUID=?));"; + "ROOT_PARENT_ID,"
+ "IMMEDIATE_PARENT_ID, "
+ "RATING, "
+ "USERNAME, "
+ "CREATED_AT, "
+ "MODIFIED_AT, "
+ "AP_APP_RELEASE_ID) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ? )";
try { try {
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
Timestamp timestamp = new Timestamp(calendar.getTime().getTime()); Timestamp timestamp = new Timestamp(calendar.getTime().getTime());
Connection conn = this.getDBConnection(); Connection conn = this.getDBConnection();
statement = conn.prepareStatement(sql, new String[] { "id" }); try (PreparedStatement statement = conn.prepareStatement(sql, new String[] { "id" });) {
statement.setInt(1, tenantId); statement.setInt(1, tenantId);
statement.setString(2, review.getComment()); statement.setString(2, reviewDTO.getContent());
statement.setInt(3, review.getParentId()); statement.setInt(3, reviewDTO.getRootParentId());
statement.setInt(4, review.getRating()); statement.setInt(4, reviewDTO.getImmediateParentId());
statement.setString(5, review.getUsername()); statement.setInt(5, reviewDTO.getRating());
statement.setTimestamp(6, timestamp); statement.setString(6, reviewDTO.getUsername());
statement.setTimestamp(7, timestamp); statement.setTimestamp(7, timestamp);
statement.setString(8,uuid); statement.setTimestamp(8, timestamp);
statement.setString(9,uuid); statement.setInt(9, appReleaseId);
statement.executeUpdate(); statement.executeUpdate();
rs = statement.getGeneratedKeys(); try (ResultSet rs = statement.getGeneratedKeys()) {
return rs.next(); return rs.next();
} }
catch (DBConnectionException e) { }
} catch (DBConnectionException e) {
throw new ReviewManagementDAOException("Error occurred while obtaining the DB connection while " throw new ReviewManagementDAOException("Error occurred while obtaining the DB connection while "
+ "adding review for application UUID: "+ "Tenant Id: " + tenantId, e); + "adding review for application release which has ID: "+ appReleaseId + "Tenant Id: " + tenantId, e);
} catch (SQLException e) { } catch (SQLException e) {
throw new ReviewManagementDAOException("Error occurred while getting application list for the tenant" throw new ReviewManagementDAOException(
+ " " + tenantId + ". While executing " + sql, e); "Error occurred while executing SQL statement to add application review. Application ID: "
} finally { + appReleaseId + " tenant " + tenantId, e);
Util.cleanupResources(statement, rs);
} }
} }
@Override @Override
public Review haveUerCommented(String uuid, String username, int tenantId) throws ReviewManagementDAOException { public boolean haveUerReviewed(int appReleaseId, String username, int tenantId) throws ReviewManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug( log.debug("Request received in DAO Layer to check whether user have already reviewed or not for the "
"Request received in DAO Layer to check whether user have already commented or not for the " + "application release. Commenting user: " + username + " and tenant-id: " + tenantId);
+ "application release. ApplicationDTO UUID: " + uuid + " comment owner: " + username +
" tenant-id " + tenantId);
} }
Connection conn; Connection conn;
PreparedStatement statement = null; sql = "SELECT "
ResultSet rs = null; + "rv.ID "
Review review = null; + "FROM AP_APP_REVIEW rv "
sql = "SELECT ID, COMMENT, CREATED_AT, MODIFIED_AT, USERNAME, PARENT_ID, RATING FROM AP_APP_REVIEW WHERE " + "WHERE "
+ "AP_APP_RELEASE_ID = (SELECT ID FROM AP_APP_RELEASE WHERE UUID=?) AND USERNAME = ? AND TENANT_ID = ?;"; + "rv.AP_APP_RELEASE_ID = ? AND "
+ "rv.USERNAME = ? AND "
+ "rv.TENANT_ID = ?";
try { try {
conn = this.getDBConnection(); conn = this.getDBConnection();
statement = conn.prepareStatement(sql); try (PreparedStatement statement = conn.prepareStatement(sql)) {
statement.setString(1, uuid); statement.setInt(1, appReleaseId);
statement.setString(2, username); statement.setString(2, username);
statement.setInt(3, tenantId); statement.setInt(3, tenantId);
rs = statement.executeQuery(); try (ResultSet rs = statement.executeQuery()) {
if (rs.next()){ return rs.next();
review = new Review();
review.setId(rs.getInt("ID")); }
review.setComment(rs.getString("COMMENT")); }
review.setParentId(rs.getInt("PARENT_ID"));
review.setCreatedAt(rs.getTimestamp("CREATED_AT"));
review.setModifiedAt(rs.getTimestamp("MODIFIED_AT"));
review.setUsername(rs.getString("USERNAME"));
review.setRating(rs.getInt("RATING"));
}
return review;
} catch (SQLException e) { } catch (SQLException e) {
throw new ReviewManagementDAOException("Error occured while accessing the Database when checking whether " throw new ReviewManagementDAOException("Error occured while accessing the Database when checking whether "
+ "user has already commented for the application ro not", e); + "user has already commented for the application ro not", e);
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ReviewManagementDAOException("Error occured while getting the database connection when checking " throw new ReviewManagementDAOException("Error occured while getting the database connection when checking "
+ "whether user has already commented for the application ro not", e); + "whether user has already commented for the application ro not", e);
} finally {
Util.cleanupResources(statement, rs);
} }
} }
@Override @Override
public int updateReview(Review review, int reviewId, String username, int tenantId) public int updateReview(ReviewDTO reviewDTO, int reviewId, int tenantId)
throws ReviewManagementDAOException { throws ReviewManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Request received in DAO Layer to update the comment with ID (" + reviewId + ")"); log.debug("Request received in DAO Layer to update the Review with ID (" + reviewId + ")");
} }
Connection connection; Connection connection;
PreparedStatement statement = null; PreparedStatement statement = null;
ResultSet rs = null; ResultSet rs = null;
sql = "UPDATE AP_APP_REVIEW SET COMMENT=?, RATING=?, MODIFIED_AT=? WHERE ID=? AND USERNAME=? AND TENANT_ID=?;"; sql = "UPDATE "
+ "AP_APP_REVIEW "
+ "SET "
+ "COMMENT = ?, "
+ "RATING = ?, "
+ "MODIFIED_AT = ? "
+ "WHERE ID = ? AND "
+ "TENANT_ID = ?";
try { try {
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
Timestamp timestamp = new Timestamp(calendar.getTime().getTime()); Timestamp timestamp = new Timestamp(calendar.getTime().getTime());
connection = this.getDBConnection(); connection = this.getDBConnection();
statement = connection.prepareStatement(sql); statement = connection.prepareStatement(sql);
statement.setString(1, review.getComment()); statement.setString(1, reviewDTO.getContent());
statement.setInt(2, review.getRating()); statement.setInt(2, reviewDTO.getRating());
statement.setTimestamp(3, timestamp); statement.setTimestamp(3, timestamp);
statement.setInt(4, reviewId); statement.setInt(4, reviewId);
statement.setString(5, username); statement.setInt(5, tenantId);
statement.setInt(6, tenantId);
return statement.executeUpdate(); return statement.executeUpdate();
} catch (SQLException e) { } catch (SQLException e) {
throw new ReviewManagementDAOException("Error occurred while executing review updating query"); throw new ReviewManagementDAOException("Error occurred while executing reviewTmp updating query");
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ReviewManagementDAOException("Error occured while getting the db connection to update review"); throw new ReviewManagementDAOException("Error occured while getting the db connection to update reviewTmp");
} finally { } finally {
Util.cleanupResources(statement, rs); Util.cleanupResources(statement, rs);
} }
} }
@Override @Override
public Review getReview(int reviewId) throws ReviewManagementDAOException { public ReviewDTO getReview(int reviewId) throws ReviewManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Getting review with the review id(" + reviewId + ") from the database"); log.debug("Getting reviewDTO with the review id(" + reviewId + ") from the database");
} }
Connection conn; Connection conn;
PreparedStatement statement = null; PreparedStatement statement = null;
ResultSet rs = null; ResultSet rs = null;
Review review = null;
try { try {
conn = this.getDBConnection(); conn = this.getDBConnection();
sql = "SELECT ID, COMMENT, CREATED_AT, MODIFIED_AT, RATING, USERNAME FROM AP_APP_REVIEW WHERE ID=?;"; sql = "SELECT "
+ "ID, "
+ "COMMENT,"
+ "ROOT_PARENT_ID,"
+ "IMMEDIATE_PARENT_ID, "
+ "CREATED_AT, "
+ "MODIFIED_AT, "
+ "RATING, "
+ "USERNAME "
+ "FROM AP_APP_REVIEW "
+ "WHERE ID = ?";
statement = conn.prepareStatement(sql); statement = conn.prepareStatement(sql);
statement.setInt(1, reviewId); statement.setInt(1, reviewId);
rs = statement.executeQuery(); rs = statement.executeQuery();
if (rs.next()) { if (rs.next()) {
review = new Review(); ReviewDTO reviewDTO = new ReviewDTO();
review.setId(rs.getInt("ID")); reviewDTO.setId(rs.getInt("ID"));
review.setComment(rs.getString("COMMENT")); reviewDTO.setContent(rs.getString("COMMENT"));
review.setCreatedAt(rs.getTimestamp("CREATED_AT")); reviewDTO.setCreatedAt(rs.getTimestamp("CREATED_AT"));
review.setModifiedAt(rs.getTimestamp("MODIFIED_AT")); reviewDTO.setModifiedAt(rs.getTimestamp("MODIFIED_AT"));
review.setRating(rs.getInt("RATING")); reviewDTO.setRating(rs.getInt("RATING"));
review.setUsername(rs.getString("USERNAME")); reviewDTO.setRootParentId(rs.getInt("ROOT_PARENT_ID"));
return review; reviewDTO.setImmediateParentId(rs.getInt("IMMEDIATE_PARENT_ID"));
reviewDTO.setUsername(rs.getString("USERNAME"));
return reviewDTO;
}
return null;
} catch (SQLException e) {
throw new ReviewManagementDAOException(
"SQL Error occurred while retrieving information of the reviewTmp " + reviewId, e);
} catch (DBConnectionException e) {
throw new ReviewManagementDAOException(
"DB Connection Exception occurred while retrieving information of the reviewTmp " + reviewId, e);
} finally {
Util.cleanupResources(statement, rs);
}
} }
@Override
public ReviewDTO getReview(int appReleaseId, int reviewId) throws ReviewManagementDAOException {
if (log.isDebugEnabled()) {
log.debug("Getting reviewDTO with the review id(" + reviewId + ") from the database");
}
Connection conn;
PreparedStatement statement = null;
ResultSet rs = null;
try {
conn = this.getDBConnection();
sql = "SELECT "
+ "ID, "
+ "COMMENT,"
+ "ROOT_PARENT_ID,"
+ "IMMEDIATE_PARENT_ID, "
+ "CREATED_AT, "
+ "MODIFIED_AT, "
+ "RATING, "
+ "USERNAME "
+ "FROM AP_APP_REVIEW "
+ "WHERE ID = ? AND "
+ "AP_APP_RELEASE_ID = ?";
statement = conn.prepareStatement(sql);
statement.setInt(1, reviewId);
statement.setInt(2, appReleaseId);
rs = statement.executeQuery();
if (rs.next()) {
ReviewDTO reviewDTO = new ReviewDTO();
reviewDTO.setId(rs.getInt("ID"));
reviewDTO.setContent(rs.getString("COMMENT"));
reviewDTO.setCreatedAt(rs.getTimestamp("CREATED_AT"));
reviewDTO.setModifiedAt(rs.getTimestamp("MODIFIED_AT"));
reviewDTO.setRating(rs.getInt("RATING"));
reviewDTO.setRootParentId(rs.getInt("ROOT_PARENT_ID"));
reviewDTO.setImmediateParentId(rs.getInt("IMMEDIATE_PARENT_ID"));
reviewDTO.setUsername(rs.getString("USERNAME"));
return reviewDTO;
}
return null;
} catch (SQLException e) { } catch (SQLException e) {
throw new ReviewManagementDAOException( throw new ReviewManagementDAOException(
"SQL Error occurred while retrieving information of the review " + reviewId, e); "SQL Error occurred while retrieving information of the reviewTmp " + reviewId, e);
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ReviewManagementDAOException( throw new ReviewManagementDAOException(
"DB Connection Exception occurred while retrieving information of the review " + reviewId, e); "DB Connection Exception occurred while retrieving information of the reviewTmp " + reviewId, e);
} finally { } finally {
Util.cleanupResources(statement, rs); Util.cleanupResources(statement, rs);
} }
return review;
} }
@Override @Override
public List<Review> getAllReviews(String uuid, PaginationRequest request, int tenantId) public List<ReviewDTO> getAllReviews(String uuid, PaginationRequest request, int tenantId)
throws ReviewManagementDAOException { throws ReviewManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
@ -213,16 +279,25 @@ public class ReviewDAOImpl extends AbstractDAOImpl implements ReviewDAO {
Connection conn; Connection conn;
PreparedStatement statement = null; PreparedStatement statement = null;
ResultSet rs = null; ResultSet rs = null;
List<Review> reviews = new ArrayList<>(); List<ReviewDTO> reviewDTOs = new ArrayList<>();
try { try {
conn = this.getDBConnection(); conn = this.getDBConnection();
sql = "SELECT AP_APP_REVIEW.ID AS ID, AP_APP_REVIEW.COMMENT AS COMMENT, " sql = "SELECT "
+ "AP_APP_REVIEW.CREATED_AT AS CREATED_AT, AP_APP_REVIEW.MODIFIED_AT AS MODIFIED_AT, " + "AP_APP_REVIEW.ID AS ID, "
+ "AP_APP_REVIEW.USERNAME AS USERNAME, AP_APP_REVIEW.PARENT_ID AS PARENT_ID, " + "AP_APP_REVIEW.COMMENT AS COMMENT, "
+ "AP_APP_REVIEW.RATING AS RATING FROM AP_APP_REVIEW, AP_APP_RELEASE WHERE " + "AP_APP_REVIEW.CREATED_AT AS CREATED_AT, "
+ "AP_APP_REVIEW.AP_APP_RELEASE_ID=AP_APP_RELEASE.ID AND AP_APP_RELEASE.UUID =? " + "AP_APP_REVIEW.MODIFIED_AT AS MODIFIED_AT, "
+ "AND AP_APP_REVIEW.TENANT_ID = ? AND " + "AP_APP_REVIEW.USERNAME AS USERNAME, "
+ "AP_APP_REVIEW.TENANT_ID = AP_APP_RELEASE.TENANT_ID LIMIT ? OFFSET ?;"; + "AP_APP_REVIEW.ROOT_PARENT_ID AS ROOT_PARENT_ID, "
+ "AP_APP_REVIEW.IMMEDIATE_PARENT_ID AS IMMEDIATE_PARENT_ID, "
+ "AP_APP_REVIEW.RATING AS RATING "
+ "FROM AP_APP_REVIEW, AP_APP_RELEASE "
+ "WHERE "
+ "AP_APP_REVIEW.AP_APP_RELEASE_ID=AP_APP_RELEASE.ID AND "
+ "AP_APP_RELEASE.UUID = ? AND "
+ "AP_APP_REVIEW.TENANT_ID = ? AND "
+ "AP_APP_REVIEW.TENANT_ID = AP_APP_RELEASE.TENANT_ID "
+ "LIMIT ? OFFSET ?;";
statement = conn.prepareStatement(sql); statement = conn.prepareStatement(sql);
statement.setString(1, uuid); statement.setString(1, uuid);
statement.setInt(2, tenantId); statement.setInt(2, tenantId);
@ -230,25 +305,26 @@ public class ReviewDAOImpl extends AbstractDAOImpl implements ReviewDAO {
statement.setInt(4, request.getOffSet()); statement.setInt(4, request.getOffSet());
rs = statement.executeQuery(); rs = statement.executeQuery();
while (rs.next()) { while (rs.next()) {
Review review = new Review(); ReviewDTO reviewDTO = new ReviewDTO();
review.setId(rs.getInt("ID")); reviewDTO.setId(rs.getInt("ID"));
review.setComment(rs.getString("COMMENT")); reviewDTO.setContent(rs.getString("COMMENT"));
review.setCreatedAt(rs.getTimestamp("CREATED_AT")); reviewDTO.setCreatedAt(rs.getTimestamp("CREATED_AT"));
review.setModifiedAt(rs.getTimestamp("MODIFIED_AT")); reviewDTO.setModifiedAt(rs.getTimestamp("MODIFIED_AT"));
review.setParentId(rs.getInt("PARENT_ID")); reviewDTO.setRootParentId(rs.getInt("ROOT_PARENT_ID"));
review.setUsername(rs.getString("USERNAME")); reviewDTO.setImmediateParentId(rs.getInt("IMMEDIATE_PARENT_ID"));
review.setRating(rs.getInt("RATING")); reviewDTO.setUsername(rs.getString("USERNAME"));
reviews.add(review); reviewDTO.setRating(rs.getInt("RATING"));
reviewDTOs.add(reviewDTO);
} }
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ReviewManagementDAOException( throw new ReviewManagementDAOException(
"Error occurred while obtaining the DB connection when verifying application existence", e); "Error occurred while obtaining the DB connection when verifying application existence", e);
} catch (SQLException e) { } catch (SQLException e) {
throw new ReviewManagementDAOException("DB connection error occurred while getting all reviews", e); throw new ReviewManagementDAOException("DB connection error occurred while getting all reviewTmps", e);
}finally { }finally {
Util.cleanupResources(statement, rs); Util.cleanupResources(statement, rs);
} }
return reviews; return reviewDTOs;
} }
@Override @Override

@ -16,8 +16,6 @@
*/ */
package org.wso2.carbon.device.application.mgt.core.exception; package org.wso2.carbon.device.application.mgt.core.exception;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
/** /**
* Exception thrown during the ApplicationDTO Management DAO operations. * Exception thrown during the ApplicationDTO Management DAO operations.
*/ */

@ -21,7 +21,7 @@ package org.wso2.carbon.device.application.mgt.core.exception;
import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException;
/** /**
* Exception thrown during the Review Management DAO operations. * Exception thrown during the ReviewTmp Management DAO operations.
*/ */
public class ReviewManagementDAOException extends ReviewManagementException { public class ReviewManagementDAOException extends ReviewManagementException {

@ -22,17 +22,25 @@ import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.CarbonConstants; import org.wso2.carbon.CarbonConstants;
import org.wso2.carbon.context.PrivilegedCarbonContext; import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.device.application.mgt.common.Rating; import org.wso2.carbon.device.application.mgt.common.Rating;
import org.wso2.carbon.device.application.mgt.common.Review; import org.wso2.carbon.device.application.mgt.common.ReviewTmp;
import org.wso2.carbon.device.application.mgt.common.PaginationRequest; import org.wso2.carbon.device.application.mgt.common.PaginationRequest;
import org.wso2.carbon.device.application.mgt.common.PaginationResult; import org.wso2.carbon.device.application.mgt.common.PaginationResult;
import org.wso2.carbon.device.application.mgt.common.dto.ApplicationReleaseDTO;
import org.wso2.carbon.device.application.mgt.common.dto.ReviewDTO;
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.ReviewDoesNotExistException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewDoesNotExistException;
import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException;
import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException; import org.wso2.carbon.device.application.mgt.common.exception.DBConnectionException;
import org.wso2.carbon.device.application.mgt.common.exception.TransactionManagementException;
import org.wso2.carbon.device.application.mgt.common.response.Review;
import org.wso2.carbon.device.application.mgt.common.services.*; import org.wso2.carbon.device.application.mgt.common.services.*;
import org.wso2.carbon.device.application.mgt.common.wrapper.ReviewWrapper;
import org.wso2.carbon.device.application.mgt.core.dao.ApplicationReleaseDAO; import org.wso2.carbon.device.application.mgt.core.dao.ApplicationReleaseDAO;
import org.wso2.carbon.device.application.mgt.core.dao.ReviewDAO; import org.wso2.carbon.device.application.mgt.core.dao.ReviewDAO;
import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory; import org.wso2.carbon.device.application.mgt.core.dao.common.ApplicationManagementDAOFactory;
import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException; import org.wso2.carbon.device.application.mgt.core.exception.ApplicationManagementDAOException;
import org.wso2.carbon.device.application.mgt.core.exception.BadRequestException;
import org.wso2.carbon.device.application.mgt.core.exception.ForbiddenException;
import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException; import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException;
import org.wso2.carbon.device.application.mgt.core.exception.ReviewManagementDAOException; import org.wso2.carbon.device.application.mgt.core.exception.ReviewManagementDAOException;
import org.wso2.carbon.device.application.mgt.core.internal.DataHolder; import org.wso2.carbon.device.application.mgt.core.internal.DataHolder;
@ -42,6 +50,7 @@ import org.wso2.carbon.user.api.UserStoreException;
import org.wso2.carbon.utils.multitenancy.MultitenantUtils; import org.wso2.carbon.utils.multitenancy.MultitenantUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.TreeMap; import java.util.TreeMap;
@ -64,34 +73,120 @@ public class ReviewManagerImpl implements ReviewManager {
} }
@Override @Override
public boolean addReview(Review review, String uuid) throws ReviewManagementException, NotFoundException { public boolean addReview(ReviewWrapper reviewWrapper, String uuid)
throws ReviewManagementException, ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
boolean isSuccess = false;
try { if (reviewWrapper == null) {
ConnectionManagerUtil.openDBConnection(); String msg = "Request payload is null. Please verify the request payload.";
if (!this.applicationReleaseDAO.verifyReleaseExistenceByUuid(uuid, tenantId)){ log.error(msg);
throw new NotFoundException("Couldn't find application release for the application UUID: " + uuid); throw new BadRequestException(msg);
} }
Review existingReview = this.reviewDAO.haveUerCommented(uuid, username, tenantId); if (reviewWrapper.getRating() < 0) {
if (existingReview != null && isAuthorizedUser(username, existingReview.getUsername(), tenantId) String msg = "You are trying to add invalid rating value as rating. Therefore please verify the request "
&& review.getRating() > 0 && review.getRating() != existingReview.getRating()) { + "payload.";
Runnable task = () -> calculateRating(review.getRating(), existingReview.getRating(), uuid, tenantId); log.error(msg);
new Thread(task).start(); throw new BadRequestException(msg);
isSuccess = updateReview(review, existingReview.getId(), uuid, existingReview); }
} else if (review.getRating() > 0) { try {
Runnable task = () -> calculateRating(review.getRating(), -12345, uuid, tenantId); ConnectionManagerUtil.beginDBTransaction();
ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId);
if (applicationReleaseDTO == null) {
String msg = "Couldn't find application release for the application UUID: " + uuid;
log.error(msg);
throw new NotFoundException(msg);
}
if (this.reviewDAO.haveUerReviewed(applicationReleaseDTO.getId(), username, tenantId)) {
String msg =
"User " + username + " has already reviewed the application release which has UUID: " + uuid
+ ". Hence you can't add another review for same application release. But you can update "
+ "the review that you have already added for ths application release.";
log.error(msg);
throw new ForbiddenException(msg);
}
Runnable task = () -> calculateRating(reviewWrapper.getRating(), -12345, uuid, tenantId);
new Thread(task).start(); new Thread(task).start();
review.setUsername(username);
isSuccess = this.reviewDAO.addReview(review, uuid, tenantId); ReviewDTO reviewDTO = reviewWrapperToDO(reviewWrapper);
reviewDTO.setUsername(username);
reviewDTO.setRootParentId(-1);
reviewDTO.setImmediateParentId(-1);
if (this.reviewDAO.addReview(reviewDTO, applicationReleaseDTO.getId(), tenantId)) {
ConnectionManagerUtil.commitDBTransaction();
return true;
}
ConnectionManagerUtil.rollbackDBTransaction();
return false;
} catch (DBConnectionException e) {
String msg = "DB Connection error occurs when adding Review for application release with UUID: " + uuid
+ " is failed";
log.error(msg);
throw new ReviewManagementException(msg, e);
} catch (TransactionManagementException e) {
String msg = "DB transaction error occurred when adding review for application release which has "
+ "application UUID: " + uuid;
log.error(msg);
throw new ReviewManagementException(msg, e);
} catch (ApplicationManagementDAOException e) {
String msg = "Error occurred when getting application release data for application release UUID:." + uuid;
log.error(msg);
throw new ReviewManagementException(msg, e);
} catch (ReviewManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Error occurred when getting review data or adding review data for application release which "
+ "has UUID: " + uuid;
log.error(msg);
throw new ReviewManagementException(msg, e);
} finally {
ConnectionManagerUtil.closeDBConnection();
}
}
@Override
public boolean addReplyComment(ReviewWrapper reviewWrapper, String uuid, int parentReviewId)
throws ReviewManagementException, NotFoundException, BadRequestException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
if (reviewWrapper == null) {
String msg = "Request payload is null. Please verify the request payload.";
log.error(msg);
throw new BadRequestException(msg);
} }
return isSuccess; try {
ConnectionManagerUtil.beginDBTransaction();
ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId);
if (applicationReleaseDTO == null) {
String msg = "Couldn't find application release for the application UUID: " + uuid;
log.error(msg);
throw new NotFoundException(msg);
}
ReviewDTO parentReview = this.reviewDAO.getReview(applicationReleaseDTO.getId(), parentReviewId);
if (parentReview == null) {
String msg = "Couldn't find an review which has review ID: " + parentReviewId
+ " for application release which has UUID: " + uuid;
log.error(msg);
throw new BadRequestException(msg);
}
ReviewDTO replyComment = reviewWrapperToDO(reviewWrapper);
replyComment.setUsername(username);
replyComment.setRootParentId(parentReview.getRootParentId());
replyComment.setImmediateParentId(parentReview.getId());
if (this.reviewDAO.addReview(replyComment, applicationReleaseDTO.getId(), tenantId)) {
ConnectionManagerUtil.commitDBTransaction();
return true;
}
return false;
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ReviewManagementException( throw new ReviewManagementException(
"DB Connection error occurs ,Review for application release with UUID: " + uuid + " is failed", e); "DB Connection error occurs ,ReviewTmp for application release with UUID: " + uuid + " is failed",
} catch (UserStoreException e) {
throw new ReviewManagementException("Error occured while verifying user's permission to update the review.",
e); e);
} catch (TransactionManagementException e) {
String msg = "DB transaction error occurred when adding reply comment for comment which has comment id: "
+ parentReviewId;
log.error(msg);
throw new ReviewManagementException(msg, e);
} catch (ApplicationManagementDAOException e) { } catch (ApplicationManagementDAOException e) {
throw new ReviewManagementException( throw new ReviewManagementException(
"Error occured while verifying whether application release is exists or not.", e); "Error occured while verifying whether application release is exists or not.", e);
@ -100,56 +195,87 @@ public class ReviewManagerImpl implements ReviewManager {
} }
} }
private ReviewDTO reviewWrapperToDO(ReviewWrapper reviewWrapper){
ReviewDTO reviewDTO = new ReviewDTO();
reviewDTO.setContent(reviewWrapper.getContent());
reviewDTO.setRating(reviewWrapper.getRating());
return reviewDTO;
}
private List<Review> reviewDTOToReview(List<ReviewDTO> reviewDTOs){
List<Review> reviews = new ArrayList<>();
for (ReviewDTO reviewDTO : reviewDTOs){
Review review = new Review();
review.setId(reviewDTO.getId());
review.setContent(reviewDTO.getContent());
review.setRootParentId(reviewDTO.getRootParentId());
review.setImmediateParentId(reviewDTO.getImmediateParentId());
review.setCreatedAt(reviewDTO.getCreatedAt());
review.setModifiedAt(reviewDTO.getModifiedAt());
review.setReplyComments(new TreeMap<>());
reviews.add(review);
}
return reviews;
}
@Override @Override
public boolean updateReview(Review review, int reviewId, String uuid, Review existingReview) public boolean updateReview(ReviewWrapper updatingReview, int reviewId, String uuid)
throws ReviewManagementException { throws ReviewManagementException, ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
boolean isConnectionOpen = false;
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Review updating request is received for the review id " + reviewId); log.debug("ReviewTmp updating request is received for the reviewTmp id " + reviewId);
} }
try { try {
if (existingReview == null) {
ConnectionManagerUtil.openDBConnection(); ConnectionManagerUtil.openDBConnection();
isConnectionOpen = true; ApplicationReleaseDTO applicationReleaseDTO = this.applicationReleaseDAO.getReleaseByUUID(uuid, tenantId);
existingReview = this.reviewDAO.getReview(reviewId); if (applicationReleaseDTO == null) {
if (existingReview != null && isAuthorizedUser(username, existingReview.getUsername(), tenantId)) { String msg = "Couldn't found an application release for UUID: " + uuid;
if (review.getRating() > 0 && review.getRating() != existingReview.getRating()) { log.error(msg);
Review finalExistingReview = existingReview; throw new NotFoundException(msg);
Runnable task = () -> calculateRating(review.getRating(), finalExistingReview.getRating(), }
uuid, tenantId); ReviewDTO reviewDTO = this.reviewDAO.getReview(applicationReleaseDTO.getId(), reviewId);
new Thread(task).start(); if (reviewDTO == null) {
} String msg =
} else { "Couldn't found a review for application release which has UUID: " + uuid + " and review ID: "
throw new ReviewManagementException( + reviewId;
"Please check the existence of the review, Review-Id: " + reviewId log.error(msg);
+ " or permission of the " + username + " to update the review."); throw new NotFoundException(msg);
} }
if (!username.equals(reviewDTO.getUsername())) {
String msg = "You are trying to update a review which is triggered by " + reviewDTO.getUsername()
+ ". Hence you are not permitted to update the review.";
log.error(msg);
throw new ForbiddenException(msg);
} }
if (review.getComment().isEmpty()) {
review.setComment(existingReview.getComment()); if (reviewDTO.getRootParentId() == -1 && reviewDTO.getImmediateParentId() == -1
} && updatingReview.getRating() > 0 && updatingReview.getRating() != reviewDTO.getRating()) {
if (review.getRating() == 0) { Runnable task = () -> calculateRating(updatingReview.getRating(), reviewDTO.getRating(), uuid,
review.setRating(existingReview.getRating()); tenantId);
new Thread(task).start();
reviewDTO.setRating(updatingReview.getRating());
} }
return this.reviewDAO.updateReview(review, reviewId, username, tenantId) == 1; reviewDTO.setContent(updatingReview.getContent());
return this.reviewDAO.updateReview(reviewDTO, reviewId, tenantId) == 1;
} catch (ReviewManagementDAOException e) { } catch (ReviewManagementDAOException e) {
throw new ReviewManagementException("Error occured while getting review with review id " + reviewId + ".", String msg = "Error occured while getting reviewTmp with reviewTmp id " + reviewId + ".";
e); log.error(msg);
throw new ReviewManagementException(msg, e);
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ReviewManagementException( String msg = "DB Connection error occurs updating reviewTmp with reviewTmp id " + reviewId + ".";
"DB Connection error occurs updating review with review id " + reviewId + ".", e); log.error(msg);
} catch (UserStoreException e) { throw new ReviewManagementException(msg, e);
throw new ReviewManagementException( } catch (ApplicationManagementDAOException e) {
"Error occured while verifying user's permission to update the review. review id: " + reviewId String msg = "Error occured when getting application release data for application release UUID: " + uuid;
+ ".", e); log.error(msg);
throw new ApplicationManagementException(msg, e);
} finally { } finally {
if (isConnectionOpen) {
ConnectionManagerUtil.closeDBConnection(); ConnectionManagerUtil.closeDBConnection();
} }
} }
}
@Override @Override
public PaginationResult getAllReviews(PaginationRequest request, String uuid) public PaginationResult getAllReviews(PaginationRequest request, String uuid)
@ -157,37 +283,44 @@ public class ReviewManagerImpl implements ReviewManager {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
PaginationResult paginationResult = new PaginationResult(); PaginationResult paginationResult = new PaginationResult();
int numOfComments; int numOfComments;
List<Review> reviews; TreeMap<Integer, Review> reviewTree = new TreeMap<>();
TreeMap<Integer, Review> hierarchicalReviewSet = new TreeMap<>();
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Get all reviews of the application release uuid: " + uuid); log.debug("Get all reviewTmps of the application release uuid: " + uuid);
} }
try { try {
ConnectionManagerUtil.openDBConnection(); ConnectionManagerUtil.openDBConnection();
reviews = this.reviewDAO.getAllReviews(uuid, request, tenantId); List<ReviewDTO> reviewDTOs= this.reviewDAO.getAllReviews(uuid, request, tenantId);
List<Review> reviews = reviewDTOToReview(reviewDTOs);
reviews.sort(Comparator.comparing(Review::getId));
for (Review review : reviews) { for (Review review : reviews) {
if (hierarchicalReviewSet.containsKey(review.getParentId())) { if (review.getRootParentId() == -1 && review.getImmediateParentId() == -1) {
Review parentReview = hierarchicalReviewSet.get(review.getParentId()); reviewTree.put(review.getId(), review);
parentReview.setReplyReview(review); } else if (reviewTree.containsKey(review.getRootParentId())) {
hierarchicalReviewSet.replace(review.getParentId(), parentReview); if (review.getRootParentId() == review.getImmediateParentId()) {
reviewTree.get(review.getRootParentId()).getReplyComments().put(review.getId(), review);
} else if (reviewTree.get(review.getRootParentId()).getReplyComments()
.containsKey(review.getImmediateParentId())) {
reviewTree.get(review.getRootParentId()).getReplyComments().get(review.getImmediateParentId())
.getReplyComments().put(review.getId(), review);
} else { } else {
hierarchicalReviewSet.put(review.getId(), review); //todo traverse and find
}
} }
} }
numOfComments = hierarchicalReviewSet.size(); numOfComments = reviewTree.size();
if (numOfComments > 0) { if (numOfComments > 0) {
paginationResult.setData(new ArrayList<>(hierarchicalReviewSet.values())); paginationResult.setData(new ArrayList<>(reviewTree.values()));
paginationResult.setRecordsFiltered(numOfComments); paginationResult.setRecordsFiltered(numOfComments);
paginationResult.setRecordsTotal(numOfComments); paginationResult.setRecordsTotal(numOfComments);
} else { } else {
paginationResult.setData(new ArrayList<Review>()); paginationResult.setData(new ArrayList<ReviewTmp>());
paginationResult.setRecordsFiltered(0); paginationResult.setRecordsFiltered(0);
paginationResult.setRecordsTotal(0); paginationResult.setRecordsTotal(0);
} }
return paginationResult; return paginationResult;
} catch (ReviewManagementDAOException e) { } catch (ReviewManagementDAOException e) {
throw new ReviewManagementException("Error occured while getting all reviews for application uuid: " + uuid, throw new ReviewManagementException("Error occured while getting all reviewTmps for application uuid: " + uuid,
e); e);
} catch (DBConnectionException e) { } catch (DBConnectionException e) {
throw new ReviewManagementException("Error occured while getting the DB connection.", e); throw new ReviewManagementException("Error occured while getting the DB connection.", e);
@ -199,7 +332,7 @@ public class ReviewManagerImpl implements ReviewManager {
@Override @Override
public boolean deleteReview(String uuid, int reviewId) public boolean deleteReview(String uuid, int reviewId)
throws ReviewManagementException, ReviewDoesNotExistException { throws ReviewManagementException, ReviewDoesNotExistException {
Review existingReview; ReviewDTO existingReview;
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
try { try {

@ -120,7 +120,7 @@ public class APIUtil {
} }
/** /**
* To get the Review Manager from the osgi context. * To get the ReviewTmp Manager from the osgi context.
* @return ReviewManager instance in the current osgi context. * @return ReviewManager instance in the current osgi context.
*/ */
public static ReviewManager getReviewManager() { public static ReviewManager getReviewManager() {
@ -131,7 +131,7 @@ public class APIUtil {
reviewManager = reviewManager =
(ReviewManager) ctx.getOSGiService(ReviewManager.class, null); (ReviewManager) ctx.getOSGiService(ReviewManager.class, null);
if (reviewManager == null) { if (reviewManager == null) {
String msg = "Review Manager service has not initialized."; String msg = "ReviewTmp Manager service has not initialized.";
log.error(msg); log.error(msg);
throw new IllegalStateException(msg); throw new IllegalStateException(msg);
} }

@ -63,4 +63,6 @@ public class Constants {
* Directory name of the release artifacts that are saved in the file system. * Directory name of the release artifacts that are saved in the file system.
*/ */
public static final String RELEASE_ARTIFACT = "artifact"; public static final String RELEASE_ARTIFACT = "artifact";
public static final int MAXIMUM_REVIEWS_PER_USER = 10;
} }

@ -157,16 +157,6 @@
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>
<artifactId>org.wso2.carbon.device.application.mgt.core</artifactId> <artifactId>org.wso2.carbon.device.application.mgt.core</artifactId>
<scope>provided</scope> <scope>provided</scope>
<exclusions>
<exclusion>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</exclusion>
<exclusion>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.wso2.carbon.devicemgt</groupId> <groupId>org.wso2.carbon.devicemgt</groupId>

@ -32,7 +32,9 @@ import org.wso2.carbon.apimgt.annotations.api.Scope;
import org.wso2.carbon.apimgt.annotations.api.Scopes; import org.wso2.carbon.apimgt.annotations.api.Scopes;
import org.wso2.carbon.device.application.mgt.common.PaginationResult; import org.wso2.carbon.device.application.mgt.common.PaginationResult;
import org.wso2.carbon.device.application.mgt.common.ErrorResponse; import org.wso2.carbon.device.application.mgt.common.ErrorResponse;
import org.wso2.carbon.device.application.mgt.common.Review; import org.wso2.carbon.device.application.mgt.common.ReviewTmp;
import org.wso2.carbon.device.application.mgt.common.wrapper.ReviewWrapper;
import javax.validation.Valid; import javax.validation.Valid;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
@ -63,19 +65,19 @@ import java.util.List;
} }
), ),
tags = { tags = {
@Tag(name = "review_management", description = "Review Management related APIs") @Tag(name = "review_management", description = "ReviewTmp Management related APIs")
} }
) )
@Scopes( @Scopes(
scopes = { scopes = {
@Scope( @Scope(
name = "Get Review Details", name = "Get ReviewTmp Details",
description = "Get review details", description = "Get review details",
key = "perm:app:review:view", key = "perm:app:review:view",
permissions = {"/app-mgt/store/review/view"} permissions = {"/app-mgt/store/review/view"}
), ),
@Scope( @Scope(
name = "Update a Review", name = "Update a ReviewTmp",
description = "Update a comment", description = "Update a comment",
key = "perm:app:review:update", key = "perm:app:review:update",
permissions = {"/app-mgt/store/review/update"} permissions = {"/app-mgt/store/review/update"}
@ -84,7 +86,7 @@ import java.util.List;
) )
@Path("/review") @Path("/review")
@Api(value = "Review Management", description = "This API carries all review management related operations such as get " @Api(value = "ReviewTmp Management", description = "This API carries all review management related operations such as get "
+ "all the reviews, add review, etc.") + "all the reviews, add review, etc.")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
public interface ReviewManagementAPI { public interface ReviewManagementAPI {
@ -144,12 +146,12 @@ public interface ReviewManagementAPI {
consumes = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
httpMethod = "POST", httpMethod = "POST",
value = "Add a review", value = "Add a reviewTmp",
notes = "This will add a new review", notes = "This will add a new reviewTmp",
tags = "Store Management", tags = "Store Management",
extensions = { extensions = {
@Extension(properties = { @Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:app:review:update") @ExtensionProperty(name = SCOPE, value = "perm:app:reviewTmp:update")
}) })
} }
) )
@ -158,29 +160,79 @@ public interface ReviewManagementAPI {
value = { value = {
@ApiResponse( @ApiResponse(
code = 201, code = 201,
message = "OK. \n Successfully add a review.", message = "OK. \n Successfully add a reviewTmp.",
response = Review.class), response = ReviewTmp.class),
@ApiResponse( @ApiResponse(
code = 400, code = 400,
message = message =
"Bad Request. \n"), "Bad Request. \n"),
@ApiResponse( @ApiResponse(
code = 500, code = 500,
message = "Internal Server Error. \n Error occurred adding a review.", message = "Internal Server Error. \n Error occurred adding a reviewTmp.",
response = ErrorResponse.class) response = ErrorResponse.class)
}) })
Response addReview( Response addReview(
@ApiParam( @ApiParam(
name = "review", name = "reviewTmp",
value = "Review details", value = "ReviewTmp details",
required = true) Review review, required = true) ReviewWrapper reviewWrapper,
@ApiParam( @ApiParam(
name="uuid", name="uuid",
value="uuid of the release version of the application", value="uuid of the release version of the application",
required=true) required=true)
@PathParam("uuid") String uuid); @PathParam("uuid") String uuid);
@POST
@Path("/{uuid}/{parentReviewId}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON,
httpMethod = "POST",
value = "Add a reviewTmp",
notes = "This will add a new reviewTmp",
tags = "Store Management",
extensions = {
@Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:app:reviewTmp:update")
})
}
)
@ApiResponses(
value = {
@ApiResponse(
code = 201,
message = "OK. \n Successfully add a reviewTmp.",
response = ReviewTmp.class),
@ApiResponse(
code = 400,
message =
"Bad Request. \n"),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred adding a reviewTmp.",
response = ErrorResponse.class)
})
Response addReplyComment(
@ApiParam(
name = "reviewTmp",
value = "ReviewTmp details",
required = true) ReviewWrapper reviewWrapper,
@ApiParam(
name="uuid",
value="uuid of the release version of the application",
required=true)
@PathParam("uuid") String uuid,
@ApiParam(
name="parentReviewId",
value="uuid of the release version of the application",
required=true)
@PathParam("parentReviewId") int parentReviewId);
@PUT @PUT
@Path("/{uuid}/{reviewId}") @Path("/{uuid}/{reviewId}")
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
@ -189,12 +241,12 @@ public interface ReviewManagementAPI {
consumes = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON,
httpMethod = "PUT", httpMethod = "PUT",
value = "Edit a review", value = "Edit a reviewTmp",
notes = "This will edit the review", notes = "This will edit the reviewTmp",
tags = "Store Management", tags = "Store Management",
extensions = { extensions = {
@Extension(properties = { @Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:app:review:update") @ExtensionProperty(name = SCOPE, value = "perm:app:reviewTmp:update")
}) })
} }
) )
@ -202,22 +254,22 @@ public interface ReviewManagementAPI {
value = { value = {
@ApiResponse( @ApiResponse(
code = 200, code = 200,
message = "OK. \n Successfully updated review.", message = "OK. \n Successfully updated reviewTmp.",
response = Review.class), response = ReviewTmp.class),
@ApiResponse( @ApiResponse(
code = 400, code = 400,
message = "Bad Request. \n Invalid request or validation error."), message = "Bad Request. \n Invalid request or validation error."),
@ApiResponse( @ApiResponse(
code = 500, code = 500,
message = "Internal Server Error. \n Error occurred while updating the new review.", message = "Internal Server Error. \n Error occurred while updating the new reviewTmp.",
response = ErrorResponse.class) response = ErrorResponse.class)
}) })
Response updateReview( Response updateReview(
@ApiParam( @ApiParam(
name = "review", name = "reviewTmp",
value = "The review that need to be updated.", value = "The reviewTmp that need to be updated.",
required = true) required = true)
@Valid Review review, @Valid ReviewWrapper updatingReview,
@ApiParam( @ApiParam(
name="uuid", name="uuid",
value = "uuid of the application release", value = "uuid of the application release",
@ -225,7 +277,7 @@ public interface ReviewManagementAPI {
@PathParam("uuid") String uuid, @PathParam("uuid") String uuid,
@ApiParam( @ApiParam(
name="reviewId", name="reviewId",
value = "review id of the updating review.", value = "reviewTmp id of the updating reviewTmp.",
required = true) required = true)
@PathParam("reviewId") int reviewId); @PathParam("reviewId") int reviewId);

@ -23,10 +23,10 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.application.mgt.common.PaginationResult; import org.wso2.carbon.device.application.mgt.common.PaginationResult;
import org.wso2.carbon.device.application.mgt.common.Rating; import org.wso2.carbon.device.application.mgt.common.Rating;
import org.wso2.carbon.device.application.mgt.common.Review;
import org.wso2.carbon.device.application.mgt.common.exception.RequestValidatingException;
import org.wso2.carbon.device.application.mgt.common.exception.ReviewDoesNotExistException; import org.wso2.carbon.device.application.mgt.common.exception.ReviewDoesNotExistException;
import org.wso2.carbon.device.application.mgt.common.services.ReviewManager; import org.wso2.carbon.device.application.mgt.common.services.ReviewManager;
import org.wso2.carbon.device.application.mgt.common.wrapper.ReviewWrapper;
import org.wso2.carbon.device.application.mgt.core.exception.ForbiddenException;
import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException; import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException;
import org.wso2.carbon.device.application.mgt.store.api.services.ReviewManagementAPI; import org.wso2.carbon.device.application.mgt.store.api.services.ReviewManagementAPI;
import org.wso2.carbon.device.application.mgt.common.PaginationRequest; import org.wso2.carbon.device.application.mgt.common.PaginationRequest;
@ -46,7 +46,7 @@ import javax.ws.rs.DELETE;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
/** /**
* Review Management related jax-rs APIs. * ReviewTmp Management related jax-rs APIs.
*/ */
@Path("/review") @Path("/review")
public class ReviewManagementAPIImpl implements ReviewManagementAPI { public class ReviewManagementAPIImpl implements ReviewManagementAPI {
@ -77,15 +77,15 @@ public class ReviewManagementAPIImpl implements ReviewManagementAPI {
@Consumes("application/json") @Consumes("application/json")
@Path("/{uuid}") @Path("/{uuid}")
public Response addReview( public Response addReview(
@ApiParam Review review, @ApiParam ReviewWrapper reviewWrapper,
@PathParam("uuid") String uuid) { @PathParam("uuid") String uuid) {
ReviewManager reviewManager = APIUtil.getReviewManager(); ReviewManager reviewManager = APIUtil.getReviewManager();
try { try {
boolean isReviewCreated = reviewManager.addReview(review, uuid); boolean isReviewCreated = reviewManager.addReview(reviewWrapper, uuid);
if (isReviewCreated) { if (isReviewCreated) {
return Response.status(Response.Status.CREATED).entity(review).build(); return Response.status(Response.Status.CREATED).entity(reviewWrapper).build();
} else { } else {
String msg = "Given review is not valid. Please check the review payload."; String msg = "Given reviewTmp is not valid. Please check the reviewTmp payload.";
log.error(msg); log.error(msg);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
} }
@ -94,14 +94,42 @@ public class ReviewManagementAPIImpl implements ReviewManagementAPI {
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.NOT_FOUND).entity(msg).build(); return Response.status(Response.Status.NOT_FOUND).entity(msg).build();
} catch (ReviewManagementException e) { } catch (ReviewManagementException e) {
String msg = "Error occurred while creating the review"; String msg = "Error occurred while creating the reviewTmp";
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (RequestValidatingException e) { } catch (ApplicationManagementException e) {
String msg = String msg = "Error occured while accessing application release for UUID: " + uuid;
"Error occurred while adding for application release. UUID of the application release: " + uuid;
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
}
@Override
@POST
@Consumes("application/json")
@Path("/{uuid}/{parentReviewId}")
public Response addReplyComment(
@ApiParam ReviewWrapper reviewWrapper,
@PathParam("uuid") String uuid,
@PathParam("parentReviewId") int parentReviewId) {
ReviewManager reviewManager = APIUtil.getReviewManager();
try {
boolean isRepliedForReview = reviewManager.addReplyComment(reviewWrapper, uuid, parentReviewId);
if (isRepliedForReview) {
return Response.status(Response.Status.CREATED).entity(reviewWrapper).build();
} else {
String msg = "Given reviewTmp is not valid. Please check the reviewTmp payload.";
log.error(msg);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
}
} catch (NotFoundException e) {
String msg = "Couldn't find an application release for UUID: " + uuid;
log.error(msg, e);
return Response.status(Response.Status.NOT_FOUND).entity(msg).build();
} catch (ReviewManagementException e) {
String msg = "Error occurred while creating the reviewTmp";
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (ApplicationManagementException e) { } catch (ApplicationManagementException e) {
String msg = "Error occured while accessing application release for UUID: " + uuid; String msg = "Error occured while accessing application release for UUID: " + uuid;
log.error(msg, e); log.error(msg, e);
@ -114,13 +142,13 @@ public class ReviewManagementAPIImpl implements ReviewManagementAPI {
@Consumes("application/json") @Consumes("application/json")
@Path("/{uuid}/{reviewId}") @Path("/{uuid}/{reviewId}")
public Response updateReview( public Response updateReview(
@ApiParam Review review, @ApiParam ReviewWrapper updatingReview,
@PathParam("uuid") String uuid, @PathParam("uuid") String uuid,
@PathParam("reviewId") int reviewId) { @PathParam("reviewId") int reviewId) {
ReviewManager reviewManager = APIUtil.getReviewManager(); ReviewManager reviewManager = APIUtil.getReviewManager();
try { try {
if (reviewManager.updateReview(review, reviewId, uuid, null)) { if (reviewManager.updateReview(updatingReview, reviewId, uuid)) {
return Response.status(Response.Status.OK).entity(review).build(); return Response.status(Response.Status.OK).entity(updatingReview).build();
} else { } else {
String msg = "Review updating failed. Please contact the administrator"; String msg = "Review updating failed. Please contact the administrator";
log.error(msg); log.error(msg);
@ -130,11 +158,18 @@ public class ReviewManagementAPIImpl implements ReviewManagementAPI {
String msg = "Error occurred while retrieving comments."; String msg = "Error occurred while retrieving comments.";
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (RequestValidatingException e) { } catch (NotFoundException e) {
String msg = "Error occurred while updating review. Review id: " + reviewId; String msg = "Couldn't found application release data for UUID " + uuid + " or Review for review ID: " + reviewId;
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); return Response.status(Response.Status.NOT_FOUND).entity(msg).build();
} } catch (ForbiddenException e) {
String msg = "You dont have permission to update application release review.";
log.error(msg, e);
return Response.status(Response.Status.FORBIDDEN).entity(msg).build();
} catch (ApplicationManagementException e) {
String msg = "Error occurred when getting application release data for application release UUID:." + uuid;
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); }
} }
@Override @Override
@ -147,9 +182,9 @@ public class ReviewManagementAPIImpl implements ReviewManagementAPI {
ReviewManager reviewManager = APIUtil.getReviewManager(); ReviewManager reviewManager = APIUtil.getReviewManager();
try { try {
if (reviewManager.deleteReview(uuid, reviewId)) { if (reviewManager.deleteReview(uuid, reviewId)) {
return Response.status(Response.Status.OK).entity("Review is deleted successfully.").build(); return Response.status(Response.Status.OK).entity("ReviewTmp is deleted successfully.").build();
} else { } else {
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Review deleting is failed.") return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("ReviewTmp deleting is failed.")
.build(); .build();
} }
} catch (ReviewManagementException e) { } catch (ReviewManagementException e) {
@ -173,7 +208,7 @@ public class ReviewManagementAPIImpl implements ReviewManagementAPI {
try { try {
rating = reviewManager.getRating(uuid); rating = reviewManager.getRating(uuid);
} catch (ReviewManagementException e) { } catch (ReviewManagementException e) {
log.error("Review Management Exception occurs", e); log.error("ReviewTmp Management Exception occurs", e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
} }
return Response.status(Response.Status.OK).entity(rating).build(); return Response.status(Response.Status.OK).entity(rating).build();

@ -17,34 +17,34 @@
*/ */
package org.wso2.carbon.device.application.mgt.store.api.services.util; package org.wso2.carbon.device.application.mgt.store.api.services.util;
import org.wso2.carbon.device.application.mgt.common.Review; import org.wso2.carbon.device.application.mgt.common.ReviewTmp;
/** /**
* Helper class for Review Management API test cases. * Helper class for ReviewTmp Management API test cases.
*/ */
public class CommentMgtTestHelper { public class CommentMgtTestHelper {
private static final String COMMENT_TEXT = "Dummy Review"; private static final String COMMENT_TEXT = "Dummy ReviewTmp";
private static final String CREATED_BY = "TEST_CREATED_BY"; private static final String CREATED_BY = "TEST_CREATED_BY";
private static final String MODIFIED_BY = "TEST_MODIFIED_BY"; private static final String MODIFIED_BY = "TEST_MODIFIED_BY";
private static final int PARENT_ID = 123; private static final int PARENT_ID = 123;
private static final int COMMENT_ID = 1; private static final int COMMENT_ID = 1;
/** /**
* Creates a Review with given text and given uuid. * Creates a ReviewTmp with given text and given uuid.
* If the text is null, the COMMENT_TEXT will be used as the Dummy Review. * If the text is null, the COMMENT_TEXT will be used as the Dummy ReviewTmp.
* *
* @param commentText : Text of the Review * @param commentText : Text of the ReviewTmp
* @return Review * @return ReviewTmp
*/ */
public static Review getDummyComment(String commentText, String uuid) { public static ReviewTmp getDummyComment(String commentText, String uuid) {
Review review = new Review(); ReviewTmp reviewTmp = new ReviewTmp();
review.setId(COMMENT_ID); reviewTmp.setId(COMMENT_ID);
review.setUsername(CREATED_BY); reviewTmp.setUsername(CREATED_BY);
review.setComment(commentText != null ? commentText : COMMENT_TEXT); reviewTmp.setComment(commentText != null ? commentText : COMMENT_TEXT);
return review; return reviewTmp;
} }
} }

@ -55,7 +55,8 @@ CREATE TABLE IF NOT EXISTS AP_APP_REVIEW(
ID INTEGER NOT NULL AUTO_INCREMENT, ID INTEGER NOT NULL AUTO_INCREMENT,
TENANT_ID INTEGER NOT NULL, TENANT_ID INTEGER NOT NULL,
COMMENT VARCHAR(250) NOT NULL, COMMENT VARCHAR(250) NOT NULL,
REPLY_COMMENT VARCHAR(250) NULL, ROOT_PARENT_ID INTEGER NOT NULL,
IMMEDIATE_PARENT_ID INTEGER NOT NULL,
CREATED_AT TIMESTAMP NOT NULL, CREATED_AT TIMESTAMP NOT NULL,
MODIFIED_AT TIMESTAMP NOT NULL, MODIFIED_AT TIMESTAMP NOT NULL,
RATING INTEGER NULL, RATING INTEGER NULL,

Loading…
Cancel
Save