# CommunityWebResource.java

    /*
     * Copyright (C) 2000 - 2024 Silverpeas
     *
     * This program is free software: you can redistribute it and/or modify
     * it under the terms of the GNU Affero General Public License as
     * published by the Free Software Foundation, either version 3 of the
     * License, or (at your option) any later version.
     *
     * As a special exception to the terms and conditions of version 3.0 of
     * the GPL, you may redistribute this Program in connection with Free/Libre
     * Open Source Software ("FLOSS") applications as described in Silverpeas's
     * FLOSS exception.  You should have received a copy of the text describing
     * the FLOSS exception, and it is also available here:
     * "https://www.silverpeas.com/legal/licensing"
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU Affero General Public License for more details.
     *
     * You should have received a copy of the GNU Affero General Public License
     * along with this program.  If not, see <https://www.gnu.org/licenses/>.
     *
     */

    package org.silverpeas.components.community.web;

    import org.silverpeas.components.community.CommunityWebManager;
    import org.silverpeas.components.community.model.CommunityOfUsers;
    import org.silverpeas.core.admin.PaginationPage;
    import org.silverpeas.core.admin.user.model.SilverpeasRole;
    import org.silverpeas.core.web.rs.RESTWebService;
    import org.silverpeas.core.web.rs.annotation.Authorized;

    import javax.annotation.PostConstruct;
    import javax.inject.Inject;
    import javax.ws.rs.NotFoundException;
    import java.util.Collection;

    /**
     * Base class of all the resources in the community application exposed through the Web. It is
     * expected the web resource to be spawn for each incoming request; the life-cycle of each web
     * resource instance is within the one of the request.
     * @author mmoquillon
     */
    @Authorized
    public abstract class CommunityWebResource extends RESTWebService {

      protected static final String RESOURCE_NAME = "community";

      protected static final PaginationPage NO_PAGINATION = CommunityWebManager.NO_PAGINATION;

      private CommunityWebResourceURIBuilder uriBuilder;

      private CommunityOfUsers community;

      @Inject
      private CommunityWebManager webManager;

      @PostConstruct
      protected void initURIBuilder() {
        uriBuilder = new CommunityWebResourceURIBuilder(getUri());
      }

      /**
       * Gets the relative base path at which are all exposed the resources in the community
       * application.
       * @return the base path of the resource relative to the URI at which are all exposed the
       * REST-based web services in Silverpeas.
       */
      @Override
      protected String getResourceBasePath() {
        return CommunityWebResource.RESOURCE_NAME;
      }

      /**
       * Gets the roles the user requesting currently this web resource plays in the community of
       * users.
       * @return a collection of roles the current user plays.
       */
      @Override
      protected Collection<SilverpeasRole> getUserRoles() {
        return webManager.getUserRoleOn(getCommunity());
      }

      /**
       * Gets the Web Manager to use to fulfill the incoming request. The web manager centralizes all
       * the behaviour provided in the website, both by the Web GUI and the REST web resources.
       * @return a community web manager.
       */
      protected CommunityWebManager getWebManager() {
        return webManager;
      }

      /**
       * Processes the specified web function behalf the community of users concerned by the incoming
       * request.
       * @param function the web function to apply.
       * @param <T> the concrete type of the answer.
       * @return the answer of the web function.
       */
      protected <T> T process(final WebFunction<T> function) {
        return process(() -> function.applyWith(getCommunity())).execute();
      }

      private CommunityOfUsers getCommunity() {
        if (community == null) {
          community = CommunityOfUsers.getByComponentInstanceId(getComponentId())
              .orElseThrow(
                  () -> new NotFoundException("No such component instance: " + getComponentId()));
        }
        return community;
      }

      /**
       * Gets the builder of URIs of the web resources managed by the community application.
       * @return a builder of URIS to identify the web resources handled in a community application
       * instance.
       */
      protected CommunityWebResourceURIBuilder getCommunityUriBuilder() {
        return uriBuilder;
      }

      @FunctionalInterface
      protected interface WebFunction<R> {
        R applyWith(final CommunityOfUsers community);
      }
    }