DEGTEVUWU/java-project-72

View on GitHub
app/src/main/java/hexlet/code/controllers/UrlController.java

Summary

Maintainability
A
1 hr
Test Coverage
D
66%
package hexlet.code.controllers;

import hexlet.code.dto.BuildUrlPage;
import hexlet.code.dto.UrlPage;
import hexlet.code.dto.UrlsPage;
import hexlet.code.model.Url;
import hexlet.code.model.UrlCheck;
import hexlet.code.repository.CheckRepository;
import hexlet.code.repository.UrlRepository;
import hexlet.code.utils.NamedRoutes;
import io.javalin.http.Context;
import io.javalin.http.NotFoundResponse;
import io.javalin.validation.ValidationException;
import org.apache.commons.validator.routines.UrlValidator;

import java.net.URI;
import java.net.URISyntaxException;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;

public class UrlController {
    public static void root(Context ctx) {
        ctx.render("index.jte");
        ctx.consumeSessionAttribute("flash");
        ctx.consumeSessionAttribute("errorFlash");
    }
    public static void index(Context ctx) throws SQLException {
        List<Url> urls = UrlRepository.getEntities();
        UrlsPage page = new UrlsPage(urls);

        //вывод флеш сообщений о (не)добавлении сайта
        page.setFlash(ctx.consumeSessionAttribute("flash"));
        page.setFlashType(ctx.consumeSessionAttribute("flashType"));

        ctx.render("urls/index.jte", Collections.singletonMap("page", page));
    }

    public static void show(Context ctx) throws SQLException {
        var id = ctx.pathParamAsClass("id", Long.class).get();
        Url url = UrlRepository.find(id)
                .orElseThrow(() -> new NotFoundResponse("Entity with id = " + id + " not found"));

        List<UrlCheck> listWithChecks = CheckRepository.find(Math.toIntExact(url.getId()));

        UrlPage page = new UrlPage(url, listWithChecks);
        page.setFlash(ctx.consumeSessionAttribute("flash"));
        page.setFlashType(ctx.consumeSessionAttribute("flashType"));

        ctx.render("urls/show.jte", Collections.singletonMap("page", page));
    }


    public static void create(Context ctx) throws SQLException, URISyntaxException {
        var beginnerUrl = ctx.formParam("url");
        String nameUrl = null;
        try {
            var uri = new URI(beginnerUrl);
            nameUrl = uri.getScheme() + "://" + uri.getAuthority();
        } catch (ValidationException e) {
            var page = new BuildUrlPage(beginnerUrl, e.getErrors());
            ctx.status(422).render("index.jte", Collections.singletonMap("page", page));
        }

        if (!validateUrl(nameUrl)) {
            ctx.sessionAttribute("flash", "Некорректный URL");
            ctx.sessionAttribute("flashType", "danger");
            var page = new BuildUrlPage();
            page.setFlash(ctx.consumeSessionAttribute("flash"));
            page.setFlashType(ctx.consumeSessionAttribute("flashType"));
            ctx.render("index.jte", Collections.singletonMap("page", page));
            return;
        }
        if (UrlRepository.findExisting(nameUrl)) {
            ctx.sessionAttribute("flash", "Страница уже существует");
            ctx.sessionAttribute("flashType", "info");
            ctx.redirect(NamedRoutes.urlsPath());
        } else {
            Url resultUrl = new Url(nameUrl); //добавить в объект класса урл приведённую к нужному виду имя сайта
            UrlRepository.save(resultUrl);
            ctx.sessionAttribute("flash", "Страница успешно добавлена");
            ctx.sessionAttribute("flashType", "success");
            ctx.redirect(NamedRoutes.urlsPath());
        }
    }
    public static boolean validateUrl(String url) {
        String[] schemas = {"http", "https"};
        UrlValidator validator = new UrlValidator(schemas, UrlValidator.ALLOW_LOCAL_URLS);
        return validator.isValid(url);
    }
    public static void destroy(Context ctx) throws SQLException {
        var id = ctx.pathParamAsClass("id", Long.class).get();
        UrlRepository.delete(id);
        ctx.redirect(NamedRoutes.urlsPath());
    }
}