avatar
call API from Sling Model AEM AEM
package com.flagtick.core.models.impl;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import javax.annotation.PostConstruct;
import org.apache.commons.lang3.StringUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.models.annotations.DefaultInjectionStrategy;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.injectorspecific.OSGiService;
import org.apache.sling.models.annotations.injectorspecific.Self;
import org.apache.sling.models.annotations.injectorspecific.ValueMapValue;

@Model(adaptables = SlingHttpServletRequest.class, adapters = VerificationLetterModel.class,
        defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class VerificationLetterModelImpl implements VerificationLetterModel {

    @Self
    private SlingHttpServletRequest request;

    @Self
    private WcmModeModel wcmMode;

    @OSGiService
    private transient FlagtickIntegrationService flagtickIntegrationService;

    @ValueMapValue
    private String propertyName;

    private verificationReponse/verificationData [Object for parse from APIs]

    private boolean isAnyCheck;

    @PostConstructor
    protected void init() {
       final String loginUserID = CookieUtils.getCookieValue(request, Constants.LOGIN_USER_ID);
       if (this.wcmMode.isDisabled()) {
           	if (Objects.nonNull(flagtickIntegrationService)) {
                final String token = CookieUtils.getCookieValue(request, Constants.TOKEN);
                Map<String, String> params = new HashMap<>();
                params.put(Constants.LOGIN_USER_ID, loginUserID);
                verificationData = flagtickIntegrationService.getVerificationLetterEntity(
                        params, token);
            } else {
                verificationData = new VerificationData();
            }
       }
    }
}
Note: You can get more information with @self from link.

For the WcmModeModel.java. We will define as below:

package com.flagtick.core.models.entities;

import static org.apache.sling.models.annotations.DefaultInjectionStrategy.OPTIONAL;

import com.day.cq.wcm.api.WCMMode;
import javax.inject.Inject;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.injectorspecific.Self;

@Model(adaptables = SlingHttpServletRequest.class, defaultInjectionStrategy = OPTIONAL)
public class WcmModeModel {

    private final WCMMode wcmmode;

    @Inject
    public WcmModeModel(@Self SlingHttpServletRequest request) {
        this.wcmmode = WCMMode.fromRequest(request);
    }

    public boolean isEditMode() {
        return this.wcmmode.equals(WCMMode.EDIT);
    }

    public boolean isDisabled() {
        return this.wcmmode.equals(WCMMode.DISABLED);
    }
}

For the VerificationReponse or VerificationData. This is POJO class and then you can generate from Java.

package com.flagtick.core.models.entities;

public class VerificationLetterEntity {
    private String name;
    private String email;
    public VerificationLetterEntity(String name, String email) {
       this.name = name;
       this.email = email;
    }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

For FlagtickIntegrationService service implementation, you can refer as below:

VerificationData getVerificationLetterEntity(Map<String, String> paramMap, String userToken);

For FlagtickIntegrationServiceImpl, you can refer as below:

@Override
public VerificationData getVerificationLetterEntity(Map<String, String> paramMap, String userToken) {
    URI uri;
    try {
        uri = buildParameterizedUri(verificationInformationEndpoint, paramMap);
    } catch (URISyntaxException e) {
        LOGGER.error(UNABLE_TO_CREATE_URI, e);
        return null;
    }

    VerificationData verificationData = new VerificationData();
    HttpGet request = createAuthenticatedGetRequest(apiKey, uri);
    request.addHeader(HttpHeaders.AUTHORIZATION, BEARER + userToken);

    try (CloseableHttpClient httpClient = HttpClients.createDefault();
         CloseableHttpResponse response = httpClient.execute(request)) {
        if (response.getStatusLine().getStatusCode() == HTTP_BAD_REQUEST) {
            LOGGER.error(BAD_REQUEST_ERROR_MSG);
            return null;
        }
        if (response.getStatusLine().getStatusCode() == HTTP_BAD_GATEWAY) {
            LOGGER.error(BAD_GATEWAY_ERROR_MSG);
            return null;
        }

        HttpEntity entity = response.getEntity();

        if (entity != null) {
            String responseData = EntityUtils.toString(entity, StandardCharsets.UTF_8);
            ObjectMapper objectMapper = new ObjectMapper();
            verificationData = objectMapper.readValue(responseData,
                    VerificationData.class);
        }
    } catch (ClientProtocolException e) {
        LOGGER.error(CLIENT_PROTOCOL_EXCEPTION, e);
    } catch (IOException e) {
        LOGGER.error(ERROR_WHILE_PARSING_THE_RESPONSE, e);
    }
    return verificationData;
}

To be continued!

You need to login to do this manipulation!