diff --git a/.gitignore b/.gitignore
index 9dbe206..1ca1eda 100644
--- a/.gitignore
+++ b/.gitignore
@@ -46,3 +46,7 @@ api-sandbox/app/api.spec.json
/xcpdata.trace.db
web-ui/vue-app/TODO.md
web-ui/vue-app/src/generated/*
+/api-sandbox/src/main/resources/htdocs/api-sandbox/
+api-sandbox/app/dist/api.spec.json
+api-sandbox/app/node/
+api.spec.json
diff --git a/api-sandbox/app/main.js b/api-sandbox/app/main.js
index b710857..81e646e 100644
--- a/api-sandbox/app/main.js
+++ b/api-sandbox/app/main.js
@@ -2,6 +2,7 @@ import $ from 'jquery'
let apiSpec = null
let currentUser = null
+const apiEndpoint = "/api";
async function loadUserProfile() {
try {
@@ -12,7 +13,7 @@ async function loadUserProfile() {
id: Date.now()
}
- const response = await fetch('http://localhost:8080/api', {
+ const response = await fetch(apiEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
@@ -215,7 +216,7 @@ async function sendRequest() {
$('#request').text('')
try {
- const response = await fetch('http://localhost:8080/api', {
+ const response = await fetch(apiEndpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
diff --git a/api-sandbox/app/vite.config.js b/api-sandbox/app/vite.config.js
index 30f647c..c826595 100644
--- a/api-sandbox/app/vite.config.js
+++ b/api-sandbox/app/vite.config.js
@@ -5,7 +5,7 @@ import copy from 'rollup-plugin-copy'
export default defineConfig({
root: '.',
build: {
- outDir: 'dist',
+ outDir: '../src/main/resources/htdocs/api-sandbox',
rollupOptions: {
plugins: [
copy({
diff --git a/api-sandbox/pom.xml b/api-sandbox/pom.xml
index 5976d02..9ee28ae 100644
--- a/api-sandbox/pom.xml
+++ b/api-sandbox/pom.xml
@@ -17,4 +17,48 @@
UTF-8
+
+
+
+ com.github.eirslett
+ frontend-maven-plugin
+ 1.15.0
+
+ app
+ app
+
+
+
+ install node and npm
+
+ install-node-and-npm
+
+
+ v22.12.0
+ 10.8.2
+
+
+
+ npm install
+
+ npm
+
+
+ install
+
+
+
+ npm build
+
+ npm
+
+
+ run build
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/api-spec-generator/src/main/java/ru/kirillius/XCP/ApiGenerator/SpecGenerator.java b/api-spec-generator/src/main/java/ru/kirillius/XCP/ApiGenerator/SpecGenerator.java
index 54353cb..6b0212b 100644
--- a/api-spec-generator/src/main/java/ru/kirillius/XCP/ApiGenerator/SpecGenerator.java
+++ b/api-spec-generator/src/main/java/ru/kirillius/XCP/ApiGenerator/SpecGenerator.java
@@ -122,9 +122,28 @@ public class SpecGenerator {
continue;
}
+ for (var aClass : classAnnotation.directInheritors()) {
+ if (!types.contains(aClass)) {
+ types.add(aClass);
+ typesQueue.add(aClass);
+ }
+ }
+
var typeDescriptor = typesArray.addObject();
typeDescriptor.put("name", classAnnotation.alias().isEmpty() ? type.getSimpleName() : classAnnotation.alias());
typeDescriptor.put("type", "class");
+ var parents = typeDescriptor.putArray("parents");
+ for (var aClass : type.getInterfaces()) {
+ if (!types.contains(aClass)) {
+ types.add(aClass);
+ typesQueue.add(aClass);
+ }
+ if (!aClass.isAnnotationPresent(GenerateApiSpec.class)) {
+ continue;
+ }
+ parents.add(aClass.getSimpleName());
+ }
+
var fields = typeDescriptor.putArray("fields");
for (var method : type.getMethods()) {
var methodAnnotation = method.getAnnotation(GenerateApiSpec.class);
diff --git a/api/src/main/java/ru/kirillius/XCP/Commons/GenerateApiSpec.java b/api/src/main/java/ru/kirillius/XCP/Commons/GenerateApiSpec.java
index be9bae8..bd69736 100644
--- a/api/src/main/java/ru/kirillius/XCP/Commons/GenerateApiSpec.java
+++ b/api/src/main/java/ru/kirillius/XCP/Commons/GenerateApiSpec.java
@@ -11,4 +11,6 @@ public @interface GenerateApiSpec {
String alias() default "";
Class> type() default void.class;
+
+ Class>[] directInheritors() default {};
}