org.entcore.blog.controllers.PostController.java Source code

Java tutorial

Introduction

Here is the source code for org.entcore.blog.controllers.PostController.java

Source

/*
 * Copyright  "Open Digital Education" (SAS WebServices pour lEducation?), 2014
 *
 * This program is published by "Open Digital Education" (SAS WebServices pour lEducation?).
 * You must indicate the name of the software and the company in any production /contribution
 * using the software and indicate on the home page of the software industry in question,
 * "powered by Open Digital Education" with a reference to the website: https: //opendigitaleducation.com/.
 *
 * This program is free software, licensed under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation, version 3 of the License.
 *
 * You can redistribute this application and/or modify it since you respect the terms of the GNU Affero General Public License.
 * If you modify the source code and then use this modified source code in your creation, you must make available the source code of your modifications.
 *
 * You should have received a copy of the GNU Affero General Public License along with the software.
 * If not, please see : <http://www.gnu.org/licenses/>. Full compliance requires reading the terms of this license and following its directives.
 *
 * 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.
 */

package org.entcore.blog.controllers;

import static org.entcore.common.http.response.DefaultResponseHandler.arrayResponseHandler;
import static org.entcore.common.http.response.DefaultResponseHandler.defaultResponseHandler;
import static org.entcore.common.user.UserUtils.getUserInfos;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.entcore.blog.security.BlogResourcesProvider;
import org.entcore.blog.services.BlogTimelineService;
import org.entcore.blog.services.PostService;
import org.entcore.blog.services.impl.DefaultBlogTimelineService;
import org.entcore.blog.services.impl.DefaultPostService;
import org.entcore.common.neo4j.Neo;
import org.entcore.common.user.UserInfos;
import org.entcore.common.user.UserUtils;
import org.entcore.common.utils.StringUtils;
import org.vertx.java.core.http.RouteMatcher;

import fr.wseduc.mongodb.MongoDb;
import fr.wseduc.rs.Delete;
import fr.wseduc.rs.Get;
import fr.wseduc.rs.Post;
import fr.wseduc.rs.Put;
import fr.wseduc.security.ActionType;
import fr.wseduc.security.SecuredAction;
import fr.wseduc.webutils.Either;
import fr.wseduc.webutils.http.BaseController;
import fr.wseduc.webutils.request.RequestUtils;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.core.json.JsonObject;

public class PostController extends BaseController {
    public static final String LIST_ACTION = "org-entcore-blog-controllers-PostController|list";
    public static final String SUBMIT_ACTION = "org-entcore-blog-controllers-PostController|submit";
    private PostService post;
    private BlogTimelineService timelineService;
    private int pagingSize;

    public void init(Vertx vertx, JsonObject config, RouteMatcher rm,
            Map<String, fr.wseduc.webutils.security.SecuredAction> securedActions) {
        super.init(vertx, config, rm, securedActions);
        MongoDb mongo = MongoDb.getInstance();
        this.post = new DefaultPostService(mongo, config.getInteger("post-search-word-min-size", 4), LIST_ACTION);
        this.timelineService = new DefaultBlogTimelineService(vertx, eb, config, new Neo(vertx, eb, log), mongo);
        this.pagingSize = config.getInteger("post-paging-size", 20);
    }

    // TODO improve fields matcher and validater
    @Post("/post/:blogId")
    @SecuredAction(value = "blog.contrib", type = ActionType.RESOURCE)
    public void create(final HttpServerRequest request) {
        final String blogId = request.params().get("blogId");
        if (blogId == null || blogId.trim().isEmpty()) {
            badRequest(request);
            return;
        }
        RequestUtils.bodyToJson(request, new Handler<JsonObject>() {
            public void handle(final JsonObject data) {
                UserUtils.getUserInfos(eb, request, new Handler<UserInfos>() {
                    @Override
                    public void handle(final UserInfos user) {
                        if (user != null) {
                            post.create(blogId, data, user, defaultResponseHandler(request));
                        } else {
                            unauthorized(request);
                        }
                    }
                });
            }
        });
    }

    @Put("/post/:blogId/:postId")
    @SecuredAction(value = "blog.contrib", type = ActionType.RESOURCE)
    public void update(final HttpServerRequest request) {
        final String postId = request.params().get("postId");
        if (postId == null || postId.trim().isEmpty()) {
            badRequest(request);
            return;
        }

        UserUtils.getUserInfos(eb, request, new Handler<UserInfos>() {
            @Override
            public void handle(final UserInfos user) {
                if (user != null) {
                    RequestUtils.bodyToJson(request, new Handler<JsonObject>() {
                        public void handle(final JsonObject data) {
                            post.update(postId, data, user, defaultResponseHandler(request));
                        }
                    });
                } else {
                    unauthorized(request);
                }
            }
        });
    }

    @Delete("/post/:blogId/:postId")
    @SecuredAction(value = "blog.contrib", type = ActionType.RESOURCE)
    public void delete(final HttpServerRequest request) {
        final String postId = request.params().get("postId");
        if (postId == null || postId.trim().isEmpty()) {
            badRequest(request);
            return;
        }
        post.delete(postId, new Handler<Either<String, JsonObject>>() {
            @Override
            public void handle(Either<String, JsonObject> event) {
                if (event.isRight()) {
                    renderJson(request, event.right().getValue(), 204);
                } else {
                    JsonObject error = new JsonObject().put("error", event.left().getValue());
                    renderJson(request, error, 400);
                }
            }
        });
    }

    @Get("/post/:blogId/:postId")
    @SecuredAction(value = "blog.read", type = ActionType.RESOURCE)
    public void get(final HttpServerRequest request) {
        final String blogId = request.params().get("blogId");
        final String postId = request.params().get("postId");
        if (blogId == null || blogId.trim().isEmpty() || postId == null || postId.trim().isEmpty()) {
            badRequest(request);
            return;
        }
        post.get(blogId, postId, BlogResourcesProvider.getStateType(request), defaultResponseHandler(request));
    }

    @Get("/post/list/all/:blogId")
    @SecuredAction(value = "blog.read", type = ActionType.RESOURCE)
    public void list(final HttpServerRequest request) {
        final String blogId = request.params().get("blogId");
        if (blogId == null || blogId.trim().isEmpty()) {
            badRequest(request);
            return;
        }

        final String postId = request.params().get("postId");
        final Integer page;

        try {
            page = (request.params().get("page") != null) ? Integer.parseInt(request.params().get("page")) : null;
        } catch (NumberFormatException e) {
            badRequest(request, e.getMessage());
            return;
        }

        final int pagingSize = (page == null) ? 0 : this.pagingSize;

        final String search = request.params().get("search");

        UserUtils.getUserInfos(eb, request, new Handler<UserInfos>() {
            @Override
            public void handle(final UserInfos user) {
                if (user != null) {
                    if (!StringUtils.isEmpty(postId)) {
                        post.listOne(blogId, postId, user, arrayResponseHandler(request));
                    } else if (request.params().get("state") == null) {
                        final String statesParam = request.params().get("states");
                        final Set<String> states = new HashSet<String>();
                        if (!StringUtils.isEmpty(statesParam)) {
                            states.addAll(StringUtils.split(statesParam, ","));
                        }

                        post.list(blogId, user, page, pagingSize, search, states, arrayResponseHandler(request));
                    } else {
                        post.list(blogId, BlogResourcesProvider.getStateType(request), user, page, pagingSize,
                                search, arrayResponseHandler(request));
                    }
                } else {
                    unauthorized(request);
                }
            }
        });
    }

    @Put("/post/submit/:blogId/:postId")
    @SecuredAction(value = "blog.contrib", type = ActionType.RESOURCE)
    public void submit(final HttpServerRequest request) {
        final String blogId = request.params().get("blogId");
        final String postId = request.params().get("postId");
        if (blogId == null || blogId.trim().isEmpty() || postId == null || postId.trim().isEmpty()) {
            badRequest(request);
            return;
        }
        UserUtils.getUserInfos(eb, request, new Handler<UserInfos>() {
            @Override
            public void handle(final UserInfos user) {
                if (user != null) {
                    post.submit(blogId, postId, user, new Handler<Either<String, JsonObject>>() {
                        @Override
                        public void handle(Either<String, JsonObject> event) {
                            if (event.isRight()) {
                                if ("PUBLISHED".equals(event.right().getValue().getString("state"))) {
                                    timelineService.notifyPublishPost(request, blogId, postId, user,
                                            pathPrefix + "#/view/" + blogId);
                                } else if ("SUBMITTED".equals(event.right().getValue().getString("state"))) {
                                    timelineService.notifySubmitPost(request, blogId, postId, user,
                                            pathPrefix + "#/view/" + blogId);
                                }
                                renderJson(request, event.right().getValue());
                            } else {
                                JsonObject error = new JsonObject().put("error", event.left().getValue());
                                renderJson(request, error, 400);
                            }
                        }
                    });
                } else {
                    unauthorized(request);
                }
            }
        });
    }

    @Put("/post/publish/:blogId/:postId")
    @SecuredAction(value = "blog.manager", type = ActionType.RESOURCE)
    public void publish(final HttpServerRequest request) {
        final String blogId = request.params().get("blogId");
        final String postId = request.params().get("postId");
        if (blogId == null || blogId.trim().isEmpty() || postId == null || postId.trim().isEmpty()) {
            badRequest(request);
            return;
        }
        post.publish(blogId, postId, new Handler<Either<String, JsonObject>>() {
            @Override
            public void handle(Either<String, JsonObject> event) {
                if (event.isRight()) {
                    getUserInfos(eb, request, new Handler<UserInfos>() {
                        @Override
                        public void handle(UserInfos user) {
                            timelineService.notifyPublishPost(request, blogId, postId, user,
                                    pathPrefix + "#/view/" + blogId);
                        }
                    });
                    renderJson(request, event.right().getValue());
                } else {
                    JsonObject error = new JsonObject().put("error", event.left().getValue());
                    renderJson(request, error, 400);
                }
            }
        });
    }

    @Put("/post/unpublish/:blogId/:postId")
    @SecuredAction(value = "blog.contrib", type = ActionType.RESOURCE)
    public void unpublish(final HttpServerRequest request) {
        final String postId = request.params().get("postId");
        if (postId == null || postId.trim().isEmpty()) {
            badRequest(request);
            return;
        }
        post.unpublish(postId, defaultResponseHandler(request));
    }

    @Post("/comment/:blogId/:postId")
    @SecuredAction(value = "blog.comment", type = ActionType.RESOURCE)
    public void comment(final HttpServerRequest request) {
        final String blogId = request.params().get("blogId");
        final String postId = request.params().get("postId");
        if (blogId == null || blogId.trim().isEmpty() || postId == null || postId.trim().isEmpty()) {
            badRequest(request);
            return;
        }
        RequestUtils.bodyToJson(request, new Handler<JsonObject>() {
            public void handle(final JsonObject data) {
                UserUtils.getUserInfos(eb, request, new Handler<UserInfos>() {
                    @Override
                    public void handle(final UserInfos user) {
                        if (user != null) {
                            Handler<Either<String, JsonObject>> notifyHandler = new Handler<Either<String, JsonObject>>() {
                                @Override
                                public void handle(Either<String, JsonObject> event) {
                                    if (event.isRight()) {
                                        timelineService.notifyPublishComment(request, blogId, postId, user,
                                                pathPrefix + "#/view/" + blogId);
                                        renderJson(request, event.right().getValue());
                                    } else {
                                        JsonObject error = new JsonObject().put("error", event.left().getValue());
                                        renderJson(request, error, 400);
                                    }
                                }
                            };
                            post.addComment(blogId, postId, data.getString("comment"), user, notifyHandler);
                        } else {
                            unauthorized(request);
                        }
                    }
                });
            }
        });
    }

    @Delete("/comment/:blogId/:postId/:commentId")
    @SecuredAction(value = "blog.comment", type = ActionType.RESOURCE)
    public void deleteComment(final HttpServerRequest request) {
        final String blogId = request.params().get("blogId");
        final String commentId = request.params().get("commentId");
        if (blogId == null || blogId.trim().isEmpty() || commentId == null || commentId.trim().isEmpty()) {
            badRequest(request);
            return;
        }

        UserUtils.getUserInfos(eb, request, new Handler<UserInfos>() {
            @Override
            public void handle(final UserInfos user) {
                if (user != null) {
                    post.deleteComment(blogId, commentId, user, defaultResponseHandler(request));
                } else {
                    unauthorized(request);
                }
            }
        });
    }

    @Get("/comments/:blogId/:postId")
    @SecuredAction(value = "blog.read", type = ActionType.RESOURCE)
    public void comments(final HttpServerRequest request) {
        final String blogId = request.params().get("blogId");
        final String postId = request.params().get("postId");
        if (blogId == null || blogId.trim().isEmpty() || postId == null || postId.trim().isEmpty()) {
            badRequest(request);
            return;
        }

        UserUtils.getUserInfos(eb, request, new Handler<UserInfos>() {
            @Override
            public void handle(final UserInfos user) {
                if (user != null) {
                    post.listComment(blogId, postId, user, arrayResponseHandler(request));
                } else {
                    unauthorized(request);
                }
            }
        });
    }

    @Put("/comment/:blogId/:postId/:commentId")
    @SecuredAction(value = "blog.manager", type = ActionType.RESOURCE)
    public void publishComment(final HttpServerRequest request) {
        final String blogId = request.params().get("blogId");
        final String commentId = request.params().get("commentId");
        if (blogId == null || blogId.trim().isEmpty() || commentId == null || commentId.trim().isEmpty()) {
            badRequest(request);
            return;
        }
        post.publishComment(blogId, commentId, defaultResponseHandler(request));
    }

}