Merge branch 'feature/favourites/app' into 'master'

Add APIs to get favourite apps

See merge request entgra/carbon-device-mgt!866
temp
Dharmakeerthi Lasantha 3 years ago
commit c4091696b8

@ -108,6 +108,11 @@ public class Filter {
*/ */
private String appReleaseState; private String appReleaseState;
/**
* Username of whose favourite apps to be retrieved
*/
private String favouredBy;
public int getLimit() { public int getLimit() {
return limit; return limit;
} }
@ -195,4 +200,12 @@ public class Filter {
public String getAppReleaseType() { return appReleaseType; } public String getAppReleaseType() { return appReleaseType; }
public void setAppReleaseType(String appReleaseType) { this.appReleaseType = appReleaseType; } public void setAppReleaseType(String appReleaseType) { this.appReleaseType = appReleaseType; }
public String getFavouredBy() {
return favouredBy;
}
public void setFavouredBy(String favouredBy) {
this.favouredBy = favouredBy;
}
} }

@ -96,6 +96,10 @@ public class ApplicationDTO {
value = "package name of the application") value = "package name of the application")
private String packageName; private String packageName;
@ApiModelProperty(name = "isFavourite",
value = "if the app is favoured by the user")
private boolean isFavourite;
public String getPackageName() { public String getPackageName() {
return packageName; return packageName;
} }
@ -189,4 +193,12 @@ public class ApplicationDTO {
public double getAppRating() { return appRating; } public double getAppRating() { return appRating; }
public void setAppRating(double appRating) { this.appRating = appRating; } public void setAppRating(double appRating) { this.appRating = appRating; }
public boolean isFavourite() {
return isFavourite;
}
public void setFavourite(boolean favourite) {
isFavourite = favourite;
}
} }

@ -103,6 +103,10 @@ public class Application {
value = "package name of the application") value = "package name of the application")
private String packageName; private String packageName;
@ApiModelProperty(name = "isFavourite",
value = "if the app is favoured by the user")
private boolean isFavourite;
public String getPackageName() { public String getPackageName() {
return packageName; return packageName;
} }
@ -181,4 +185,12 @@ public class Application {
public String getInstallerName() { return installerName; } public String getInstallerName() { return installerName; }
public void setInstallerName(String installerName) { this.installerName = installerName; } public void setInstallerName(String installerName) { this.installerName = installerName; }
public boolean isFavourite() {
return isFavourite;
}
public void setFavourite(boolean favourite) {
isFavourite = favourite;
}
} }

@ -61,6 +61,27 @@ public interface ApplicationManager {
Application createWebClip(WebAppWrapper webAppWrapper, ApplicationArtifact applicationArtifact, boolean isPublished) Application createWebClip(WebAppWrapper webAppWrapper, ApplicationArtifact applicationArtifact, boolean isPublished)
throws ApplicationManagementException; throws ApplicationManagementException;
/**
* Add an application to favourites
* @param appId id of the application
* @throws ApplicationManagementException Catch all other throwing exceptions and throw {@link ApplicationManagementException}
*/
void addAppToFavourites(int appId) throws ApplicationManagementException;
/**
* Remove an application from favourites
* @param appId id of the application
* @throws ApplicationManagementException Catch all other throwing exceptions and throw {@link ApplicationManagementException}
*/
void removeAppFromFavourites(int appId) throws ApplicationManagementException;
/**
* Check if an application is a favourite app
* @param appId id of the application
* @throws ApplicationManagementException Catch all other throwing exceptions and throw {@link ApplicationManagementException}
*/
boolean isFavouriteApp(int appId) throws ApplicationManagementException;
Application createPublicApp(PublicAppWrapper publicAppWrapper, ApplicationArtifact applicationArtifact, boolean isPublished) Application createPublicApp(PublicAppWrapper publicAppWrapper, ApplicationArtifact applicationArtifact, boolean isPublished)
throws ApplicationManagementException; throws ApplicationManagementException;
@ -113,6 +134,8 @@ public interface ApplicationManager {
*/ */
void deleteApplicationRelease(String releaseUuid) throws ApplicationManagementException; void deleteApplicationRelease(String releaseUuid) throws ApplicationManagementException;
ApplicationList getFavouriteApplications(Filter filter) throws ApplicationManagementException;
/** /**
* To get the applications based on the search filter. * To get the applications based on the search filter.
* *

@ -39,6 +39,33 @@ public interface ApplicationDAO {
*/ */
int createApplication(ApplicationDTO applicationDTO, int tenantId) throws ApplicationManagementDAOException; int createApplication(ApplicationDTO applicationDTO, int tenantId) throws ApplicationManagementDAOException;
/**
* Use to add an application to favourites for given appId, username and tenantId
*
* @param appId id of the application
* @param userName currently logged-in user
* @throws ApplicationManagementDAOException if error occurred wile executing query to insert data into database.
*/
void addAppToFavourite(int appId, String userName, int tenantId) throws ApplicationManagementDAOException;
/**
* Use to remove an application from favourites for given appId, username and tenantId
*
* @param appId id of the application
* @param userName currently logged-in username
* @throws ApplicationManagementDAOException if error occurred wile executing query to delete data from database.
*/
void removeAppFromFavourite(int appId, String userName, int tenantId) throws ApplicationManagementDAOException;
/**
* Use to check if an app is favourite for given username and tenantId
* @param appId id of the application
* @param userName currently logged-in username
* @return If application is favourite
* @throws ApplicationManagementDAOException if error occurred wile executing query to check if application is a favourite
*/
boolean isFavouriteApp(int appId, String userName, int tenantId) throws ApplicationManagementDAOException;
/** /**
* To add tags for a particular application. * To add tags for a particular application.
* *

@ -24,7 +24,6 @@ import io.entgra.application.mgt.common.AppLifecycleState;
import io.entgra.application.mgt.common.dto.ApplicationDTO; import io.entgra.application.mgt.common.dto.ApplicationDTO;
import io.entgra.application.mgt.common.dto.CategoryDTO; import io.entgra.application.mgt.common.dto.CategoryDTO;
import io.entgra.application.mgt.common.Filter; import io.entgra.application.mgt.common.Filter;
import io.entgra.application.mgt.common.dto.ReviewDTO;
import io.entgra.application.mgt.common.dto.TagDTO; import io.entgra.application.mgt.common.dto.TagDTO;
import io.entgra.application.mgt.common.exception.DBConnectionException; import io.entgra.application.mgt.common.exception.DBConnectionException;
import io.entgra.application.mgt.core.dao.ApplicationDAO; import io.entgra.application.mgt.core.dao.ApplicationDAO;
@ -136,10 +135,14 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
+ "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, " + "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, "
+ "AP_APP_RELEASE.RATED_USERS AS RATED_USER_COUNT, " + "AP_APP_RELEASE.RATED_USERS AS RATED_USER_COUNT, "
+ "NEW_AP_APP_LIFECYCLE_STATE.UPDATED_AT AS LATEST_UPDATE " + "NEW_AP_APP_LIFECYCLE_STATE.UPDATED_AT AS LATEST_UPDATE "
+ "FROM AP_APP " + "FROM AP_APP ";
+ "INNER JOIN AP_APP_RELEASE ON " if (StringUtils.isNotEmpty(filter.getFavouredBy())) {
+ "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID " sql += "INNER JOIN AP_APP_FAVOURITES ON "
+ "INNER JOIN (SELECT AP_APP.ID FROM AP_APP "; + "AP_APP.ID = AP_APP_FAVOURITES.AP_APP_ID ";
}
sql += "INNER JOIN AP_APP_RELEASE ON "
+ "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID "
+ "INNER JOIN (SELECT AP_APP.ID FROM AP_APP ";
if (StringUtils.isNotEmpty(filter.getVersion()) || StringUtils.isNotEmpty(filter.getAppReleaseState()) if (StringUtils.isNotEmpty(filter.getVersion()) || StringUtils.isNotEmpty(filter.getAppReleaseState())
|| StringUtils.isNotEmpty(filter.getAppReleaseType())) { || StringUtils.isNotEmpty(filter.getAppReleaseType())) {
sql += "INNER JOIN AP_APP_RELEASE ON AP_APP.ID = AP_APP_RELEASE.AP_APP_ID "; sql += "INNER JOIN AP_APP_RELEASE ON AP_APP.ID = AP_APP_RELEASE.AP_APP_ID ";
@ -190,8 +193,11 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
+ "FROM AP_APP_LIFECYCLE_STATE " + "FROM AP_APP_LIFECYCLE_STATE "
+ "GROUP BY AP_APP_LIFECYCLE_STATE.AP_APP_RELEASE_ID)) AS NEW_AP_APP_LIFECYCLE_STATE " + "GROUP BY AP_APP_LIFECYCLE_STATE.AP_APP_RELEASE_ID)) AS NEW_AP_APP_LIFECYCLE_STATE "
+ "ON AP_APP_RELEASE.ID = NEW_AP_APP_LIFECYCLE_STATE.AP_APP_RELEASE_ID " + "ON AP_APP_RELEASE.ID = NEW_AP_APP_LIFECYCLE_STATE.AP_APP_RELEASE_ID "
+ "WHERE AP_APP.TENANT_ID = ? " + "WHERE AP_APP.TENANT_ID = ? ";
+ "ORDER BY AP_APP.ID, LATEST_UPDATE DESC"; if (StringUtils.isNotEmpty(filter.getFavouredBy())) {
sql += "AND AP_APP_FAVOURITES.USER_NAME = ? ";
}
sql += "ORDER BY AP_APP.ID, LATEST_UPDATE DESC";
try { try {
Connection conn = this.getDBConnection(); Connection conn = this.getDBConnection();
@ -230,7 +236,10 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
stmt.setInt(paramIndex++, filter.getLimit()); stmt.setInt(paramIndex++, filter.getLimit());
stmt.setInt(paramIndex++, filter.getOffset()); stmt.setInt(paramIndex++, filter.getOffset());
} }
stmt.setInt(paramIndex, tenantId); stmt.setInt(paramIndex++, tenantId);
if (StringUtils.isNotEmpty(filter.getFavouredBy())) {
stmt.setString(paramIndex, filter.getFavouredBy());
}
try (ResultSet rs = stmt.executeQuery()) { try (ResultSet rs = stmt.executeQuery()) {
return DAOUtil.loadApplications(rs); return DAOUtil.loadApplications(rs);
} }
@ -732,6 +741,95 @@ public class GenericApplicationDAOImpl extends AbstractDAOImpl implements Applic
} }
} }
@Override
public void addAppToFavourite(int appId, String userName, int tenantId) throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) {
log.debug("Request received in DAO Layer to add app with the id " + appId + " favourites");
}
String sql = "INSERT INTO AP_APP_FAVOURITES "
+ "(AP_APP_ID, USER_NAME, "
+ " TENANT_ID) "
+ "VALUES (?, ?, ?)";
try {
Connection conn = this.getDBConnection();
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, appId);
stmt.setString(2, userName);
stmt.setInt(3, tenantId);
stmt.addBatch();
stmt.executeUpdate();
}
} catch (DBConnectionException e) {
String msg = "Error occurred while obtaining the DB connection when adding app to favourites";
log.error(msg, e);
throw new ApplicationManagementDAOException(msg, e);
} catch (SQLException e) {
String msg = "SQL Error occurred while adding app with the id " + appId + " to favourites. Executed Query: " + sql;
log.error(msg, e);
throw new ApplicationManagementDAOException(msg, e);
}
}
@Override
public void removeAppFromFavourite(int appId, String userName, int tenantId) throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) {
log.debug("Request received in DAO Layer to add app with the id " + appId + " favourites");
}
String sql = "DELETE FROM AP_APP_FAVOURITES "
+ "WHERE AP_APP_ID = ? "
+ "AND USER_NAME = ? "
+ "AND TENANT_ID = ?";
try {
Connection conn = this.getDBConnection();
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, appId);
stmt.setString(2, userName);
stmt.setInt(3, tenantId);
stmt.addBatch();
stmt.executeUpdate();
}
} catch (DBConnectionException e) {
String msg = "Error occurred while obtaining the DB connection when removing app from favourites";
log.error(msg, e);
throw new ApplicationManagementDAOException(msg, e);
} catch (SQLException e) {
String msg = "SQL Error occurred while removing app with the id " + appId + " from favourites. Executed Query: " + sql;
log.error(msg, e);
throw new ApplicationManagementDAOException(msg, e);
}
}
@Override
public boolean isFavouriteApp(int appId, String userName, int tenantId) throws ApplicationManagementDAOException {
String sql = "SELECT AP_APP_ID "
+ "FROM AP_APP_FAVOURITES "
+ "WHERE "
+ "AP_APP_ID = ? AND "
+ "USER_NAME = ? AND "
+ "TENANT_ID = ?";
try {
Connection conn = this.getDBConnection();
try (PreparedStatement stmt = conn.prepareStatement(sql)){
stmt.setInt(1, appId);
stmt.setString(2, userName);
stmt.setInt(3, tenantId);
try (ResultSet rs = stmt.executeQuery()){
return rs.next();
}
}
} catch (DBConnectionException e) {
String msg = "Error occurred while obtaining the DB connection to check whether the application with the id "
+ appId + " is a favourite app";
log.error(msg, e);
throw new ApplicationManagementDAOException(msg, e);
} catch (SQLException e) {
String msg = "Error occurred while obtaining the DB connection to check whether the application with the id "
+ appId + " is a favourite app. executed query " + sql;
log.error(msg, e);
throw new ApplicationManagementDAOException(msg, e);
}
}
@Override @Override
public void addTags(List<String> tags, int tenantId) throws ApplicationManagementDAOException { public void addTags(List<String> tags, int tenantId) throws ApplicationManagementDAOException {
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {

@ -82,10 +82,14 @@ public class OracleApplicationDAOImpl extends GenericApplicationDAOImpl {
+ "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, " + "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, "
+ "AP_APP_RELEASE.RATED_USERS AS RATED_USER_COUNT, " + "AP_APP_RELEASE.RATED_USERS AS RATED_USER_COUNT, "
+ "NEW_AP_APP_LIFECYCLE_STATE.UPDATED_AT AS LATEST_UPDATE " + "NEW_AP_APP_LIFECYCLE_STATE.UPDATED_AT AS LATEST_UPDATE "
+ "FROM AP_APP " + "FROM AP_APP ";
+ "INNER JOIN AP_APP_RELEASE ON " if (StringUtils.isNotEmpty(filter.getFavouredBy())) {
+ "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID " sql += "INNER JOIN AP_APP_FAVOURITES ON "
+ "INNER JOIN (SELECT AP_APP.ID FROM AP_APP ORDER BY ID "; + "AP_APP.ID = AP_APP_FAVOURITES.AP_APP_ID ";
}
sql += "INNER JOIN AP_APP_RELEASE ON "
+ "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID "
+ "INNER JOIN (SELECT AP_APP.ID FROM AP_APP ORDER BY ID ";
if (StringUtils.isNotEmpty(filter.getVersion()) || StringUtils.isNotEmpty(filter.getAppReleaseState()) if (StringUtils.isNotEmpty(filter.getVersion()) || StringUtils.isNotEmpty(filter.getAppReleaseState())
|| StringUtils.isNotEmpty(filter.getAppReleaseType())) { || StringUtils.isNotEmpty(filter.getAppReleaseType())) {
sql += "INNER JOIN AP_APP_RELEASE ON AP_APP.ID = AP_APP_RELEASE.AP_APP_ID "; sql += "INNER JOIN AP_APP_RELEASE ON AP_APP.ID = AP_APP_RELEASE.AP_APP_ID ";

@ -81,8 +81,12 @@ public class SQLServerApplicationDAOImpl extends GenericApplicationDAOImpl {
+ "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, " + "AP_APP_RELEASE.CURRENT_STATE AS RELEASE_CURRENT_STATE, "
+ "AP_APP_RELEASE.RATED_USERS AS RATED_USER_COUNT, " + "AP_APP_RELEASE.RATED_USERS AS RATED_USER_COUNT, "
+ "NEW_AP_APP_LIFECYCLE_STATE.UPDATED_AT AS LATEST_UPDATE " + "NEW_AP_APP_LIFECYCLE_STATE.UPDATED_AT AS LATEST_UPDATE "
+ "FROM AP_APP " + "FROM AP_APP ";
+ "INNER JOIN AP_APP_RELEASE ON " if (StringUtils.isNotEmpty(filter.getFavouredBy())) {
sql += "INNER JOIN AP_APP_FAVOURITES ON "
+ "AP_APP.ID = AP_APP_FAVOURITES.AP_APP_ID ";
}
sql += "INNER JOIN AP_APP_RELEASE ON "
+ "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID " + "AP_APP.ID = AP_APP_RELEASE.AP_APP_ID "
+ "INNER JOIN (SELECT AP_APP.ID FROM AP_APP "; + "INNER JOIN (SELECT AP_APP.ID FROM AP_APP ";
if (StringUtils.isNotEmpty(filter.getVersion()) || StringUtils.isNotEmpty(filter.getAppReleaseState()) if (StringUtils.isNotEmpty(filter.getVersion()) || StringUtils.isNotEmpty(filter.getAppReleaseState())

@ -178,6 +178,116 @@ ApplicationManagerImpl implements ApplicationManager {
return addAppDataIntoDB(applicationDTO, tenantId, isPublished); return addAppDataIntoDB(applicationDTO, tenantId, isPublished);
} }
@Override
public void addAppToFavourites(int appId) throws ApplicationManagementException {
validateAddAppToFavouritesRequest(appId);
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
try {
ConnectionManagerUtil.beginDBTransaction();
applicationDAO.addAppToFavourite(appId, userName, tenantId);
ConnectionManagerUtil.commitDBTransaction();
} catch (TransactionManagementException e) {
String msg = "Error occurred while staring transaction to add applicationId: "
+ appId + " to favourites";
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (DBConnectionException e) {
String msg = "Error occurred while adding application id " + appId + " to favourites ";
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (ApplicationManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Error occurred while adding application with the id: " + appId + " to favourites ";
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} finally {
ConnectionManagerUtil.closeDBConnection();
}
}
@Override
public void removeAppFromFavourites(int appId) throws ApplicationManagementException {
validateRemoveAppFromFavouritesRequest(appId);
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
try {
ConnectionManagerUtil.beginDBTransaction();
applicationDAO.removeAppFromFavourite(appId, userName, tenantId);
ConnectionManagerUtil.commitDBTransaction();
} catch (TransactionManagementException e) {
String msg = "Error occurred while staring transaction to remove applicationId: "
+ appId + " from favourites";
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (DBConnectionException e) {
String msg = "Error occurred while removing application id " + appId + " from favourites ";
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (ApplicationManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Error occurred while removing application with the id: " + appId + " from favourites ";
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} finally {
ConnectionManagerUtil.closeDBConnection();
}
}
@Override
public boolean isFavouriteApp(int appId) throws ApplicationManagementException{
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
try {
ConnectionManagerUtil.openDBConnection();
return applicationDAO.isFavouriteApp(appId, userName, tenantId);
} catch (DBConnectionException e) {
String msg = "Error occurred while getting DB connection to check is app with the id " + appId
+ " is a favourite app";
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (ApplicationManagementDAOException e) {
String msg = "Error occurred while checking app with the id " + appId + " is a favourite app.";
log.error(msg);
throw new ApplicationManagementException(msg, e);
} finally {
ConnectionManagerUtil.closeDBConnection();
}
}
/**
* Use to check if the requested application id is valid before removing from favourites
*
* @param appId ID of the application
* @throws ApplicationManagementException if ID is not valid or errors while validating
*/
private void validateRemoveAppFromFavouritesRequest(int appId) throws ApplicationManagementException {
if (!isFavouriteApp(appId)) {
String msg = "Provided appId " + appId + " is not a favourite app in order remove from favourites";
throw new BadRequestException(msg);
}
}
/**
* Use to check if the requested application id is valid before adding to favourites
*
* @param appId ID of the application
* @throws ApplicationManagementException if ID is not valid or errors while validating
*/
private void validateAddAppToFavouritesRequest(int appId) throws ApplicationManagementException {
try {
getApplication(appId);
} catch (NotFoundException e) {
String msg = " No application exists for the provided appId " + appId;
throw new BadRequestException(msg);
}
if (isFavouriteApp(appId)) {
String msg = "Provided appId " + appId + " is already a favourite app";
throw new BadRequestException(msg);
}
}
@Override @Override
public Application createPublicApp(PublicAppWrapper publicAppWrapper, ApplicationArtifact applicationArtifact, boolean isPublished) public Application createPublicApp(PublicAppWrapper publicAppWrapper, ApplicationArtifact applicationArtifact, boolean isPublished)
throws ApplicationManagementException { throws ApplicationManagementException {
@ -608,9 +718,17 @@ ApplicationManagerImpl implements ApplicationManager {
return applicationReleaseDTO; return applicationReleaseDTO;
} }
@Override
public ApplicationList getFavouriteApplications(Filter filter) throws ApplicationManagementException {
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
filter.setFavouredBy(userName);
return getApplications(filter);
}
@Override @Override
public ApplicationList getApplications(Filter filter) throws ApplicationManagementException { public ApplicationList getApplications(Filter filter) throws ApplicationManagementException {
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(); int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId();
String userName = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername();
ApplicationList applicationList = new ApplicationList(); ApplicationList applicationList = new ApplicationList();
List<Application> applications = new ArrayList<>(); List<Application> applications = new ArrayList<>();
DeviceType deviceType; DeviceType deviceType;
@ -636,6 +754,7 @@ ApplicationManagerImpl implements ApplicationManager {
.setUnrestrictedRoles(visibilityDAO.getUnrestrictedRoles(applicationDTO.getId(), tenantId)); .setUnrestrictedRoles(visibilityDAO.getUnrestrictedRoles(applicationDTO.getId(), tenantId));
applicationDTO.setAppCategories(applicationDAO.getAppCategories(applicationDTO.getId(), tenantId)); applicationDTO.setAppCategories(applicationDAO.getAppCategories(applicationDTO.getId(), tenantId));
applicationDTO.setTags(applicationDAO.getAppTags(applicationDTO.getId(), tenantId)); applicationDTO.setTags(applicationDAO.getAppTags(applicationDTO.getId(), tenantId));
applicationDTO.setFavourite(applicationDAO.isFavouriteApp(applicationDTO.getId(), userName, tenantId));
if (isFilteringApp(applicationDTO, filter)) { if (isFilteringApp(applicationDTO, filter)) {
boolean isHideableApp = isHideableApp(applicationDTO.getApplicationReleaseDTOs()); boolean isHideableApp = isHideableApp(applicationDTO.getApplicationReleaseDTOs());

@ -362,6 +362,7 @@ public class APIUtil {
application.setTags(applicationDTO.getTags()); application.setTags(applicationDTO.getTags());
application.setUnrestrictedRoles(applicationDTO.getUnrestrictedRoles()); application.setUnrestrictedRoles(applicationDTO.getUnrestrictedRoles());
application.setRating(applicationDTO.getAppRating()); application.setRating(applicationDTO.getAppRating());
application.setFavourite(applicationDTO.isFavourite());
application.setInstallerName(applicationDTO.getApplicationReleaseDTOs().get(0).getInstallerName()); application.setInstallerName(applicationDTO.getApplicationReleaseDTOs().get(0).getInstallerName());
List<ApplicationRelease> applicationReleases = new ArrayList<>(); List<ApplicationRelease> applicationReleases = new ArrayList<>();
if (ApplicationType.PUBLIC.toString().equals(applicationDTO.getType()) && application.getCategories() if (ApplicationType.PUBLIC.toString().equals(applicationDTO.getType()) && application.getCategories()

@ -35,8 +35,10 @@ import io.entgra.application.mgt.common.ApplicationList;
import javax.validation.Valid; import javax.validation.Valid;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.POST; import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
@ -70,6 +72,13 @@ import javax.ws.rs.core.Response;
key = "perm:app:store:view", key = "perm:app:store:view",
roles = {"Internal/devicemgt-user"}, roles = {"Internal/devicemgt-user"},
permissions = {"/app-mgt/store/application/view"} permissions = {"/app-mgt/store/application/view"}
),
@Scope(
name = "Modify Application",
description = "Modify application state",
key = "perm:app:store:modify",
roles = {"Internal/devicemgt-user"},
permissions = {"/app-mgt/store/application/modify"}
) )
} }
) )
@ -81,6 +90,120 @@ public interface ApplicationManagementAPI {
String SCOPE = "scope"; String SCOPE = "scope";
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("/favourite/{appId}")
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON,
httpMethod = "POST",
value = "add application to favourites",
notes = "This will add application to favourites",
tags = "Application Management",
extensions = {
@Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:app:store:modify")
})
}
)
@ApiResponses(
value = {
@ApiResponse(
code = 200,
message = "OK. \n Successfully added application to favourites.",
response = ApplicationList.class),
@ApiResponse(
code = 400,
message = "Bad Request. \n " +
"Payload contains unacceptable or vulnerable data"),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred while adding the application to favourites.",
response = ErrorResponse.class)
})
Response addAppToFavourite(
@ApiParam(
name = "appId",
value = "id of the application",
required = true)
@PathParam("appId") int appId);
@DELETE
@Consumes(MediaType.APPLICATION_JSON)
@Path("/favourite/{appId}")
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON,
httpMethod = "DELETE",
value = "remove application from favourites",
notes = "This will removing an application from favourites",
tags = "Application Management",
extensions = {
@Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:app:store:modify")
})
}
)
@ApiResponses(
value = {
@ApiResponse(
code = 200,
message = "OK. \n Successfully removed application from favourites.",
response = ApplicationList.class),
@ApiResponse(
code = 400,
message = "Bad Request. \n " +
"Payload contains unacceptable or vulnerable data"),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred while removing the application from favourites.",
response = ErrorResponse.class)
})
Response removeAppFromFavourite(
@ApiParam(
name = "appId",
value = "id of the application",
required = true)
@PathParam("appId") int appId);
@POST
@Path("/favourite")
@Consumes(MediaType.APPLICATION_JSON)
@ApiOperation(
consumes = MediaType.APPLICATION_JSON,
produces = MediaType.APPLICATION_JSON,
httpMethod = "GET",
value = "get all favourite applications",
notes = "This will get all favourite applications",
tags = "Application Management",
extensions = {
@Extension(properties = {
@ExtensionProperty(name = SCOPE, value = "perm:app:store:view")
})
}
)
@ApiResponses(
value = {
@ApiResponse(
code = 200,
message = "OK. \n Successfully got application list.",
response = ApplicationList.class),
@ApiResponse(
code = 400,
message = "Bad Request. \n " +
"Application retrieving request payload contains unacceptable or vulnerable data"),
@ApiResponse(
code = 500,
message = "Internal Server Error. \n Error occurred while getting the application list.",
response = ErrorResponse.class)
})
Response getFavouriteApplications(
@ApiParam(
name = "filter",
value = "Application filtering data",
required = true)
@Valid Filter filter);
@POST @POST
@Produces(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON)

@ -28,14 +28,15 @@ import io.entgra.application.mgt.core.exception.NotFoundException;
import io.entgra.application.mgt.core.exception.UnexpectedServerErrorException; import io.entgra.application.mgt.core.exception.UnexpectedServerErrorException;
import io.entgra.application.mgt.core.util.APIUtil; import io.entgra.application.mgt.core.util.APIUtil;
import io.entgra.application.mgt.store.api.services.ApplicationManagementAPI; import io.entgra.application.mgt.store.api.services.ApplicationManagementAPI;
import javax.validation.Valid; import javax.validation.Valid;
import javax.ws.rs.Consumes; import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.POST; import javax.ws.rs.POST;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.PathParam; import javax.ws.rs.PathParam;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
/** /**
@ -47,30 +48,88 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
private static final Log log = LogFactory.getLog(ApplicationManagementAPIImpl.class); private static final Log log = LogFactory.getLog(ApplicationManagementAPIImpl.class);
@POST
@Path("/favourite/{appId}")
@Override
@Consumes(MediaType.APPLICATION_JSON)
public Response addAppToFavourite(@PathParam("appId") int appId) {
ApplicationManager applicationManager = APIUtil.getApplicationManager();
try {
applicationManager.addAppToFavourites(appId);
return Response.status(Response.Status.OK).build();
} catch (BadRequestException e) {
String msg = "Invalid payload found in the request. Hence verify the request payload.";
log.error(msg, e);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
} catch (ApplicationManagementException e) {
String msg = "Error occurred while adding application to favourites";
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
}
@DELETE
@Path("/favourite/{appId}")
@Override
@Consumes(MediaType.APPLICATION_JSON)
public Response removeAppFromFavourite(@PathParam("appId") int appId) {
ApplicationManager applicationManager = APIUtil.getApplicationManager();
try {
applicationManager.removeAppFromFavourites(appId);
return Response.status(Response.Status.OK).build();
} catch (BadRequestException e) {
String msg = "Invalid payload found in the request. Hence verify the request payload.";
log.error(msg, e);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
} catch (ApplicationManagementException e) {
String msg = "Error occurred while removing application from favourites";
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
}
@POST
@Path("/favourite")
@Override
@Consumes(MediaType.APPLICATION_JSON)
public Response getFavouriteApplications(@Valid Filter filter) {
ApplicationManager applicationManager = APIUtil.getApplicationManager();
try {
validateFilter(filter);
ApplicationList applications = applicationManager.getFavouriteApplications(filter);
return Response.status(Response.Status.OK).entity(applications).build();
} catch (BadRequestException e) {
String msg = "Invalid filter payload found in the request. Hence verify the filter payload.";
log.error(msg, e);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
} catch (ApplicationManagementException e) {
String msg = "Error occurred while retrieving favourite applications";
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
}
@POST @POST
@Override @Override
@Consumes("application/json") @Consumes("application/json")
public Response getApplications(@Valid Filter filter) { public Response getApplications(@Valid Filter filter) {
ApplicationManager applicationManager = APIUtil.getApplicationManager(); ApplicationManager applicationManager = APIUtil.getApplicationManager();
try { try {
if (filter == null) { validateFilter(filter);
String msg = "Request Payload is null";
log.error(msg);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
}
filter.setAppReleaseState(applicationManager.getInstallableLifecycleState()); filter.setAppReleaseState(applicationManager.getInstallableLifecycleState());
ApplicationList applications = applicationManager.getApplications(filter); ApplicationList applications = applicationManager.getApplications(filter);
return Response.status(Response.Status.OK).entity(applications).build(); return Response.status(Response.Status.OK).entity(applications).build();
} catch (BadRequestException e) { } catch (BadRequestException e) {
String msg = e.getMessage(); String msg = "Invalid request payload found in the request. Hence verify the payload.";
log.error(msg, e); log.error(msg, e);
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build(); return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
} catch (UnexpectedServerErrorException e) { } catch (UnexpectedServerErrorException e) {
String msg = e.getMessage(); String msg = "Unexpected Error occurred while retrieving applications";
log.error(msg); log.error(msg);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (ApplicationManagementException e) { } catch (ApplicationManagementException e) {
String msg = e.getMessage(); String msg = "Error occurred while retrieving applications";
log.error(msg);
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();
} }
@ -101,4 +160,18 @@ public class ApplicationManagementAPIImpl implements ApplicationManagementAPI {
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build(); return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} }
} }
/**
* This method can be used to check & validate if {@link Filter} object exist.
*
* @param filter {@link Filter}
* @throws BadRequestException if filter object doesn't exist
*/
private void validateFilter(Filter filter) throws BadRequestException {
if (filter == null) {
String msg = "Request Payload is null";
log.error(msg);
throw new BadRequestException(msg);
}
}
} }

@ -41,6 +41,7 @@
<Scope>perm:app:publisher:view</Scope> <Scope>perm:app:publisher:view</Scope>
<Scope>perm:app:publisher:update</Scope> <Scope>perm:app:publisher:update</Scope>
<Scope>perm:app:store:view</Scope> <Scope>perm:app:store:view</Scope>
<Scope>perm:app:store:modify</Scope>
<Scope>perm:app:subscription:install</Scope> <Scope>perm:app:subscription:install</Scope>
<Scope>perm:app:subscription:uninstall</Scope> <Scope>perm:app:subscription:uninstall</Scope>
<Scope>perm:admin:app:review:update</Scope> <Scope>perm:admin:app:review:update</Scope>

Loading…
Cancel
Save