Init project

This commit is contained in:
max 2025-03-25 10:23:17 +07:00
commit 2dddff0199
22 changed files with 1874 additions and 0 deletions

38
.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

8
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

7
.idea/encodings.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

17
.idea/misc.xml Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_X" default="true" project-jdk-name="openjdk-24" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

171
pom.xml Normal file
View File

@ -0,0 +1,171 @@
<?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>
<groupId>ru.cft.booklib</groupId>
<artifactId>cft-book-library</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<compiler-plugin.version>3.14.0</compiler-plugin.version>
<maven.compiler.release>21</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
<quarkus.platform.version>3.19.4</quarkus.platform.version>
<skipITs>true</skipITs>
<surefire-plugin.version>3.5.2</surefire-plugin.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>${quarkus.platform.artifact-id}</artifactId>
<version>${quarkus.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.18.3</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.platform.version}</version>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>build</goal>
<goal>generate-code</goal>
<goal>generate-code-tests</goal>
<goal>native-image-agent</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<parameters>true</parameters>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<configuration>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
<configuration>
<systemPropertyVariables>
<native.image.path>${project.build.directory}/${project.build.finalName}-runner
</native.image.path>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
</configuration>
</plugin>
<!-- Генератор контроллера. -->
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>7.8.0</version>
<configuration>
<inputSpec>${project.basedir}/src/main/resources/openapi/book-library.yaml</inputSpec>
<generatorName>jaxrs-spec</generatorName>
<apiPackage>ru.cft.booklib.controller</apiPackage>
<modelPackage>ru.cft.booklib.model</modelPackage>
<supportingFilesToGenerate>
ApiUtil.java
</supportingFilesToGenerate>
<additionalProperties>interfaceOnly=true,useSwaggerAnnotations=false</additionalProperties>
<configOptions>
<library>quarkus</library>
<delegatePattern>true</delegatePattern>
<sourceFolder>src/main/java</sourceFolder>
<implFolder>src/main/java</implFolder>
</configOptions>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>native</id>
<activation>
<property>
<name>native</name>
</property>
</activation>
<properties>
<skipITs>false</skipITs>
<quarkus.native.enabled>true</quarkus.native.enabled>
</properties>
</profile>
</profiles>
</project>

View File

@ -0,0 +1,25 @@
package ru.cft.booklib;
import io.quarkus.runtime.Quarkus;
import io.quarkus.runtime.QuarkusApplication;
import io.quarkus.runtime.annotations.QuarkusMain;
@QuarkusMain
public class Main {
public static void main(String... args) {
Quarkus.run(MyApp.class,
(exitCode, exception) -> {
// do whatever
},
args);
}
public static class MyApp implements QuarkusApplication {
@Override
public int run(String... args) throws Exception {
Quarkus.waitForExit();
return 0;
}
}
}

View File

@ -0,0 +1,22 @@
package ru.cft.booklib.controller;
import jakarta.ws.rs.*;
import ru.cft.booklib.model.Book;
import ru.cft.booklib.model.BookCreate;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
@Path("/books")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen", date = "2025-03-24T21:29:52.803984263+07:00[Asia/Novosibirsk]", comments = "Generator version: 7.8.0")
public interface BooksApi {
@POST
@Consumes({"application/json"})
@Produces({"application/json"})
Book bookPost(@Valid @NotNull BookCreate bookCreate);
@GET
@Produces({"application/json"})
List<Book> booksGet();
}

View File

@ -0,0 +1,22 @@
package ru.cft.booklib.controller;
import jakarta.ws.rs.*;
import ru.cft.booklib.model.Reader;
import ru.cft.booklib.model.ReaderCreate;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
@Path("/readers")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen", date = "2025-03-24T21:29:52.803984263+07:00[Asia/Novosibirsk]", comments = "Generator version: 7.8.0")
public interface ReadersApi {
@POST
@Consumes({ "application/json" })
@Produces({ "application/json" })
Reader readerPost(@Valid @NotNull ReaderCreate readerCreate);
@GET
@Produces({ "application/json" })
List<Reader> readersGet();
}

View File

@ -0,0 +1,21 @@
package ru.cft.booklib.controller;
import jakarta.validation.constraints.NotNull;
import jakarta.ws.rs.*;
import ru.cft.booklib.model.Transaction;
import ru.cft.booklib.model.TransactionCreate;
import java.util.List;
@Path("/transactions")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen", date = "2025-03-24T21:29:52.803984263+07:00[Asia/Novosibirsk]", comments = "Generator version: 7.8.0")
public interface TransactionsApi {
@GET
@Produces({ "application/json" })
List<Transaction> transactionsGet();
@POST
@Consumes({ "application/json" })
@Produces({ "application/json" })
Transaction transactionsPost(@NotNull TransactionCreate transactionCreate);
}

View File

@ -0,0 +1,23 @@
package ru.cft.booklib.controller.impl;
import ru.cft.booklib.controller.BooksApi;
import ru.cft.booklib.model.Book;
import ru.cft.booklib.model.BookCreate;
import java.util.List;
public class BooksApiImpl implements BooksApi {
@Override
public Book bookPost(BookCreate bookCreate) {
return null;
}
@Override
public List<Book> booksGet() {
var book = new Book();
book.setId(1);
book.setTitle("1984");
return List.of(book);
}
}

View File

@ -0,0 +1,19 @@
package ru.cft.booklib.controller.impl;
import ru.cft.booklib.controller.ReadersApi;
import ru.cft.booklib.model.Reader;
import ru.cft.booklib.model.ReaderCreate;
import java.util.List;
public class ReadersApiImpl implements ReadersApi {
@Override
public Reader readerPost(ReaderCreate readerCreate) {
return null;
}
@Override
public List<Reader> readersGet() {
return List.of();
}
}

View File

@ -0,0 +1,19 @@
package ru.cft.booklib.controller.impl;
import ru.cft.booklib.controller.TransactionsApi;
import ru.cft.booklib.model.Transaction;
import ru.cft.booklib.model.TransactionCreate;
import java.util.List;
public class TransactionsApiImpl implements TransactionsApi {
@Override
public List<Transaction> transactionsGet() {
return List.of();
}
@Override
public Transaction transactionsPost(TransactionCreate transactionCreate) {
return null;
}
}

View File

@ -0,0 +1,180 @@
package ru.cft.booklib.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
import javax.validation.Valid;
import javax.validation.constraints.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* Книга
**/
@JsonTypeName("Book")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen", date = "2025-03-24T21:29:52.803984263+07:00[Asia/Novosibirsk]", comments = "Generator version: 7.8.0")
public class Book {
private String title;
private @Valid List<String> authors = new ArrayList<>();
private Integer year;
private String genre;
private Integer id;
/**
**/
public Book title(String title) {
this.title = title;
return this;
}
@JsonProperty("title")
@NotNull public String getTitle() {
return title;
}
@JsonProperty("title")
public void setTitle(String title) {
this.title = title;
}
/**
**/
public Book authors(List<String> authors) {
this.authors = authors;
return this;
}
@JsonProperty("authors")
@NotNull @Size(min=1)public List<String> getAuthors() {
return authors;
}
@JsonProperty("authors")
public void setAuthors(List<String> authors) {
this.authors = authors;
}
public Book addAuthorsItem(String authorsItem) {
if (this.authors == null) {
this.authors = new ArrayList<>();
}
this.authors.add(authorsItem);
return this;
}
public Book removeAuthorsItem(String authorsItem) {
if (authorsItem != null && this.authors != null) {
this.authors.remove(authorsItem);
}
return this;
}
/**
**/
public Book year(Integer year) {
this.year = year;
return this;
}
@JsonProperty("year")
public Integer getYear() {
return year;
}
@JsonProperty("year")
public void setYear(Integer year) {
this.year = year;
}
/**
**/
public Book genre(String genre) {
this.genre = genre;
return this;
}
@JsonProperty("genre")
public String getGenre() {
return genre;
}
@JsonProperty("genre")
public void setGenre(String genre) {
this.genre = genre;
}
/**
**/
public Book id(Integer id) {
this.id = id;
return this;
}
@JsonProperty("id")
@NotNull public Integer getId() {
return id;
}
@JsonProperty("id")
public void setId(Integer id) {
this.id = id;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Book book = (Book) o;
return Objects.equals(this.title, book.title) &&
Objects.equals(this.authors, book.authors) &&
Objects.equals(this.year, book.year) &&
Objects.equals(this.genre, book.genre) &&
Objects.equals(this.id, book.id);
}
@Override
public int hashCode() {
return Objects.hash(title, authors, year, genre, id);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class Book {\n");
sb.append(" title: ").append(toIndentedString(title)).append("\n");
sb.append(" authors: ").append(toIndentedString(authors)).append("\n");
sb.append(" year: ").append(toIndentedString(year)).append("\n");
sb.append(" genre: ").append(toIndentedString(genre)).append("\n");
sb.append(" id: ").append(toIndentedString(id)).append("\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}

View File

@ -0,0 +1,160 @@
package ru.cft.booklib.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* Создание книги
**/
@JsonTypeName("BookCreate")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen", date = "2025-03-24T21:29:52.803984263+07:00[Asia/Novosibirsk]", comments = "Generator version: 7.8.0")
public class BookCreate {
private String title;
private @Valid List<String> authors = new ArrayList<>();
private Integer year;
private String genre;
/**
**/
public BookCreate title(String title) {
this.title = title;
return this;
}
@JsonProperty("title")
@NotNull public String getTitle() {
return title;
}
@JsonProperty("title")
public void setTitle(String title) {
this.title = title;
}
/**
**/
public BookCreate authors(List<String> authors) {
this.authors = authors;
return this;
}
@JsonProperty("authors")
@NotNull @Size(min=1)public List<String> getAuthors() {
return authors;
}
@JsonProperty("authors")
public void setAuthors(List<String> authors) {
this.authors = authors;
}
public BookCreate addAuthorsItem(String authorsItem) {
if (this.authors == null) {
this.authors = new ArrayList<>();
}
this.authors.add(authorsItem);
return this;
}
public BookCreate removeAuthorsItem(String authorsItem) {
if (authorsItem != null && this.authors != null) {
this.authors.remove(authorsItem);
}
return this;
}
/**
**/
public BookCreate year(Integer year) {
this.year = year;
return this;
}
@JsonProperty("year")
public Integer getYear() {
return year;
}
@JsonProperty("year")
public void setYear(Integer year) {
this.year = year;
}
/**
**/
public BookCreate genre(String genre) {
this.genre = genre;
return this;
}
@JsonProperty("genre")
public String getGenre() {
return genre;
}
@JsonProperty("genre")
public void setGenre(String genre) {
this.genre = genre;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
BookCreate bookCreate = (BookCreate) o;
return Objects.equals(this.title, bookCreate.title) &&
Objects.equals(this.authors, bookCreate.authors) &&
Objects.equals(this.year, bookCreate.year) &&
Objects.equals(this.genre, bookCreate.genre);
}
@Override
public int hashCode() {
return Objects.hash(title, authors, year, genre);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class BookCreate {\n");
sb.append(" title: ").append(toIndentedString(title)).append("\n");
sb.append(" authors: ").append(toIndentedString(authors)).append("\n");
sb.append(" year: ").append(toIndentedString(year)).append("\n");
sb.append(" genre: ").append(toIndentedString(genre)).append("\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}

View File

@ -0,0 +1,98 @@
package ru.cft.booklib.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
import javax.validation.constraints.NotNull;
import java.util.Objects;
/**
* Http ошибка
**/
@JsonTypeName("Error")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen", date = "2025-03-24T21:29:52.803984263+07:00[Asia/Novosibirsk]", comments = "Generator version: 7.8.0")
public class Error {
private Integer code;
private String message;
/**
**/
public Error code(Integer code) {
this.code = code;
return this;
}
@JsonProperty("code")
@NotNull public Integer getCode() {
return code;
}
@JsonProperty("code")
public void setCode(Integer code) {
this.code = code;
}
/**
**/
public Error message(String message) {
this.message = message;
return this;
}
@JsonProperty("message")
@NotNull public String getMessage() {
return message;
}
@JsonProperty("message")
public void setMessage(String message) {
this.message = message;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Error error = (Error) o;
return Objects.equals(this.code, error.code) &&
Objects.equals(this.message, error.message);
}
@Override
public int hashCode() {
return Objects.hash(code, message);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class Error {\n");
sb.append(" code: ").append(toIndentedString(code)).append("\n");
sb.append(" message: ").append(toIndentedString(message)).append("\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}

View File

@ -0,0 +1,189 @@
package ru.cft.booklib.model;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.annotation.JsonValue;
import javax.validation.constraints.NotNull;
import java.util.Objects;
/**
* Читатель
**/
@JsonTypeName("Reader")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen", date = "2025-03-24T21:29:52.803984263+07:00[Asia/Novosibirsk]", comments = "Generator version: 7.8.0")
public class Reader {
private String fullName;
public enum GenderEnum {
MAN(String.valueOf("man")), FEMAIL(String.valueOf("femail"));
private String value;
GenderEnum (String v) {
value = v;
}
public String value() {
return value;
}
@Override
@JsonValue
public String toString() {
return String.valueOf(value);
}
/**
* Convert a String into String, as specified in the
* <a href="https://download.oracle.com/otndocs/jcp/jaxrs-2_0-fr-eval-spec/index.html">See JAX RS 2.0 Specification, section 3.2, p. 12</a>
*/
public static GenderEnum fromString(String s) {
for (GenderEnum b : GenderEnum.values()) {
// using Objects.toString() to be safe if value type non-object type
// because types like 'int' etc. will be auto-boxed
if (java.util.Objects.toString(b.value).equals(s)) {
return b;
}
}
throw new IllegalArgumentException("Unexpected string value '" + s + "'");
}
@JsonCreator
public static GenderEnum fromValue(String value) {
for (GenderEnum b : GenderEnum.values()) {
if (b.value.equals(value)) {
return b;
}
}
throw new IllegalArgumentException("Unexpected value '" + value + "'");
}
}
private GenderEnum gender;
private Integer age;
private Integer id;
/**
**/
public Reader fullName(String fullName) {
this.fullName = fullName;
return this;
}
@JsonProperty("fullName")
@NotNull public String getFullName() {
return fullName;
}
@JsonProperty("fullName")
public void setFullName(String fullName) {
this.fullName = fullName;
}
/**
**/
public Reader gender(GenderEnum gender) {
this.gender = gender;
return this;
}
@JsonProperty("gender")
public GenderEnum getGender() {
return gender;
}
@JsonProperty("gender")
public void setGender(GenderEnum gender) {
this.gender = gender;
}
/**
**/
public Reader age(Integer age) {
this.age = age;
return this;
}
@JsonProperty("age")
public Integer getAge() {
return age;
}
@JsonProperty("age")
public void setAge(Integer age) {
this.age = age;
}
/**
**/
public Reader id(Integer id) {
this.id = id;
return this;
}
@JsonProperty("id")
@NotNull public Integer getId() {
return id;
}
@JsonProperty("id")
public void setId(Integer id) {
this.id = id;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Reader reader = (Reader) o;
return Objects.equals(this.fullName, reader.fullName) &&
Objects.equals(this.gender, reader.gender) &&
Objects.equals(this.age, reader.age) &&
Objects.equals(this.id, reader.id);
}
@Override
public int hashCode() {
return Objects.hash(fullName, gender, age, id);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class Reader {\n");
sb.append(" fullName: ").append(toIndentedString(fullName)).append("\n");
sb.append(" gender: ").append(toIndentedString(gender)).append("\n");
sb.append(" age: ").append(toIndentedString(age)).append("\n");
sb.append(" id: ").append(toIndentedString(id)).append("\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}

View File

@ -0,0 +1,168 @@
package ru.cft.booklib.model;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.annotation.JsonValue;
import javax.validation.constraints.NotNull;
import java.util.Objects;
/**
* Добавление читателя
**/
@JsonTypeName("ReaderCreate")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen", date = "2025-03-24T21:29:52.803984263+07:00[Asia/Novosibirsk]", comments = "Generator version: 7.8.0")
public class ReaderCreate {
private String fullName;
public enum GenderEnum {
MAN(String.valueOf("man")), FEMAIL(String.valueOf("femail"));
private String value;
GenderEnum (String v) {
value = v;
}
public String value() {
return value;
}
@Override
@JsonValue
public String toString() {
return String.valueOf(value);
}
/**
* Convert a String into String, as specified in the
* <a href="https://download.oracle.com/otndocs/jcp/jaxrs-2_0-fr-eval-spec/index.html">See JAX RS 2.0 Specification, section 3.2, p. 12</a>
*/
public static GenderEnum fromString(String s) {
for (GenderEnum b : GenderEnum.values()) {
// using Objects.toString() to be safe if value type non-object type
// because types like 'int' etc. will be auto-boxed
if (java.util.Objects.toString(b.value).equals(s)) {
return b;
}
}
throw new IllegalArgumentException("Unexpected string value '" + s + "'");
}
@JsonCreator
public static GenderEnum fromValue(String value) {
for (GenderEnum b : GenderEnum.values()) {
if (b.value.equals(value)) {
return b;
}
}
throw new IllegalArgumentException("Unexpected value '" + value + "'");
}
}
private GenderEnum gender;
private Integer age;
/**
**/
public ReaderCreate fullName(String fullName) {
this.fullName = fullName;
return this;
}
@JsonProperty("fullName")
@NotNull public String getFullName() {
return fullName;
}
@JsonProperty("fullName")
public void setFullName(String fullName) {
this.fullName = fullName;
}
/**
**/
public ReaderCreate gender(GenderEnum gender) {
this.gender = gender;
return this;
}
@JsonProperty("gender")
public GenderEnum getGender() {
return gender;
}
@JsonProperty("gender")
public void setGender(GenderEnum gender) {
this.gender = gender;
}
/**
**/
public ReaderCreate age(Integer age) {
this.age = age;
return this;
}
@JsonProperty("age")
public Integer getAge() {
return age;
}
@JsonProperty("age")
public void setAge(Integer age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ReaderCreate readerCreate = (ReaderCreate) o;
return Objects.equals(this.fullName, readerCreate.fullName) &&
Objects.equals(this.gender, readerCreate.gender) &&
Objects.equals(this.age, readerCreate.age);
}
@Override
public int hashCode() {
return Objects.hash(fullName, gender, age);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class ReaderCreate {\n");
sb.append(" fullName: ").append(toIndentedString(fullName)).append("\n");
sb.append(" gender: ").append(toIndentedString(gender)).append("\n");
sb.append(" age: ").append(toIndentedString(age)).append("\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}

View File

@ -0,0 +1,214 @@
package ru.cft.booklib.model;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.annotation.JsonValue;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.Objects;
/**
* Выдача или возврат книги
**/
@JsonTypeName("Transaction")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen", date = "2025-03-24T21:29:52.803984263+07:00[Asia/Novosibirsk]", comments = "Generator version: 7.8.0")
public class Transaction {
private Integer readerId;
private Integer bookId;
public enum ActionEnum {
BORROW(String.valueOf("borrow")), RETURN(String.valueOf("return"));
private String value;
ActionEnum (String v) {
value = v;
}
public String value() {
return value;
}
@Override
@JsonValue
public String toString() {
return String.valueOf(value);
}
/**
* Convert a String into String, as specified in the
* <a href="https://download.oracle.com/otndocs/jcp/jaxrs-2_0-fr-eval-spec/index.html">See JAX RS 2.0 Specification, section 3.2, p. 12</a>
*/
public static ActionEnum fromString(String s) {
for (ActionEnum b : ActionEnum.values()) {
// using Objects.toString() to be safe if value type non-object type
// because types like 'int' etc. will be auto-boxed
if (java.util.Objects.toString(b.value).equals(s)) {
return b;
}
}
throw new IllegalArgumentException("Unexpected string value '" + s + "'");
}
@JsonCreator
public static ActionEnum fromValue(String value) {
for (ActionEnum b : ActionEnum.values()) {
if (b.value.equals(value)) {
return b;
}
}
throw new IllegalArgumentException("Unexpected value '" + value + "'");
}
}
private ActionEnum action;
private Date date;
private Integer id;
/**
* ID читателя
**/
public Transaction readerId(Integer readerId) {
this.readerId = readerId;
return this;
}
@JsonProperty("readerId")
@NotNull public Integer getReaderId() {
return readerId;
}
@JsonProperty("readerId")
public void setReaderId(Integer readerId) {
this.readerId = readerId;
}
/**
* ID книги
**/
public Transaction bookId(Integer bookId) {
this.bookId = bookId;
return this;
}
@JsonProperty("bookId")
@NotNull public Integer getBookId() {
return bookId;
}
@JsonProperty("bookId")
public void setBookId(Integer bookId) {
this.bookId = bookId;
}
/**
**/
public Transaction action(ActionEnum action) {
this.action = action;
return this;
}
@JsonProperty("action")
@NotNull public ActionEnum getAction() {
return action;
}
@JsonProperty("action")
public void setAction(ActionEnum action) {
this.action = action;
}
/**
**/
public Transaction date(Date date) {
this.date = date;
return this;
}
@JsonProperty("date")
@NotNull public Date getDate() {
return date;
}
@JsonProperty("date")
public void setDate(Date date) {
this.date = date;
}
/**
* ID транзакции
**/
public Transaction id(Integer id) {
this.id = id;
return this;
}
@JsonProperty("id")
@NotNull public Integer getId() {
return id;
}
@JsonProperty("id")
public void setId(Integer id) {
this.id = id;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Transaction transaction = (Transaction) o;
return Objects.equals(this.readerId, transaction.readerId) &&
Objects.equals(this.bookId, transaction.bookId) &&
Objects.equals(this.action, transaction.action) &&
Objects.equals(this.date, transaction.date) &&
Objects.equals(this.id, transaction.id);
}
@Override
public int hashCode() {
return Objects.hash(readerId, bookId, action, date, id);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class Transaction {\n");
sb.append(" readerId: ").append(toIndentedString(readerId)).append("\n");
sb.append(" bookId: ").append(toIndentedString(bookId)).append("\n");
sb.append(" action: ").append(toIndentedString(action)).append("\n");
sb.append(" date: ").append(toIndentedString(date)).append("\n");
sb.append(" id: ").append(toIndentedString(id)).append("\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}

View File

@ -0,0 +1,192 @@
package ru.cft.booklib.model;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.annotation.JsonValue;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.Objects;
/**
* Создание записи о выдаче или возврате книги
**/
@JsonTypeName("TransactionCreate")
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaJAXRSSpecServerCodegen", date = "2025-03-24T21:29:52.803984263+07:00[Asia/Novosibirsk]", comments = "Generator version: 7.8.0")
public class TransactionCreate {
private Integer readerId;
private Integer bookId;
public enum ActionEnum {
BORROW(String.valueOf("borrow")), RETURN(String.valueOf("return"));
private String value;
ActionEnum (String v) {
value = v;
}
public String value() {
return value;
}
@Override
@JsonValue
public String toString() {
return String.valueOf(value);
}
/**
* Convert a String into String, as specified in the
* <a href="https://download.oracle.com/otndocs/jcp/jaxrs-2_0-fr-eval-spec/index.html">See JAX RS 2.0 Specification, section 3.2, p. 12</a>
*/
public static ActionEnum fromString(String s) {
for (ActionEnum b : ActionEnum.values()) {
// using Objects.toString() to be safe if value type non-object type
// because types like 'int' etc. will be auto-boxed
if (java.util.Objects.toString(b.value).equals(s)) {
return b;
}
}
throw new IllegalArgumentException("Unexpected string value '" + s + "'");
}
@JsonCreator
public static ActionEnum fromValue(String value) {
for (ActionEnum b : ActionEnum.values()) {
if (b.value.equals(value)) {
return b;
}
}
throw new IllegalArgumentException("Unexpected value '" + value + "'");
}
}
private ActionEnum action;
private Date date;
/**
* ID читателя
**/
public TransactionCreate readerId(Integer readerId) {
this.readerId = readerId;
return this;
}
@JsonProperty("readerId")
@NotNull public Integer getReaderId() {
return readerId;
}
@JsonProperty("readerId")
public void setReaderId(Integer readerId) {
this.readerId = readerId;
}
/**
* ID книги
**/
public TransactionCreate bookId(Integer bookId) {
this.bookId = bookId;
return this;
}
@JsonProperty("bookId")
@NotNull public Integer getBookId() {
return bookId;
}
@JsonProperty("bookId")
public void setBookId(Integer bookId) {
this.bookId = bookId;
}
/**
**/
public TransactionCreate action(ActionEnum action) {
this.action = action;
return this;
}
@JsonProperty("action")
@NotNull public ActionEnum getAction() {
return action;
}
@JsonProperty("action")
public void setAction(ActionEnum action) {
this.action = action;
}
/**
**/
public TransactionCreate date(Date date) {
this.date = date;
return this;
}
@JsonProperty("date")
@NotNull public Date getDate() {
return date;
}
@JsonProperty("date")
public void setDate(Date date) {
this.date = date;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
TransactionCreate transactionCreate = (TransactionCreate) o;
return Objects.equals(this.readerId, transactionCreate.readerId) &&
Objects.equals(this.bookId, transactionCreate.bookId) &&
Objects.equals(this.action, transactionCreate.action) &&
Objects.equals(this.date, transactionCreate.date);
}
@Override
public int hashCode() {
return Objects.hash(readerId, bookId, action, date);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("class TransactionCreate {\n");
sb.append(" readerId: ").append(toIndentedString(readerId)).append("\n");
sb.append(" bookId: ").append(toIndentedString(bookId)).append("\n");
sb.append(" action: ").append(toIndentedString(action)).append("\n");
sb.append(" date: ").append(toIndentedString(date)).append("\n");
sb.append("}");
return sb.toString();
}
/**
* Convert the given object to string with each line indented by 4 spaces
* (except the first line).
*/
private String toIndentedString(Object o) {
if (o == null) {
return "null";
}
return o.toString().replace("\n", "\n ");
}
}

View File

@ -0,0 +1,13 @@
{
"dateLibrary": "java8",
"useJakartaEe": true,
"hideGenerationTimestamp": true,
"modelPackage": "com.model",
"apiPackage": "com.model.rest",
"invokerPackage": "com.model.rest",
"serializableModel": true,
"useTags": true,
"useGzipFeature": true,
"interfaceOnly": true,
"java17" : true
}

View File

@ -0,0 +1,262 @@
openapi: 3.0.1
info:
title: Library Automation API
description: API для автоматизации работы библиотеки
version: 1.0.0
contact:
name: Max Rogov
servers:
- url: /api/v1
description: Основной сервер API
paths:
/books:
get:
summary: Получить список книг
operationId: booksGet
security:
- BasicAuth: []
responses:
'200':
description: Список книг
content:
application/json:
schema:
$ref: '#/components/schemas/Books'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'500':
$ref: '#/components/responses/InternalServerError'
post:
summary: Добавить новую книгу
operationId: bookPost
security:
- BasicAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BookCreate'
responses:
'201':
description: Книга добавлена
content:
application/json:
schema:
$ref: '#/components/schemas/Book'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'500':
$ref: '#/components/responses/InternalServerError'
/readers:
get:
summary: Получить список читателей
operationId: readersGet
security:
- BasicAuth: []
responses:
'200':
description: Список читателей
content:
application/json:
schema:
$ref: '#/components/schemas/Readers'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'500':
$ref: '#/components/responses/InternalServerError'
post:
summary: Добавить читателя
operationId: readerPost
security:
- BasicAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ReaderCreate'
responses:
'201':
description: Читатель добавлен
content:
application/json:
schema:
$ref: '#/components/schemas/Reader'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'500':
$ref: '#/components/responses/InternalServerError'
/transactions:
get:
summary: Получить список транзакций
operationId: transactionsGet
security:
- BasicAuth: []
responses:
'200':
description: Список транзакций
content:
application/json:
schema:
$ref: '#/components/schemas/Transactions'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'500':
$ref: '#/components/responses/InternalServerError'
post:
summary: Оформить выдачу/возврат книги
operationId: transactionsPost
security:
- BasicAuth: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TransactionCreate'
responses:
'201':
description: Транзакция зарегистрирована
content:
application/json:
schema:
$ref: '#/components/schemas/Transaction'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'500':
$ref: '#/components/responses/InternalServerError'
components:
securitySchemes:
BasicAuth:
type: http
scheme: basic
responses:
BadRequest:
description: Bad request
Unauthorized:
description: Unauthorized
Forbidden:
description: Forbidden
InternalServerError:
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
Books:
type: array
items:
$ref: '#/components/schemas/Book'
Book:
description: Книга
allOf:
- properties:
id:
type: integer
required: [id]
- $ref: '#/components/schemas/BookCreate'
BookCreate:
description: Создание книги
properties:
title:
type: string
authors:
type: array
minItems: 1
items:
type: string
year:
type: integer
genre:
type: string
required: [title, authors]
Readers:
type: array
items:
$ref: '#/components/schemas/Reader'
Reader:
description: Читатель
allOf:
- properties:
id:
type: integer
required: [id]
- $ref: '#/components/schemas/ReaderCreate'
ReaderCreate:
description: Добавление читателя
properties:
fullName:
type: string
gender:
type: string
enum: [man, femail]
x-enumNames: [man, femail]
age:
type: integer
required: [fullName]
Transactions:
description: Список транзакций
type: array
items:
$ref: '#/components/schemas/Transaction'
Transaction:
description: Выдача или возврат книги
allOf:
- properties:
id:
description: ID транзакции
type: integer
required: [id]
- $ref: '#/components/schemas/TransactionCreate'
TransactionCreate:
description: Создание записи о выдаче или возврате книги
properties:
readerId:
description: ID читателя
type: integer
bookId:
description: ID книги
type: integer
action:
type: string
enum: [borrow, return]
x-enumNames: [borrow, return]
date:
type: string
format: date-time
required: [readerId, bookId, action, date]
Error:
description: Http ошибка
properties:
code:
type: integer
message:
type: string
required: [code, message]