Skip to content

Commit

Permalink
Download mvc homework
Browse files Browse the repository at this point in the history
  • Loading branch information
JackKaif committed Feb 13, 2024
1 parent e4d0ed2 commit 7a8bbd8
Show file tree
Hide file tree
Showing 29 changed files with 1,106 additions and 0 deletions.
18 changes: 18 additions & 0 deletions java-web-ru/mvc/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# WARNING: Paths must not include the name of the "lessons" directory.
# Outside, this directory is called "exercises".

**/*/presentation*.html
.vagrant
.idea/
node_modules/
vendor/
dist
.gradle/
build/
caches/
.vscode/
.project
.settings
jte-classes
.classpath
bin
5 changes: 5 additions & 0 deletions java-web-ru/mvc/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
test:
./gradlew test

start:
./gradlew run
53 changes: 53 additions & 0 deletions java-web-ru/mvc/README.html

Large diffs are not rendered by default.

43 changes: 43 additions & 0 deletions java-web-ru/mvc/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
## MVC

Это задание напрямую не связано с темой урока, но мы закрепим уже пройденный материал и продолжим создавать CRUD-сущности.

В предыдущих заданиях мы делали создание сущности, вывод списка и просмотр конкретной сущности, поэтому в этом задании они уже написаны. Нам же предстоит добавить в приложение редактирование сущности.

### Ссылки

* [Методы работы с контекстом](https://javalin.io/documentation#context)

### src/main/java/exercise/controller/PostsController.java

Реализуйте контроллер с методами, необходимыми для вывода формы редактирования и обновления поста.

При обновлении поста, данные от пользователей должны пройти валидацию по тем же правилам, что и при создании. Если данные при редактировании не прошли валидацию, должна отобразиться форма редактирования с полями, заполненными данными. При успешном обновлении нужно сделать редирект на страницу списка постов.

### src/main/java/exercise/dto/posts/EditPostPage.java

Реализуйте дата-класс для передачи данных поста в шаблон с формой редактирования.

### src/main/java/exercise/util/NamingRoutes.java

Добавьте в класс `NamingRoutes` методы для именованных маршрутов отображения формы редактирования и обновления пользователей.

### src/main/java/exercise/App.java

Добавьте в приложение роутинг для редактирования постов.

Обычно обновление сущности принято делать с помощью глаголов *PATCH/PUT*. Но здесь ситуация другая — мы не можем отправлять PATCH/PUT запросы из HTML-формы. Поэтому в этом упражнении сделайте обновление сущности через POST-запрос на адрес */posts/{id}*. Так обновление будет работать в браузере.

### src/main/jte/posts/show.jte

В шаблон просмотра конкретного поста добавьте ссылку на редактирование поста.

### src/main/jte/posts/edit.jte

Реализуйте форму редактирования поста и добавьте вывод ошибок валидации.

### Подсказки

* Ориентируйтесь на методы для добавления нового поста
* Если хотите сделать красивый вывод в шаблонах, используйте классы Bootstrap
* В шаблоне с формой редактирования поста используйте идентификатор поста, чтобы сформировать ссылку
49 changes: 49 additions & 0 deletions java-web-ru/mvc/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask

plugins {
id("com.github.ben-manes.versions") version "0.48.0"
application

id("io.freefair.lombok") version "8.1.0"
}

application {
mainClass.set("exercise.App")
}

group = "exercise"
version = "1.0-SNAPSHOT"

repositories {
mavenCentral()
}

dependencies {
implementation("io.javalin:javalin:5.6.1")

implementation("gg.jte:jte:3.0.1")
implementation("io.javalin:javalin-rendering:5.6.0")
implementation("org.slf4j:slf4j-simple:2.0.7")
implementation("net.datafaker:datafaker:2.0.1")
implementation("com.fasterxml.jackson.core:jackson-databind:2.15.0")
testImplementation(platform("org.junit:junit-bom:5.9.1"))
testImplementation("org.junit.jupiter:junit-jupiter")
testImplementation("com.konghq:unirest-java:3.13.0")
testImplementation("org.hamcrest:hamcrest-core:2.2")
testImplementation("org.assertj:assertj-core:3.24.2")
}

tasks.test {
useJUnitPlatform()
// https://technology.lastminute.com/junit5-kotlin-and-gradle-dsl/
testLogging {
exceptionFormat = TestExceptionFormat.FULL
events = mutableSetOf(TestLogEvent.FAILED, TestLogEvent.PASSED, TestLogEvent.SKIPPED)
// showStackTraces = true
// showCauses = true
showStandardStreams = true
}
}

38 changes: 38 additions & 0 deletions java-web-ru/mvc/examples/Example.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import io.javalin.Javalin;

public final class App {

public static Javalin getApp() {

var app = Javalin.create(config -> {
config.plugins.enableDevLogging();
});

List<String> users = List.of("John", "Mark", "Ann");

app.get("/users", ctx -> {
var userNumber = ctx.pathParamAsClass("id", Integer.class);
var cond = ctx.queryParam("cond");
List<String> filteredUsers;

if (term == null) {
filteredUsers = users;
} else {
filteredUsers = users
.stream()
.filter(u -> u.contains(cond))
.toList();
}

var page = new UsersPage(users, cond);
ctx.render("users/index.jte", Collections.singletonMap("page", page));
});

return app;
}

public static void main(String[] args) {
Javalin app = getApp();
app.start(7070);
}
}
Binary file added java-web-ru/mvc/gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
7 changes: 7 additions & 0 deletions java-web-ru/mvc/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading

0 comments on commit 7a8bbd8

Please sign in to comment.