/**
  * API for this method is .../rest/premium_package_properties This method recieves JSON object,
  * and put it in the base. Example for JSON that you need to send some of this attributes not to
  * be default values: <br>
  * {<br>
  * "googlePlayStoreId": null,<br>
  * "itunesStoreId": null,<br>
  * "amazonStoreId": null,<br>
  * "forNonPayingUsers": 0, <br>
  * "redirectPositionTop": null,<br>
  * "redirectPositionLeft": null, <br>
  * "redirectImageUrl": "", "charityDonation": null, <br>
  * "charityDescription": "",<br>
  * "showUntil": null,<br>
  * "maxPurchasesPerUser": null,<br>
  * "idPremiumPackageUpgrade": null, <br>
  * "idFavoriteClub": null,<br>
  * "highlightImageUrl": "",<br>
  * "showOnlySpecial": 0,<br>
  * "imageUrlSpecial": "",<br>
  * "forPayingUsers": 0,<br>
  * "showFrom": null,<br>
  * "updateTimestamp": null,<br>
  * "redirectUrl": "", <br>
  * }
  *
  * @param token is a header parameter for checking permission
  * @param request
  * @param premiumPackageProperties
  * @return Response with status CREATED (201)
  * @throws InputValidationException Example for this exception: <br>
  *     {<br>
  *     "errorMessage": "Validation failed",<br>
  *     "errorCode": 400<br>
  *     }
  */
 @POST
 @Consumes(MediaType.APPLICATION_JSON)
 public Response insertPremiumAction(
     @HeaderParam("authorization") String token,
     @Context HttpServletRequest request,
     PremiumPackageProperties premiumPackageProperties) {
   EntityManager em = helper.getEntityManager();
   CmsActionHistory history =
       helper.checkUserAndPrivileges(
           em,
           TableConstants.SHOP,
           MethodConstants.ADD,
           token,
           request.getRequestURL().toString()
               + (request.getQueryString() != null ? "?" + request.getQueryString() : ""),
           premiumPackageProperties);
   premiumPackageProperties.setCreateDate(new Date());
   if (validator.checkLenght(premiumPackageProperties.getCharityDescription(), 255, true)
       && someAttributeIsNotNull(premiumPackageProperties)) {
     premiumPackageProperties.setCreateDate(new Date());
     helper.persistObject(em, premiumPackageProperties);
     Response response = Response.status(Response.Status.CREATED).build();
     helper.setResponseToHistory(history, response, em);
     return response;
   } else {
     helper.setResponseToHistory(history, new InputValidationException("Validation failed"), em);
     throw new InputValidationException("Validation failed");
   }
 }
 /**
  * New fields added:[googlePlayStoreId,itunesStoreId,amazonStoreId] API for method:
  * .../rest/premium_package_properties?forPayingUser=VALUE&forNonPayingUser=VALUE This method
  * returns JSON list. Default value for forPayingUser is 0, and for forNonPayingUser is 0. You can
  * put your values for forPayingUser, forNonPayingUser. It produces APPLICATION_JSON media type.
  * Example for JSON list: <br>
  * {<br>
  * "count": 1,<br>
  * "data": [<br>
  * {<br>
  * "createDate": 1427204490000,<br>
  * "redirectUrl": "",<br>
  * "charityDescription": "",<br>
  * "charityDonation": null,<br>
  * "forNonPayingUsers": 0,<br>
  * "forPayingUsers": 0,<br>
  * "highlightImageUrl": "",<br>
  * "showUntil": null,<br>
  * "idFavoriteClub": null,<br>
  * "idPremiumPackageSuccessor": 8,<br>
  * "idPremiumPackageUpgrade": null,<br>
  * "imageUrlSpecial": "",<br>
  * "maxPurchasesPerUser": null,<br>
  * "redirectImageUrl": "",<br>
  * "redirectPositionLeft": null,<br>
  * "redirectPositionTop": null,<br>
  * "updateTimestamp": null,<br>
  * "showOnlySpecial": 0,<br>
  * "showFrom": null,<br>
  * "googlePlayStoreId": null,<br>
  * "itunesStoreId": null,<br>
  * "amazonStoreId": null,<br>
  * "id": 1<br>
  * }<br>
  * }]<br>
  *
  * @param token is a header parameter for checking permission
  * @param request
  * @param forPayingUser - true if you want only premium package properties for paying users
  * @param forNonPayingUser - true if you want only premium package properties for non paying users
  * @return Response 200 OK with JSON body
  * @throws DataNotFoundException DataNotFoundException Example for exception:<br>
  *     {<br>
  *     "errorMessage": "Requested page does not exist..",<br>
  *     "errorCode": 404<br>
  *     }
  */
 @GET // question?page=1&limit=10&minDate=1438387200000&maxDate=1439164800000&search=Viktor&column=id
 @Produces(MediaType.APPLICATION_JSON)
 public Response getPremiumPackageProperties(
     @HeaderParam("authorization") String token,
     @Context HttpServletRequest request,
     @DefaultValue("false") @QueryParam("forPayingUser") boolean forPayingUser,
     @DefaultValue("false") @QueryParam("forNonPayingUser") boolean forNonPayingUser) {
   EntityManager em = helper.getEntityManager();
   CmsActionHistory history =
       helper.checkUserAndPrivileges(
           em,
           TableConstants.SHOP,
           MethodConstants.SEARCH,
           token,
           request.getRequestURL().toString()
               + (request.getQueryString() != null ? "?" + request.getQueryString() : ""),
           null);
   List<PremiumPackageProperties> premiumPackageProperties;
   if (forPayingUser) {
     premiumPackageProperties =
         em.createNamedQuery("PremiumPackageProperties.findByForPayingUsers")
             .setParameter("forPayingUsers", Short.parseShort("1"))
             .getResultList();
   } else {
     if (forNonPayingUser) {
       premiumPackageProperties =
           em.createNamedQuery("PremiumPackageProperties.findByForNonPayingUsers")
               .setParameter("forNonPayingUsers", Short.parseShort("1"))
               .getResultList();
     } else {
       premiumPackageProperties =
           em.createNamedQuery("PremiumPackageProperties.findAll").getResultList();
     }
   }
   if (premiumPackageProperties == null || premiumPackageProperties.isEmpty()) {
     helper.setResponseToHistory(
         history, new DataNotFoundException("Requested page does not exist.."), em);
     throw new DataNotFoundException("Requested page does not exist..");
   }
   String countQuery = "Select COUNT(p) From PremiumPackageProperties p";
   long count = (long) em.createQuery(countQuery).getSingleResult();
   GetObject go = new GetObject();
   go.setCount(count);
   go.setData(
       PremiumPackagePropertiesPOJO.toPremiumPackagePropertiesPOJOList(premiumPackageProperties));
   Response response = Response.ok().entity(go).build();
   helper.setResponseToHistory(history, response, em);
   return response;
 }
 /**
  * API for this method: .../rest/premium_package_properties/count This method return number of all
  * package properties in database.
  *
  * @param token is a header parameter for checking permission
  * @param request
  * @return Response 200 OK with JSON body
  */
 @GET
 @Produces(MediaType.APPLICATION_JSON)
 @Path("/count")
 public Response getCountPackageProperties(
     @HeaderParam("authorization") String token, @Context HttpServletRequest request) {
   EntityManager em = helper.getEntityManager();
   CmsActionHistory history =
       helper.checkUserAndPrivileges(
           em,
           TableConstants.SHOP,
           MethodConstants.SEARCH,
           token,
           request.getRequestURL().toString()
               + (request.getQueryString() != null ? "?" + request.getQueryString() : ""),
           null);
   String query = "Select COUNT(ip) From PremiumPackageProperties ip";
   CountWrapper count = new CountWrapper((long) em.createQuery(query).getSingleResult());
   Response response = Response.ok().entity(count).build();
   helper.setResponseToHistory(history, response, em);
   return response;
 }
 /**
  * API for method: .../rest/premium_package_properties/{id} This method return single element of
  * package properties at index in JSON. Example for JSON response: <br>
  * {<br>
  * "createDate": 1427204490000,<br>
  * "redirectUrl": "",<br>
  * "charityDescription": "",<br>
  * "charityDonation": null,<br>
  * "forNonPayingUsers": 0,<br>
  * "forPayingUsers": 0,<br>
  * "highlightImageUrl": "",<br>
  * "showUntil": null,<br>
  * "idFavoriteClub": null,<br>
  * "idPremiumPackageSuccessor": 8,<br>
  * "idPremiumPackageUpgrade": null,<br>
  * "imageUrlSpecial": "",<br>
  * "maxPurchasesPerUser": null,<br>
  * "redirectImageUrl": "",<br>
  * "redirectPositionLeft": null,<br>
  * "redirectPositionTop": null,<br>
  * "updateTimestamp": null,<br>
  * "showOnlySpecial": 0,<br>
  * "showFrom": null,<br>
  * "googlePlayStoreId": null,<br>
  * "itunesStoreId": null,<br>
  * "amazonStoreId": null,<br>
  * "id": 1<br>
  * }<br>
  *
  * @param token is a header parameter for checking permission
  * @param request
  * @param id of premium package properties we are searching for
  * @throws DataNotFoundException DataNotFoundException Example for exception:<br>
  *     {<br>
  *     "errorMessage": "Requested page does not exist..",<br>
  *     "errorCode": 404<br>
  *     }
  * @return Response 200 OK status with JSON body
  */
 @GET
 @Path("/{id}")
 @Produces(MediaType.APPLICATION_JSON)
 public Response getPackagePropertiesById(
     @HeaderParam("authorization") String token,
     @Context HttpServletRequest request,
     @PathParam("id") long id) {
   EntityManager em = helper.getEntityManager();
   CmsActionHistory history =
       helper.checkUserAndPrivileges(
           em,
           TableConstants.SHOP,
           MethodConstants.SEARCH,
           token,
           request.getRequestURL().toString()
               + (request.getQueryString() != null ? "?" + request.getQueryString() : ""),
           null);
   PremiumPackageProperties properties = null;
   try {
     properties =
         (PremiumPackageProperties)
             em.createNamedQuery("PremiumPackageProperties.findById")
                 .setParameter("id", id)
                 .getSingleResult();
   } catch (Exception e) {
     helper.setResponseToHistory(
         history,
         new DataNotFoundException(
             "Premium package properties at index " + id + " does not exist.."),
         em);
     throw new DataNotFoundException(
         "Premium package properties at index " + id + " does not exist..");
   }
   Response response = Response.ok().entity(new PremiumPackagePropertiesPOJO(properties)).build();
   helper.setResponseToHistory(history, response, em);
   return response;
 }
 /**
  * API for this method is .../rest/premium_package_properties This method recieves JSON object,
  * and update database. Example for JSON that you need. Required filed is id.
  *
  * <p>{ <br>
  * "forNonPayingUsers": 0,<br>
  * "redirectPositionTop": null,<br>
  * "redirectPositionLeft": null,<br>
  * "redirectImageUrl": "",<br>
  * "charityDonation": null, <br>
  * "charityDescription": "",<br>
  * "showUntil": null,<br>
  * "maxPurchasesPerUser": null, <br>
  * "idPremiumPackageUpgrade": null,<br>
  * "idFavoriteClub": null,<br>
  * "highlightImageUrl": "",<br>
  * "showOnlySpecial": 0,<br>
  * "imageUrlSpecial": "",<br>
  * "forPayingUsers": 0, <br>
  * "showFrom": null, <br>
  * "updateTimestamp": null,<br>
  * "createDate": 1427204490000, <br>
  * "redirectUrl": "", <br>
  * "googlePlayStoreId": null,<br>
  * "itunesStoreId": null,<br>
  * "amazonStoreId": null,<br>
  * "id": 1 <br>
  * }
  *
  * @param token is a header parameter for checking permission
  * @param request
  * @param premiumPackageProperty
  * @return Response with status OK (200) "Successfully updated!"
  * @throws InputValidationException Example for this exception: <br>
  *     {<br>
  *     "errorMessage": "Validation failed",<br>
  *     "errorCode": 400<br>
  *     }
  * @throws DataNotFoundException DataNotFoundException Example for exception:<br>
  *     {<br>
  *     "errorMessage": "Premium package properies at index 15 does not exits",<br>
  *     "errorCode": 404<br>
  *     }
  */
 @PUT
 @Consumes(MediaType.APPLICATION_JSON)
 public Response updatePremiumAction(
     @HeaderParam("authorization") String token,
     @Context HttpServletRequest request,
     PremiumPackageProperties premiumPackageProperty) {
   EntityManager em = helper.getEntityManager();
   CmsActionHistory history =
       helper.checkUserAndPrivileges(
           em,
           TableConstants.SHOP,
           MethodConstants.EDIT,
           token,
           request.getRequestURL().toString()
               + (request.getQueryString() != null ? "?" + request.getQueryString() : ""),
           premiumPackageProperty);
   PremiumPackageProperties oldPremiumPackageProperty =
       em.find(PremiumPackageProperties.class, premiumPackageProperty.getId());
   if (oldPremiumPackageProperty != null) {
     if (validator.checkLenght(premiumPackageProperty.getCharityDescription(), 255, true)
         && someAttributeIsNotNull(premiumPackageProperty)
         && oldPremiumPackageProperty.getId() != 0) {
       premiumPackageProperty.setCreateDate(oldPremiumPackageProperty.getCreateDate());
       helper.mergeObject(em, premiumPackageProperty);
     } else {
       helper.setResponseToHistory(history, new InputValidationException("Validation failed"), em);
       throw new InputValidationException("Validation failed");
     }
   } else {
     helper.setResponseToHistory(
         history,
         new DataNotFoundException(
             "Premium package properies at index"
                 + premiumPackageProperty.getId()
                 + " does not exits"),
         em);
     throw new DataNotFoundException(
         "Premium package properies at index"
             + premiumPackageProperty.getId()
             + " does not exits");
   }
   Response response = Response.ok().build();
   helper.setResponseToHistory(history, response, em);
   return response;
 }