Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .idea/libraries/gson_2_10_1.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Insomnia_testTaskManager
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"_type":"export","__export_format":4,"__export_date":"2024-12-13T18:57:08.076Z","__export_source":"insomnia.desktop.app:v10.2.0","resources":[{"_id":"req_ee4ebfbc33fd4b79b90ee424802fa8f0","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734115048858,"created":1734076381249,"url":"http://localhost:8080/tasks","name":"/tasks","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076418220,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"wrk_05194b500c0e48e38e0a11c82fa87a3c","parentId":null,"modified":1734060176049,"created":1734060176049,"name":"Test","description":"","scope":"collection","_type":"workspace"},{"_id":"req_d77ad25d834548f9bcc8a1dc2aeb6033","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734115053291,"created":1734076418120,"url":"http://localhost:8080/tasks/n","name":"/tasks/n","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076418195,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_63b3e431561540289577e0b6720478a9","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734115072921,"created":1734101936571,"url":"http://localhost:8080/tasks","name":"/tasks","description":"","method":"POST","body":{"mimeType":"application/json","text":"\t{\n\t\t\"id\": 0,\n\t\t\"name\": \"Работа API1\",\n\t\t\"description\": \"Просто задача API1\",\n\t\t\"status\": \"NEW\",\n\t\t\"startTime\": \"01.05.2024 10:30:00.000\",\n\t\t\"durationTask\": \"PT50M\",\n\t\t\"endTime\": \"01.05.2024 10:55:00.000\"\n\t}\n"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076418170,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_93743d3cca5141748b3ece3043822c9a","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734115124915,"created":1734115023700,"url":"http://localhost:8080/tasks/n","name":"/tasks/n","description":"","method":"POST","body":{"mimeType":"application/json","text":"\t{\n\t\t\"id\": 0,\n\t\t\"name\": \"Работа API\",\n\t\t\"description\": \"Просто задача API\",\n\t\t\"status\": \"IN_PROGRESS\",\n\t\t\"startTime\": \"01.05.2024 10:30:00.000\",\n\t\t\"durationTask\": \"PT50M\",\n\t\t\"endTime\": \"01.05.2024 10:55:00.000\"\n\t}\n"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076418145,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_7ae705c5dca8436786aa1f92b1b1d293","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734109535859,"created":1734082256906,"url":"http://localhost:8080/tasks/n","name":"/tasks/n","description":"","method":"DELETE","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076415815.5625,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_0d93271327dc45f08981531f93ccb979","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734082374532,"created":1734080250894,"url":"http://localhost:8080/subtasks","name":"/subtasks","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076413511.125,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_23d841ec7ad5498c822f67b0ce57506c","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734115195379,"created":1734080264147,"url":"http://localhost:8080/subtasks/n","name":"/subtasks/n","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076412935.0156,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_47d29acc40f740f8bef4634c1fafcd31","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734115361602,"created":1734115151688,"url":"http://localhost:8080/subtasks","name":"/subtasks","description":"","method":"POST","body":{"mimeType":"application/json","text":"\t{\n\t\t\"idEpic\": 5,\n\t\t\"id\": 0,\n\t\t\"name\": \"Попытка 6 API\",\n\t\t\"description\": \"Новая подзадача после загрузки API\",\n\t\t\"status\": \"NEW\",\n\t\t\"startTime\": \"01.02.2024 10:50:00.000\",\n\t\t\"durationTask\": \"PT1H\",\n\t\t\"endTime\": \"01.01.2024 11:50:00.000\"\n\t}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076412790.9883,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_b772aa46505e4de2a099d52b4a163352","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734115432570,"created":1734115175179,"url":"http://localhost:8080/subtasks/9","name":"/subtasks/n","description":"","method":"POST","body":{"mimeType":"application/json","text":"\t{\n\t\t\"idEpic\": 5,\n\t\t\"id\": 0,\n\t\t\"name\": \"Попытка 6 API обновление\",\n\t\t\"description\": \"Новая подзадача после загрузки API изменение статуса\",\n\t\t\"status\": \"IN_PROGRESS\",\n\t\t\"startTime\": \"01.02.2024 10:50:00.000\",\n\t\t\"durationTask\": \"PT1H\",\n\t\t\"endTime\": \"01.01.2024 11:50:00.000\"\n\t}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076412646.961,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_0681feb005394c739009a229c0d2bfff","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734085933083,"created":1734082267108,"url":"http://localhost:8080/subtasks/9","name":"/subtasks/n","description":"","method":"DELETE","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076410630.5781,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_6052151f581d4e1590d0ab868d495385","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734082119181,"created":1734080401374,"url":"http://localhost:8080/epics","name":"/epic","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076410054.4688,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_38619b97c3b546f082294dea4311219e","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734115587126,"created":1734080423768,"url":"http://localhost:8080/epics/n","name":"/epic/n","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076409766.414,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_3b38d3edd5544053b73bbe6f3018fa7c","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734115609538,"created":1734080467028,"url":"http://localhost:8080/epics/n/subtasks","name":"/epic/n/subtasks","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076409622.3867,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_dc0221ebba8d44c69ee5965843ea7512","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734115745614,"created":1734115537455,"url":"http://localhost:8080/epics","name":"/epic","description":"","method":"POST","body":{"mimeType":"application/json","text":"\t{\n\t\t\"id\": 0,\n\t\t\"name\": \"Новый эпик API\",\n\t\t\"description\": \"Получен через API\",\n\t\t\"status\": \"NEW\",\n\t\t\"startTime\": \"06.01.2024 12:00:00.000\",\n\t\t\"durationTask\": \"PT52H\",\n\t\t\"endTime\": \"08.01.2024 15:00:00.000\"\n\t}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076409478.3594,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_8c6e9c9bd0bd49629663386a164055e3","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734115859430,"created":1734115567327,"url":"http://localhost:8080/epics/10","name":"/epic/n","description":"","method":"POST","body":{"mimeType":"application/json","text":"\t{\n\t\t\"id\": 10,\n\t\t\"name\": \"Новый эпик API обновление\",\n\t\t\"description\": \"Изменяется только название и описание\",\n\t\t\"status\": \"NEW\",\n\t\t\"startTime\": \"06.01.2024 12:00:00.000\",\n\t\t\"durationTask\": \"PT52H\",\n\t\t\"endTime\": \"08.01.2024 15:00:00.000\"\n\t}"},"parameters":[],"headers":[{"name":"Content-Type","value":"application/json"},{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076407750.0312,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_08f627a19b7b4a158a980cb18321d831","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734085968506,"created":1734082286278,"url":"http://localhost:8080/epics/5","name":"/epic/n","description":"","method":"DELETE","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734076406597.8125,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_1881cf394e93423b86538f3649b92080","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734070242943,"created":1734070146327,"url":"http://localhost:8080/history","name":"/history","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734070146327,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"req_06951da938d4402180313b11f2228ee1","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734109303678,"created":1734060193604,"url":"http://localhost:8080/prioritized","name":"/prioritized","description":"","method":"GET","body":{},"parameters":[],"headers":[{"name":"User-Agent","value":"insomnia/10.2.0"}],"authentication":{},"metaSortKey":-1734060193604,"isPrivate":false,"pathParameters":[],"settingStoreCookies":true,"settingSendCookies":true,"settingDisableRenderRequestBody":false,"settingEncodeUrl":true,"settingRebuildPath":true,"settingFollowRedirects":"global","_type":"request"},{"_id":"env_594f54134db4f56865ca2a58d3ef279b7721e95e","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734060176051,"created":1734060176051,"name":"Base Environment","data":{},"dataPropertyOrder":null,"color":null,"isPrivate":false,"metaSortKey":1734060176051,"environmentType":"kv","_type":"environment"},{"_id":"jar_594f54134db4f56865ca2a58d3ef279b7721e95e","parentId":"wrk_05194b500c0e48e38e0a11c82fa87a3c","modified":1734060176053,"created":1734060176053,"name":"Default Jar","cookies":[],"_type":"cookie_jar"}]}
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
_java-kanban_

# Трекер задач
### Согласно задания спринта № 8.
### Согласно задания спринта № 9.
## выполнено Филипповских Сергеем

В проекте в файле Insomnia_testTaskManager - шаблон для Insomnia для проведения тестов.
Получение списков, удаление и добавление новых объектов - вопросов нет.
При запросах на обновление в самом Json важно указывать существующий id,
он влияет на обработку и в строке запроса указывать его-же.

_**Когорта-53**_
1 change: 1 addition & 0 deletions java-kanban.iml
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,6 @@
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="gson-2.10.1" level="project" />
</component>
</module>
108 changes: 108 additions & 0 deletions src/main/HTTPserver/BaseHttp.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package main.HTTPserver;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import com.sun.net.httpserver.HttpExchange;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Optional;

// служебный класс с методами обработки запросов
class BaseHttp {
// Получение идентификатора задачи/подзадачи/эпика
static Optional<Integer> getId(String id) {
try {
return Optional.of(Integer.parseInt(id));
} catch (NumberFormatException exception) {
return Optional.empty();
}
}

// Получение и десериализация Json тела запроса -> в объекты
static <T> T fromJsonString(HttpExchange exchange, Class<T> clazz) throws IOException {
String body = new String(exchange.getRequestBody().readAllBytes(), StandardCharsets.UTF_8);
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.registerTypeAdapter(LocalDateTime.class, new LDTAdapter())
.registerTypeAdapter(Duration.class, new DAdapter())
.create();
return gson.fromJson(body, clazz);
}

// Сериализация объекта в JSON
static String toJsonString(Object object) {
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.registerTypeAdapter(LocalDateTime.class, new LDTAdapter())
.registerTypeAdapter(Duration.class, new DAdapter())
.create();
return gson.toJson(object);
}

// Адаптер для LocalDateTime
static class LDTAdapter extends TypeAdapter<LocalDateTime> {
private static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss.SSS");

@Override
public void write(JsonWriter jsonWriter, LocalDateTime localDateTime) throws IOException {
if (localDateTime != null) {
jsonWriter.value(localDateTime.format(dtf));
} else {
jsonWriter.nullValue();
}
}

@Override
public LocalDateTime read(final JsonReader jsonReader) throws IOException {
if (jsonReader.peek() != JsonToken.NULL) {
return LocalDateTime.parse(jsonReader.nextString(), dtf);
} else {
jsonReader.nextNull();
return null;
}
}
}

// Адаптер для Duration
static class DAdapter extends TypeAdapter<Duration> {
@Override
public void write(JsonWriter jsonWriter, Duration duration) throws IOException {
if (duration != null) {
jsonWriter.value(duration.toString());
} else {
jsonWriter.nullValue();
}
}

@Override
public Duration read(final JsonReader jsonReader) throws IOException {
if (jsonReader.peek() != JsonToken.NULL) {
return Duration.parse(jsonReader.nextString());
} else {
jsonReader.nextNull();
return null;
}
}
}

// Отправка ответа на запрос
static void sendResponse(HttpExchange exchange,
String responseString,
int responseCode) throws IOException {
byte[] resp = responseString.getBytes(StandardCharsets.UTF_8);
exchange.getResponseHeaders().add("Content-Type", "application/json;charset=utf-8");
exchange.sendResponseHeaders(responseCode, resp.length);
exchange.getResponseBody().write(resp);
exchange.close();
}

}
Loading
Loading