diff --git a/.gitpod.yml b/.gitpod.yml index 0d07d591b6ddd3b4cc0bc756df5d4f0a0eb61f33..8007b78f9c43050deb3b044cc4f18aa845a6434c 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -2,7 +2,7 @@ image: file: .gitpod.Dockerfile tasks: - - init: sdk use 16.0.0.j9-adpt + - init: sdk use java 16.0.0.j9-adpt command: cd todolist ports: diff --git a/todolist/core/src/main/java/todolist/core/TodoItem.java b/todolist/core/src/main/java/todolist/core/TodoItem.java index fd6b31ef2bcb9ff771172a0eae23295adf9db263..1ed4e2c2fc9f0c4e985fe016606b2409403c118a 100644 --- a/todolist/core/src/main/java/todolist/core/TodoItem.java +++ b/todolist/core/src/main/java/todolist/core/TodoItem.java @@ -2,6 +2,9 @@ package todolist.core; import java.time.LocalDateTime; +/** + * Core data of items in a TodoList. + */ public class TodoItem { private String text; diff --git a/todolist/core/src/main/java/todolist/core/TodoList.java b/todolist/core/src/main/java/todolist/core/TodoList.java index 8272bad1f9c66e972558414d71e7d2b3ea18934e..b8b8478eac2bb36b51b8e84082f442e0e35f8451 100644 --- a/todolist/core/src/main/java/todolist/core/TodoList.java +++ b/todolist/core/src/main/java/todolist/core/TodoList.java @@ -6,6 +6,9 @@ import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; +/** + * Lists of items in a todo list. + */ public class TodoList extends AbstractTodoList { private List<TodoItem> items = new ArrayList<>(); diff --git a/todolist/core/src/main/java/todolist/core/TodoListItem.java b/todolist/core/src/main/java/todolist/core/TodoListItem.java index 6ae3e187a70b0a260531cbfe87d35c8a3051bb67..688006ad6cf300e3e47a7a973057d0957eb38b7f 100644 --- a/todolist/core/src/main/java/todolist/core/TodoListItem.java +++ b/todolist/core/src/main/java/todolist/core/TodoListItem.java @@ -3,6 +3,9 @@ package todolist.core; import java.time.LocalDateTime; import java.util.Objects; +/** + * TodoItems that belong to a TodoList. + */ public class TodoListItem extends TodoItem { private final TodoList todoList; diff --git a/todolist/core/src/main/java/todolist/core/TodoListListener.java b/todolist/core/src/main/java/todolist/core/TodoListListener.java index d4f505cb55aeda42d9b10942f39ad65d3f8788c2..3821d78a85eb436ad27aac5f0d0f6e46cf38c349 100644 --- a/todolist/core/src/main/java/todolist/core/TodoListListener.java +++ b/todolist/core/src/main/java/todolist/core/TodoListListener.java @@ -1,5 +1,13 @@ package todolist.core; +/** + * Listener interface for changes to a TodoList. + */ public interface TodoListListener { + /** + * Notifies that the given TodoList has changed. + * + * @param list the changed TodoList + */ public void todoListChanged(TodoList list); } diff --git a/todolist/core/src/main/java/todolist/core/TodoModel.java b/todolist/core/src/main/java/todolist/core/TodoModel.java index d1229ab001c3bcb384368351d28ad606c7d05397..d4c541ab2e750b974b81d6aaaf279f7b4df6f1b8 100644 --- a/todolist/core/src/main/java/todolist/core/TodoModel.java +++ b/todolist/core/src/main/java/todolist/core/TodoModel.java @@ -4,6 +4,9 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; +/** + * The root container of Todo-related data. + */ public class TodoModel implements Iterable<AbstractTodoList> { private Map<String, AbstractTodoList> todoLists = new LinkedHashMap<>(); diff --git a/todolist/core/src/main/java/todolist/json/TodoModule.java b/todolist/core/src/main/java/todolist/json/TodoModule.java index 591baaca89046c27b505a460fd60f67d901a9130..ecf0a39d67e553a834be9ce0a944a10d72f2e95d 100644 --- a/todolist/core/src/main/java/todolist/json/TodoModule.java +++ b/todolist/core/src/main/java/todolist/json/TodoModule.java @@ -6,6 +6,9 @@ import todolist.core.AbstractTodoList; import todolist.core.TodoItem; import todolist.core.TodoModel; +/** + * A Jackson module for configuring JSON serialization of TodoModel instances. + */ @SuppressWarnings("serial") public class TodoModule extends SimpleModule { diff --git a/todolist/core/src/main/java/todolist/json/TodoPersistence.java b/todolist/core/src/main/java/todolist/json/TodoPersistence.java index f9fb7675b05b6c9a42799da6709eb5e9d002a85c..e4816eb55485987ccb78803bfe35981bc20d7d76 100644 --- a/todolist/core/src/main/java/todolist/json/TodoPersistence.java +++ b/todolist/core/src/main/java/todolist/json/TodoPersistence.java @@ -11,6 +11,10 @@ import java.nio.file.Path; import java.nio.file.Paths; import todolist.core.TodoModel; +/** + * Wrapper class for JSON serialization, + * to avoid direct compile dependencies on Jackson for other modules. + */ public class TodoPersistence { private ObjectMapper mapper; diff --git a/todolist/fxutil/src/main/java/fxutil/doc/DocumentPersistence.java b/todolist/fxutil/src/main/java/fxutil/doc/DocumentPersistence.java index 32c32ca980dd4b01ff523b824c0d44efc1229a29..3b879ae8ac51b118ee707cd1c30c8bebb66358be 100644 --- a/todolist/fxutil/src/main/java/fxutil/doc/DocumentPersistence.java +++ b/todolist/fxutil/src/main/java/fxutil/doc/DocumentPersistence.java @@ -1,4 +1,11 @@ package fxutil.doc; +/** + * Interface for the documents that can be loaded and saved, + * so they can support the operations of a file menu. + * + * @param <D> + * @param <L> + */ public interface DocumentPersistence<D, L> extends DocumentLoader<D>, DocumentSaver<D, L> { } diff --git a/todolist/fxutil/src/main/java/fxutil/doc/FileMenuController.java b/todolist/fxutil/src/main/java/fxutil/doc/FileMenuController.java index 3d7970806d7e622dc0cf4a16e6d27fe646a62344..bbc8aba0cddccd5c1cf57266923f52a0a9518ff4 100644 --- a/todolist/fxutil/src/main/java/fxutil/doc/FileMenuController.java +++ b/todolist/fxutil/src/main/java/fxutil/doc/FileMenuController.java @@ -23,6 +23,9 @@ import javafx.scene.control.MenuItem; import javafx.scene.control.TextInputDialog; import javafx.stage.FileChooser; +/** + * Controller for the file menu + */ public class FileMenuController { private DocumentStorage<File> documentStorage; diff --git a/todolist/integrationtests/pom.xml b/todolist/integrationtests/pom.xml index d4c151c82fa9764f6af525945c064ffdde5bc7b6..a2c110631d959acfa3fd365fee91d468241a34cd 100644 --- a/todolist/integrationtests/pom.xml +++ b/todolist/integrationtests/pom.xml @@ -31,7 +31,7 @@ <dependency> <groupId>it1901.todolist</groupId> - <artifactId>restserver</artifactId> + <artifactId>rest</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- https://pragmaticintegrator.wordpress.com/2010/10/22/using-a-war-module-as-dependency-in-maven/ diff --git a/todolist/integrationtests/src/main/webapp/WEB-INF/web.xml b/todolist/integrationtests/src/main/webapp/WEB-INF/web.xml index 242ce26522a396a330c63abe8e02cf9d44b9ca4b..2da888692eb7925b515565c1af442dd8f540b0d4 100644 --- a/todolist/integrationtests/src/main/webapp/WEB-INF/web.xml +++ b/todolist/integrationtests/src/main/webapp/WEB-INF/web.xml @@ -8,7 +8,7 @@ <servlet-name>todo</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> - <param-name>javax.ws.rs.Application</param-name> + <param-name>jakarta.ws.rs.Application</param-name> <param-value>todolist.restserver.TodoConfig</param-value> </init-param> </servlet> diff --git a/todolist/pom.xml b/todolist/pom.xml index 948fd7237008f15b95f652f19cfdd0fe6f5df78c..d1cfc40e2d27136cbb5882a9a97150be852fdd34 100644 --- a/todolist/pom.xml +++ b/todolist/pom.xml @@ -157,8 +157,7 @@ <module>core</module> <module>fxutil</module> <module>fxui</module> - <module>restapi</module> - <module>restserver</module> + <module>rest</module> <module>integrationtests</module> <module>springboot/restserver</module> </modules> diff --git a/todolist/restserver/pom.xml b/todolist/rest/pom.xml similarity index 82% rename from todolist/restserver/pom.xml rename to todolist/rest/pom.xml index 5c6d1bef0d9dc52d40151e549df9e7ea8715a01d..bfae03943b07a0a639c93edc38dc0853e94b591b 100644 --- a/todolist/restserver/pom.xml +++ b/todolist/rest/pom.xml @@ -9,8 +9,7 @@ <version>0.0.1-SNAPSHOT</version> </parent> - <artifactId>restserver</artifactId> - <packaging>jar</packaging> + <artifactId>rest</artifactId> <properties> <slf4jVersion>1.7.25</slf4jVersion> @@ -18,16 +17,29 @@ </properties> <dependencies> - <dependency> + <dependency> <groupId>it1901.todolist</groupId> <artifactId>core</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> - <groupId>it1901.todolist</groupId> - <artifactId>restapi</artifactId> - <version>0.0.1-SNAPSHOT</version> + <groupId>jakarta.ws.rs</groupId> + <artifactId>jakarta.ws.rs-api</artifactId> + <version>3.0.0</version> + </dependency> + + <dependency> + <groupId>javax.inject</groupId> + <artifactId>javax.inject</artifactId> + <version>1</version> + </dependency> + + <!-- Logging med slf4j --> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>${slf4jVersion}</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core --> @@ -55,14 +67,13 @@ <artifactId>mockito-core</artifactId> </dependency> - <!-- Her kommer web-server-avhengighetene --> - - <!-- Logging med slf4j --> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>${slf4jVersion}</version> - </dependency> + <!-- Logging med slf4j + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>${slf4jVersion}</version> + </dependency> + --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> @@ -80,14 +91,19 @@ <artifactId>jersey-server</artifactId> <version>${jerseyVersion}</version> </dependency> + <dependency> + <groupId>org.glassfish.jersey.inject</groupId> + <artifactId>jersey-hk2</artifactId> + <version>${jerseyVersion}</version> + </dependency> <dependency> <groupId>org.glassfish.jersey.media</groupId> - <artifactId>jersey-media-json-jackson</artifactId> + <artifactId>jersey-media-json-processing</artifactId> <version>${jerseyVersion}</version> </dependency> <dependency> - <groupId>org.glassfish.jersey.inject</groupId> - <artifactId>jersey-hk2</artifactId> + <groupId>org.glassfish.jersey.media</groupId> + <artifactId>jersey-media-json-jackson</artifactId> <version>${jerseyVersion}</version> </dependency> @@ -124,25 +140,26 @@ <version>1.1.1</version> <scope>runtime</scope> </dependency> + <!-- <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> <scope>runtime</scope> </dependency> - <dependency> - <groupId>com.sun.xml.bind</groupId> - <artifactId>jaxb-core</artifactId> - <version>2.3.0</version> - <scope>runtime</scope> - </dependency> - <dependency> - <groupId>com.sun.xml.bind</groupId> - <artifactId>jaxb-impl</artifactId> - <version>2.3.0</version> - <scope>runtime</scope> - </dependency> - + <dependency> + <groupId>com.sun.xml.bind</groupId> + <artifactId>jaxb-core</artifactId> + <version>2.3.0</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>com.sun.xml.bind</groupId> + <artifactId>jaxb-impl</artifactId> + <version>2.3.0</version> + <scope>runtime</scope> + </dependency> + --> </dependencies> <build> @@ -171,17 +188,6 @@ <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> </plugin> - - <!-- - https://pragmaticintegrator.wordpress.com/2010/10/22/using-a-war-module-as-dependency-in-maven/ - <plugin> - <artifactId>maven-war-plugin</artifactId> - <version>2.1-beta-1</version> - <configuration> - <attachClasses>true</attachClasses> - </configuration> - </plugin> - --> </plugins> </build> </project> diff --git a/todolist/restapi/src/main/java/todolist/restapi/TodoListResource.java b/todolist/rest/src/main/java/todolist/restapi/TodoListResource.java similarity index 93% rename from todolist/restapi/src/main/java/todolist/restapi/TodoListResource.java rename to todolist/rest/src/main/java/todolist/restapi/TodoListResource.java index 578203aabb8c1998880a19dc49e446eb53dea806..d4d08f66b2fe42de99716da5f251040e6507d782 100644 --- a/todolist/restapi/src/main/java/todolist/restapi/TodoListResource.java +++ b/todolist/rest/src/main/java/todolist/restapi/TodoListResource.java @@ -1,6 +1,5 @@ package todolist.restapi; -import java.io.IOException; import jakarta.ws.rs.Consumes; import jakarta.ws.rs.DELETE; import jakarta.ws.rs.GET; @@ -9,7 +8,9 @@ import jakarta.ws.rs.PUT; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.MediaType; +import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import todolist.core.AbstractTodoList; @@ -18,8 +19,9 @@ import todolist.core.TodoModel; import todolist.json.TodoPersistence; /** - * Used for all requests referring to TodoLists by name. + * Used for all requests referring to a TodoList by name. */ +@Produces(MediaType.APPLICATION_JSON) public class TodoListResource { private static final Logger LOG = LoggerFactory.getLogger(TodoListResource.class); @@ -28,6 +30,7 @@ public class TodoListResource { private final String name; private final AbstractTodoList todoList; + @Context private TodoPersistence todoPersistence; public void setTodoPersistence(TodoPersistence todoPersistence) { @@ -60,7 +63,6 @@ public class TodoListResource { * @return the corresponding TodoList */ @GET - @Produces(MediaType.APPLICATION_JSON) public AbstractTodoList getTodoList() { checkTodoList(); LOG.debug("getTodoList({})", name); @@ -85,7 +87,6 @@ public class TodoListResource { */ @PUT @Consumes(MediaType.APPLICATION_JSON) - @Produces(MediaType.APPLICATION_JSON) public boolean putTodoList(AbstractTodoList todoListArg) { LOG.debug("putTodoList({})", todoListArg); AbstractTodoList oldTodoList = this.todoModel.putTodoList(todoListArg); @@ -99,7 +100,6 @@ public class TodoListResource { * @return true if it was added, false if it replaced */ @PUT - @Produces(MediaType.APPLICATION_JSON) public boolean putTodoList() { return putTodoList(new TodoList(name)); } @@ -111,7 +111,6 @@ public class TodoListResource { */ @POST @Path("/rename") - @Produces(MediaType.APPLICATION_JSON) public boolean renameTodoList(@QueryParam("newName") String newName) { checkTodoList(); if (this.todoModel.getTodoList(newName) != null) { @@ -126,7 +125,6 @@ public class TodoListResource { * Removes the TodoList. */ @DELETE - @Produces(MediaType.APPLICATION_JSON) public boolean removeTodoList() { checkTodoList(); this.todoModel.removeTodoList(this.todoList); diff --git a/todolist/restapi/src/main/java/todolist/restapi/TodoModelService.java b/todolist/rest/src/main/java/todolist/restapi/TodoModelService.java similarity index 88% rename from todolist/restapi/src/main/java/todolist/restapi/TodoModelService.java rename to todolist/rest/src/main/java/todolist/restapi/TodoModelService.java index 174c08853e232a7723bc904b081aaf4c98954089..999804c56b5051c043572235d4ed2f5cc9905ee2 100644 --- a/todolist/restapi/src/main/java/todolist/restapi/TodoModelService.java +++ b/todolist/rest/src/main/java/todolist/restapi/TodoModelService.java @@ -1,28 +1,33 @@ package todolist.restapi; -import javax.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.MediaType; +import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import todolist.core.AbstractTodoList; import todolist.core.TodoModel; import todolist.json.TodoPersistence; +/** + * The top-level rest service for TodoModel. + */ @Path(TodoModelService.TODO_MODEL_SERVICE_PATH) +@Produces(MediaType.APPLICATION_JSON) public class TodoModelService { public static final String TODO_MODEL_SERVICE_PATH = "todo"; private static final Logger LOG = LoggerFactory.getLogger(TodoModelService.class); - @Inject + @Context private TodoModel todoModel; - @Inject + @Context private TodoPersistence todoPersistence; /** @@ -31,8 +36,8 @@ public class TodoModelService { * @return the TodoModel */ @GET - @Produces(MediaType.APPLICATION_JSON) public TodoModel getTodoModel() { + LOG.debug("getTodoModel: " + todoModel); return todoModel; } diff --git a/todolist/restserver/src/main/java/todolist/restserver/TodoConfig.java b/todolist/rest/src/main/java/todolist/restserver/TodoConfig.java similarity index 94% rename from todolist/restserver/src/main/java/todolist/restserver/TodoConfig.java rename to todolist/rest/src/main/java/todolist/restserver/TodoConfig.java index 4fb310577ea9ed5d958e3c692879ce2777c262a8..b95bd2052b6255fe003b65dbbe1b62abee0b0538 100644 --- a/todolist/restserver/src/main/java/todolist/restserver/TodoConfig.java +++ b/todolist/rest/src/main/java/todolist/restserver/TodoConfig.java @@ -13,6 +13,11 @@ import todolist.core.TodoModel; import todolist.json.TodoPersistence; import todolist.restapi.TodoModelService; +/** + * Configures the rest service, + * e.g. JSON support with Jackson and + * injectable TodoModel and TodoPersistance + */ public class TodoConfig extends ResourceConfig { private TodoModel todoModel; diff --git a/todolist/restserver/src/main/java/todolist/restserver/TodoModuleObjectMapperProvider.java b/todolist/rest/src/main/java/todolist/restserver/TodoModuleObjectMapperProvider.java similarity index 91% rename from todolist/restserver/src/main/java/todolist/restserver/TodoModuleObjectMapperProvider.java rename to todolist/rest/src/main/java/todolist/restserver/TodoModuleObjectMapperProvider.java index 0cab8a8e3ec681ec501e05b77a398fed6851de34..9846a28ab08063d3f9d2db1a1644b6a6c9ab6792 100644 --- a/todolist/restserver/src/main/java/todolist/restserver/TodoModuleObjectMapperProvider.java +++ b/todolist/rest/src/main/java/todolist/restserver/TodoModuleObjectMapperProvider.java @@ -8,6 +8,9 @@ import jakarta.ws.rs.ext.ContextResolver; import jakarta.ws.rs.ext.Provider; import todolist.json.TodoModule; +/** + * Provides the Jackson module used for JSON serialization. + */ @Provider @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) diff --git a/todolist/restserver/src/test/java/todolist/restserver/TodoServiceTest.java b/todolist/rest/src/test/java/todolist/restserver/TodoServiceTest.java similarity index 95% rename from todolist/restserver/src/test/java/todolist/restserver/TodoServiceTest.java rename to todolist/rest/src/test/java/todolist/restserver/TodoServiceTest.java index fe110324f9d8d846555749ea17da2bd7f7352e75..73c811358116f0809b7c941981e33c51621560e0 100644 --- a/todolist/restserver/src/test/java/todolist/restserver/TodoServiceTest.java +++ b/todolist/rest/src/test/java/todolist/restserver/TodoServiceTest.java @@ -40,21 +40,17 @@ public class TodoServiceTest extends JerseyTest { return config; } - @Override - protected TestContainerFactory getTestContainerFactory() throws TestContainerException { - return new GrizzlyTestContainerFactory(); - } - private ObjectMapper objectMapper; - @Override @BeforeEach + @Override public void setUp() throws Exception { super.setUp(); objectMapper = new TodoModuleObjectMapperProvider().getContext(getClass()); } @AfterEach + @Override public void tearDown() throws Exception { super.tearDown(); } diff --git a/todolist/restapi/pom.xml b/todolist/restapi/pom.xml deleted file mode 100644 index 3c8ab55785e7d5e87c77070e15ff3630408f4299..0000000000000000000000000000000000000000 --- a/todolist/restapi/pom.xml +++ /dev/null @@ -1,73 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <parent> - <groupId>it1901.todolist</groupId> - <artifactId>parent</artifactId> - <version>0.0.1-SNAPSHOT</version> - </parent> - - <artifactId>restapi</artifactId> - - <properties> - <slf4jVersion>1.7.25</slf4jVersion> - </properties> - - <dependencies> - <dependency> - <groupId>it1901.todolist</groupId> - <artifactId>core</artifactId> - <version>0.0.1-SNAPSHOT</version> - </dependency> - - <dependency> - <groupId>jakarta.ws.rs</groupId> - <artifactId>jakarta.ws.rs-api</artifactId> - <version>3.0.0</version> - </dependency> - - <dependency> - <groupId>javax.inject</groupId> - <artifactId>javax.inject</artifactId> - <version>1</version> - </dependency> - - <!-- Logging med slf4j --> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>${slf4jVersion}</version> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <artifactId>maven-compiler-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - </plugin> - <!-- Run the checkstyle code quality tool --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-checkstyle-plugin</artifactId> - </plugin> - - <!-- Run the spotbugs code quality tool --> - <plugin> - <groupId>com.github.spotbugs</groupId> - <artifactId>spotbugs-maven-plugin</artifactId> - </plugin> - - <!-- Configure jacoco code coverage --> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> - </plugins> - </build> -</project> diff --git a/todolist/restserver/src/main/resources/todolist/restserver/default-todomodel.json b/todolist/restserver/src/main/resources/todolist/restserver/default-todomodel.json deleted file mode 100644 index 51ccb07b39a984b3f9f6591683c1b1d9759b0bf3..0000000000000000000000000000000000000000 --- a/todolist/restserver/src/main/resources/todolist/restserver/default-todomodel.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "lists": [ - { - "name": "todo1", - "items": [ - ] - }, - { - "name": "todo2", - "items": [ - ] - } - ] -} \ No newline at end of file