Compare commits
110 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e4ff85f336 | ||
![]() |
ba2d6e25a9 | ||
![]() |
688a57836d | ||
![]() |
7686ed845b | ||
![]() |
aea5ebf43f | ||
![]() |
1dc9eed99d | ||
![]() |
0c7bba3e42 | ||
![]() |
ad270ce83b | ||
![]() |
2777931a21 | ||
![]() |
8ecfe57b96 | ||
![]() |
092239c225 | ||
![]() |
0f3d2e18b3 | ||
![]() |
5020454135 | ||
![]() |
061fc51138 | ||
![]() |
c5b714b609 | ||
![]() |
d23f1a945c | ||
50f0c903f4 | |||
15dfdd8605 | |||
ba7b6e4755 | |||
3beafab7e1 | |||
9cf41dd094 | |||
4caec9a54a | |||
83f8ec0e9b | |||
4993c17136 | |||
401e2ce3c5 | |||
693d59ab68 | |||
4eff2e55ef | |||
1e890f9524 | |||
dbb2527cb8 | |||
d65faa8810 | |||
9c9476b052 | |||
3e92c2b74a | |||
a7134c01ed | |||
88b27e5f39 | |||
eaf0f5688e | |||
4ebfa4e2ca | |||
c65e7d5e25 | |||
de61cc156f | |||
4d18438914 | |||
80dfabcf48 | |||
83bfeda4ca | |||
c489fabb77 | |||
d52052de90 | |||
91defa42c2 | |||
2812d21782 | |||
eb5a366a12 | |||
6b801d250f | |||
01fad1b9d4 | |||
371bea79f9 | |||
35725e1320 | |||
d6a8c7d23f | |||
3c604e9593 | |||
43d8108270 | |||
1a883193d0 | |||
78b1970ba9 | |||
746d5dff96 | |||
8780ea8e63 | |||
8911eed0fb | |||
1a3652472e | |||
2e62577103 | |||
653e77160b | |||
3898a6bf4f | |||
448cf1569b | |||
d3e2b3e601 | |||
8f026d47e1 | |||
de17fc228d | |||
3434a48573 | |||
8f1934e323 | |||
1631d1cab9 | |||
b71ea1bcd8 | |||
db1e387ac8 | |||
762a1aeced | |||
670b5537bb | |||
16e7197939 | |||
98d213b01e | |||
0260b4d408 | |||
f03a18c34c | |||
6107b95dcd | |||
e9af64405b | |||
725cd54d92 | |||
08eb0f878a | |||
619e9aa4b8 | |||
6181022814 | |||
3f96b870a0 | |||
5eba6d32b6 | |||
a24484b5f9 | |||
77f8527fc4 | |||
75cca15898 | |||
f0b2a859db | |||
a6fe889d4c | |||
ad7ff2c340 | |||
1271885124 | |||
dde514a1a0 | |||
dc7131843d | |||
091390e025 | |||
3377f80fbc | |||
4cf71f35b6 | |||
faaf3b280b | |||
0687369164 | |||
147264eb7f | |||
ec93c31acb | |||
873f0acff5 | |||
244f8a988e | |||
d49e1d06fe | |||
53c3cfefe3 | |||
90fb1ed411 | |||
30bc82edb3 | |||
1d4c547d89 | |||
21d53b77f2 | |||
3b27edfa3b |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -53,6 +53,8 @@ testem.log
|
||||
# System Files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
/env_dev/data
|
||||
/env_dev/dataMongo
|
||||
|
||||
backPY/env
|
||||
|
||||
@@ -62,3 +64,5 @@ __pycache__
|
||||
|
||||
.design/
|
||||
.vscode/
|
||||
front/storybook-static
|
||||
back/bin
|
||||
|
@@ -5,7 +5,7 @@ version_file="../version.txt"
|
||||
# update new release dependency
|
||||
cd back
|
||||
# update the Maven version number
|
||||
mvn versions:set -DnewVersion=$(sed 's/DEV/SNAPSHOT/g' $version_file)
|
||||
mvn versions:set -DnewVersion=$(sed 's/dev/SNAPSHOT/g' $version_file)
|
||||
if grep -q "DEV" "$version_file"; then
|
||||
# update all versions release of dependency
|
||||
mvn versions:use-latest-releases
|
||||
@@ -19,11 +19,14 @@ cd -
|
||||
|
||||
|
||||
cd front
|
||||
if grep -q "DEV" "$version_file"; then
|
||||
if grep -q "dev" "$version_file"; then
|
||||
# update all dependency
|
||||
pnpm install
|
||||
pnpm run update_packages
|
||||
else
|
||||
# in case of release ==> can not do it automatically ...
|
||||
echo not implemented
|
||||
fi
|
||||
|
||||
cd -
|
||||
|
||||
|
96
Dockerfile
96
Dockerfile
@@ -3,23 +3,31 @@
|
||||
## buyilding-end install applications:
|
||||
##
|
||||
######################################################################################
|
||||
FROM archlinux:base-devel AS builder
|
||||
FROM archlinux:base-devel AS common
|
||||
# update system
|
||||
RUN pacman -Syu --noconfirm && pacman-db-upgrade \
|
||||
&& pacman -S --noconfirm jdk-openjdk maven npm pnpm \
|
||||
&& pacman -S --noconfirm jdk-openjdk wget\
|
||||
&& pacman -Scc --noconfirm
|
||||
|
||||
ENV PATH /tmp/node_modules/.bin:$PATH
|
||||
WORKDIR /tmp
|
||||
|
||||
FROM common AS builder
|
||||
# update system
|
||||
RUN pacman -Syu --noconfirm && pacman-db-upgrade \
|
||||
&& pacman -S --noconfirm maven npm pnpm \
|
||||
&& pacman -Scc --noconfirm
|
||||
|
||||
ENV PATH=/tmp/node_modules/.bin:$PATH
|
||||
|
||||
######################################################################################
|
||||
##
|
||||
## Build back:
|
||||
##
|
||||
######################################################################################
|
||||
FROM builder AS buildBack
|
||||
COPY back/pom.xml /tmp
|
||||
COPY back/src /tmp/src/
|
||||
FROM builder AS build_back
|
||||
COPY back/pom.xml ./
|
||||
COPY back/Formatter.xml ./
|
||||
COPY back/src ./src/
|
||||
RUN mvn clean compile assembly:single
|
||||
|
||||
######################################################################################
|
||||
@@ -27,27 +35,45 @@ RUN mvn clean compile assembly:single
|
||||
## Build front:
|
||||
##
|
||||
######################################################################################
|
||||
FROM builder AS buildFront
|
||||
FROM builder AS dependency_front
|
||||
|
||||
RUN echo "@kangaroo-and-rabbit:registry=https://gitea.atria-soft.org/api/packages/kangaroo-and-rabbit/npm/" > /root/.npmrc
|
||||
|
||||
ADD front/package.json \
|
||||
front/karma.conf.js \
|
||||
front/protractor.conf.js \
|
||||
/tmp/
|
||||
front/pnpm-lock.yaml \
|
||||
./
|
||||
ADD front/src/theme ./src/theme
|
||||
|
||||
# install and cache app dependencies
|
||||
RUN pnpm install
|
||||
RUN pnpm install --prod=false
|
||||
|
||||
ADD front/e2e \
|
||||
###############################################################
|
||||
## Install sources
|
||||
###############################################################
|
||||
FROM dependency_front AS load_sources_front
|
||||
|
||||
# JUST to get the vertion of the application and his sha...
|
||||
COPY \
|
||||
front/tsconfig.json \
|
||||
front/tslint.json \
|
||||
front/angular.json \
|
||||
/tmp/
|
||||
ADD front/src /tmp/src
|
||||
front/tsconfig.node.json \
|
||||
front/vite.config.mts \
|
||||
front/index.html \
|
||||
./
|
||||
|
||||
# generate build
|
||||
RUN ng build --output-path=dist --configuration=production --base-href=/karusic/ --deploy-url=/karusic/
|
||||
COPY front/public ./public
|
||||
COPY front/public/icons ./public/icons
|
||||
COPY front/src ./src
|
||||
|
||||
#We are not in prod mode ==> we need to overwrite the production env.
|
||||
ARG env=front/.env.production
|
||||
COPY ${env} .env
|
||||
|
||||
###############################################################
|
||||
## Build the sources
|
||||
###############################################################
|
||||
FROM load_sources_front AS build_front
|
||||
# build in bundle mode all the application
|
||||
RUN pnpm static:build
|
||||
|
||||
######################################################################################
|
||||
##
|
||||
@@ -55,26 +81,24 @@ RUN ng build --output-path=dist --configuration=production --base-href=/karusic/
|
||||
##
|
||||
######################################################################################
|
||||
|
||||
FROM bellsoft/liberica-openjdk-alpine:latest
|
||||
# add wget to manage the health check...
|
||||
RUN apk add --no-cache wget
|
||||
FROM bellsoft/liberica-openjdk-alpine-musl:latest
|
||||
|
||||
#FROM archlinux:base
|
||||
#RUN pacman -Syu --noconfirm && pacman-db-upgrade
|
||||
## install package
|
||||
#RUN pacman -S --noconfirm jdk-openjdk wget
|
||||
## intall npm
|
||||
#RUN pacman -S --noconfirm npm
|
||||
## clean all the caches Need only on the release environment
|
||||
#RUN pacman -Scc --noconfirm
|
||||
RUN apk add --no-cache wget \
|
||||
&& addgroup -g 1000 user \
|
||||
&& adduser --system -u 1000 -G user user
|
||||
|
||||
ENV LANG=C.UTF-8
|
||||
|
||||
COPY --from=buildBack /tmp/out/maven/*.jar /application/application.jar
|
||||
COPY --from=buildFront /tmp/dist /application/front/
|
||||
|
||||
WORKDIR /application/
|
||||
|
||||
EXPOSE 80
|
||||
WORKDIR /application/
|
||||
RUN chown user:user -R /application
|
||||
|
||||
CMD ["java", "-Xms64M", "-Xmx1G", "-cp", "/application/application.jar", "org.kar.karusic.WebLauncher"]
|
||||
# To verify health-check: docker inspect --format "{{json .State.Health }}" YOUR_SERVICE_NAME | jq
|
||||
HEALTHCHECK --start-period=10s --start-interval=2s --interval=30s --timeout=5s --retries=10 \
|
||||
CMD wget --no-verbose --tries=1 --spider http://localhost:80/api/health_check || exit 1
|
||||
|
||||
CMD ["java", "-Xms64M", "-Xmx1G", "-cp", "/application/application.jar", "org.atriasoft.karusic.WebLauncher"]
|
||||
|
||||
COPY --chown=user:user --from=build_back /tmp/out/maven/*.jar /application/application.jar
|
||||
COPY --chown=user:user --from=build_front /tmp/dist /application/front/
|
||||
|
||||
USER user
|
||||
|
125
README.md
Normal file
125
README.md
Normal file
@@ -0,0 +1,125 @@
|
||||
Karusic
|
||||
=======
|
||||
|
||||
**K**angaroo **A**nd **R**abbit (m)usic is a simple framework to propose music streaming for personal network
|
||||
|
||||
Run in local:
|
||||
=============
|
||||
|
||||
Start tools
|
||||
-----------
|
||||
|
||||
Start the server basic interfaces: (DB(mySQL), Adminer)
|
||||
|
||||
```{.bash}
|
||||
# start the Bdd interface (no big data > 50Mo)
|
||||
docker compose -f env_dev/docker-compose.yaml up -d
|
||||
```
|
||||
|
||||
Start the Back-end:
|
||||
-------------------
|
||||
|
||||
backend is developed in JAVA
|
||||
|
||||
The first step is configuring your JAVA version (or select the JVM with the OS)
|
||||
```bash
|
||||
export PATH=$(ls -d --color=never /usr/lib/jvm/java-2*-openjdk)/bin:$PATH
|
||||
```
|
||||
|
||||
Install the dependency:
|
||||
```bash
|
||||
mvn install
|
||||
```
|
||||
|
||||
Run the test
|
||||
```bash
|
||||
mvn test
|
||||
```
|
||||
|
||||
Install it for external use
|
||||
```bash
|
||||
mvn install
|
||||
```
|
||||
|
||||
Execute the local server:
|
||||
```bash
|
||||
mvn exec:java@dev-mode
|
||||
```
|
||||
|
||||
Start the Front-end:
|
||||
--------------------
|
||||
|
||||
backend is developed in JAVA
|
||||
```bash
|
||||
cd front
|
||||
pnpm install
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
Display the result:
|
||||
-------------------
|
||||
|
||||
[show the webpage: http://localhost:4203](http://localhost:4203)
|
||||
|
||||
Some other dev tools:
|
||||
=====================
|
||||
|
||||
Format code:
|
||||
------------
|
||||
|
||||
```bash
|
||||
export PATH=$(ls -d --color=never /usr/lib/jvm/java-2*-openjdk)/bin:$PATH
|
||||
mvn formatter:format
|
||||
mvn test
|
||||
```
|
||||
|
||||
Tools in production mode
|
||||
========================
|
||||
|
||||
Changing the Log Level
|
||||
----------------------
|
||||
|
||||
In a production environment, you can adjust the log level to help diagnose bugs more effectively.
|
||||
|
||||
The available log levels are:
|
||||
| **Log Level Tag** | **org.atriasoft.karusic** | **org.kar.archidata** | **other** |
|
||||
| ----------------- | ------------------- | --------------------- | --------- |
|
||||
| `prod` | INFO | INFO | INFO |
|
||||
| `prod-debug` | DEBUG | INFO | INFO |
|
||||
| `prod-trace` | TRACE | DEBUG | INFO |
|
||||
| `prod-trace-full` | TRACE | TRACE | INFO |
|
||||
| `dev` | TRACE | DEBUG | INFO |
|
||||
|
||||
|
||||
Manual set in production:
|
||||
=========================
|
||||
|
||||
Connect on the registry
|
||||
------------------------
|
||||
|
||||
To log-in and log-out from the registry:
|
||||
```bash
|
||||
export REGISTRY_ADDRESS=gitea.atria-soft.org
|
||||
docker login -u <<YOUR_USER_NAME>> ${REGISTRY_ADDRESS}
|
||||
docker logout ${REGISTRY_ADDRESS}
|
||||
```
|
||||
|
||||
pull the root image of dockers
|
||||
------------------------------
|
||||
|
||||
```bash
|
||||
docker pull archlinux:base-devel
|
||||
docker pull bellsoft/liberica-openjdk-alpine:latest
|
||||
```
|
||||
|
||||
Create the version
|
||||
------------------
|
||||
|
||||
Execute in the local folder: (use ```dev``` for development and ```latest``` for production release)
|
||||
|
||||
```bash
|
||||
export TAG_DOCKER=latest
|
||||
export REGISTRY_ADDRESS=gitea.atria-soft.org
|
||||
docker build -t ${REGISTRY_ADDRESS}/kangaroo-and-rabbit/karusic:${TAG_DOCKER} .
|
||||
docker push ${REGISTRY_ADDRESS}/kangaroo-and-rabbit/karusic:${TAG_DOCKER}
|
||||
```
|
@@ -53,6 +53,9 @@ Checkstyle configuration that checks the sun coding conventions.
|
||||
<module name="LambdaParameterName"/>
|
||||
<module name="Regexp"/>
|
||||
<module name="RegexpSinglelineJava"/>
|
||||
<module name="UnusedPrivateField">
|
||||
<property name="ignorePattern" value="LOGGER"/>
|
||||
</module>
|
||||
</module>
|
||||
<module name="BeforeExecutionExclusionFileFilter">
|
||||
<property name="fileNamePattern" value="module\-info\.java$"/>
|
||||
|
@@ -1,21 +0,0 @@
|
||||
FROM maven:3-openjdk-18 AS build
|
||||
|
||||
COPY pom.xml /tmp/
|
||||
COPY src /tmp/src/
|
||||
WORKDIR /tmp/
|
||||
RUN mvn clean compile assembly:single
|
||||
|
||||
FROM bellsoft/liberica-openjdk-alpine:latest
|
||||
ENV LANG=C.UTF-8
|
||||
|
||||
# add wget to manage the health check...
|
||||
RUN apk add --no-cache wget
|
||||
|
||||
RUN mkdir /application/
|
||||
COPY --from=build /tmp/out/maven/*.jar /application/application.jar
|
||||
WORKDIR /application/
|
||||
|
||||
EXPOSE 18080
|
||||
|
||||
CMD ["java", "-Xms64M", "-Xmx1G", "-cp", "/application/application.jar", "org.kar.karusic.WebLauncher"]
|
||||
|
@@ -11,7 +11,7 @@ mvn package
|
||||
// download all dependency in out/maven/dependency
|
||||
mvn dependency:copy-dependencies
|
||||
|
||||
java -cp out/maven/kar-karusic-0.1.0.jar org.kar.karusic.WebLauncher
|
||||
java -cp out/maven/kar-karusic-0.1.0.jar org.atriasoft.karusic.WebLauncher
|
||||
|
||||
|
||||
// create a single package jar
|
||||
@@ -19,7 +19,7 @@ mvn clean compile assembly:single
|
||||
|
||||
|
||||
|
||||
java -cp out/maven/karusic-0.1.0-jar-with-dependencies.jar org.kar.karusic.WebLauncher
|
||||
java -cp out/maven/karusic-0.1.0-jar-with-dependencies.jar org.atriasoft.karusic.WebLauncher
|
||||
|
||||
|
||||
|
||||
|
@@ -1,4 +0,0 @@
|
||||
|
||||
|
||||
|
||||
|
191
back/pom.xml
191
back/pom.xml
@@ -1,36 +1,41 @@
|
||||
<?xml version="1.0"?>
|
||||
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.kar</groupId>
|
||||
<groupId>org.atriasoft</groupId>
|
||||
<artifactId>karusic</artifactId>
|
||||
<version>0.1.0</version>
|
||||
<properties>
|
||||
|
||||
<maven.compiler.version>3.1</maven.compiler.version>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
<maven.dependency.version>3.1.1</maven.dependency.version>
|
||||
</properties>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>gitea</id>
|
||||
<url>https://gitea.atria-soft.org/api/packages/kangaroo-and-rabbit/maven</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<version>1.2.1-SNAPSHOT</version>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>kangaroo-and-rabbit</groupId>
|
||||
<groupId>org.atria-soft</groupId>
|
||||
<artifactId>archidata</artifactId>
|
||||
<version>0.7.1</version>
|
||||
<version>0.37.2</version>
|
||||
</dependency>
|
||||
<!-- Loopback of logger JDK logging API to SLF4J -->
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-simple</artifactId>
|
||||
<artifactId>jul-to-slf4j</artifactId>
|
||||
<version>2.0.9</version>
|
||||
</dependency>
|
||||
<!-- generic logger of SLF4J to console (in color) -->
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
<version>1.4.11</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>xerces</groupId>
|
||||
<artifactId>xercesImpl</artifactId>
|
||||
<version>2.12.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.codehaus.janino</groupId>
|
||||
<artifactId>janino</artifactId>
|
||||
<version>3.1.9</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.datatype</groupId>
|
||||
<artifactId>jackson-datatype-jsr310</artifactId>
|
||||
<version>2.16.1</version>
|
||||
<version>2.18.3</version>
|
||||
</dependency>
|
||||
<!--
|
||||
************************************************************
|
||||
@@ -40,15 +45,25 @@
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<version>5.10.1</version>
|
||||
<version>5.12.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-engine</artifactId>
|
||||
<version>5.10.1</version>
|
||||
<version>5.12.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.revelc.code.formatter</groupId>
|
||||
<artifactId>formatter-maven-plugin</artifactId>
|
||||
<version>2.25.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||
<version>3.6.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<sourceDirectory>src</sourceDirectory>
|
||||
@@ -68,25 +83,54 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>${maven.compiler.version}</version>
|
||||
<version>3.14.0</version>
|
||||
<configuration>
|
||||
<source>${maven.compiler.source}</source>
|
||||
<target>${maven.compiler.target}</target>
|
||||
<source>21</source>
|
||||
<target>21</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<version>1.4.0</version>
|
||||
<version>3.2.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>prod-mode</id>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>org.kar.karusic.WebLauncher</mainClass>
|
||||
<mainClass>org.atriasoft.karusic.WebLauncher</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>dev-mode</id>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>org.atriasoft.karusic.WebLauncherLocal</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>generate-api</id>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<mainClass>org.atriasoft.karusic.GenerateApi</mainClass>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<mainClass/>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!-- Create the source bundle -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<version>3.2.1</version>
|
||||
<version>4.0.0-beta-1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-sources</id>
|
||||
@@ -100,10 +144,12 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>3.0.0-M5</version>
|
||||
<version>3.2.5</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<version>3.7.1</version>
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifest>
|
||||
@@ -115,94 +161,21 @@
|
||||
</descriptorRefs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!-- Create coverage -->
|
||||
<!--
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
<version>0.8.10</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>prepare-agent</id>
|
||||
<goals>
|
||||
<goal>prepare-agent</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>report</id>
|
||||
<phase>test</phase>
|
||||
<goals>
|
||||
<goal>report</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>jacoco-check</id>
|
||||
<goals>
|
||||
<goal>check</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<rules>
|
||||
<rule>
|
||||
<element>PACKAGE</element>
|
||||
<limits>
|
||||
<limit>
|
||||
<counter>LINE</counter>
|
||||
<value>COVEREDRATIO</value>
|
||||
<minimum>0.50</minimum>
|
||||
</limit>
|
||||
</limits>
|
||||
</rule>
|
||||
</rules>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
-->
|
||||
<!-- Java-doc generation for stand-alone site -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<version>3.3.0</version>
|
||||
<configuration>
|
||||
<show>private</show>
|
||||
<nohelp>true</nohelp>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<version>3.1.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>exec-application</id>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<mainClass>org.kar.karusic.WebLauncher</mainClass>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!-- Check the style of the code -->
|
||||
<!--
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||
<version>3.1.0</version>
|
||||
<configuration>
|
||||
<configLocation>CheckStyle.xml</configLocation>
|
||||
<consoleOutput>true</consoleOutput>
|
||||
<failOnViolation>true</failOnViolation>
|
||||
<failsOnError>true</failsOnError>
|
||||
<includeTestSourceDirectory>true</includeTestSourceDirectory>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>net.revelc.code.formatter</groupId>
|
||||
<artifactId>formatter-maven-plugin</artifactId>
|
||||
<version>2.12.2</version>
|
||||
<version>2.24.1</version>
|
||||
<configuration>
|
||||
<encoding>UTF-8</encoding>
|
||||
<lineEnding>LF</lineEnding>
|
||||
@@ -226,7 +199,15 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
-->
|
||||
<plugin>
|
||||
<groupId>com.github.spotbugs</groupId>
|
||||
<artifactId>spotbugs-maven-plugin</artifactId>
|
||||
<version>4.8.5.0</version>
|
||||
<configuration>
|
||||
<includeFilterFile>spotbugs-security-include.xml</includeFilterFile>
|
||||
<excludeFilterFile>spotbugs-security-exclude.xml</excludeFilterFile>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<!-- Generate Java-docs As Part Of Project Reports -->
|
||||
@@ -235,7 +216,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<version>3.3.0</version>
|
||||
<configuration>
|
||||
<show>public</show>
|
||||
</configuration>
|
||||
|
258
back/pom.xml.versionsBackup
Normal file
258
back/pom.xml.versionsBackup
Normal file
@@ -0,0 +1,258 @@
|
||||
<?xml version="1.0"?>
|
||||
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.kar</groupId>
|
||||
<artifactId>karusic</artifactId>
|
||||
<version>0.1.0</version>
|
||||
<properties>
|
||||
<maven.compiler.version>3.1</maven.compiler.version>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
<maven.dependency.version>3.1.1</maven.dependency.version>
|
||||
</properties>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>gitea</id>
|
||||
<url>https://gitea.atria-soft.org/api/packages/kangaroo-and-rabbit/maven</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>kangaroo-and-rabbit</groupId>
|
||||
<artifactId>archidata</artifactId>
|
||||
<version>0.14.3-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-simple</artifactId>
|
||||
<version>2.1.0-alpha1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.datatype</groupId>
|
||||
<artifactId>jackson-datatype-jsr310</artifactId>
|
||||
<version>2.18.0-rc1</version>
|
||||
</dependency>
|
||||
<!--
|
||||
************************************************************
|
||||
** TEST dependency **
|
||||
************************************************************
|
||||
-->
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<version>5.11.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-engine</artifactId>
|
||||
<version>5.11.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.revelc.code.formatter</groupId>
|
||||
<artifactId>formatter-maven-plugin</artifactId>
|
||||
<version>2.24.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||
<version>3.5.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<sourceDirectory>src</sourceDirectory>
|
||||
<testSourceDirectory>test/src</testSourceDirectory>
|
||||
<directory>${project.basedir}/out/maven/</directory>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/resources</directory>
|
||||
</resource>
|
||||
</resources>
|
||||
<testResources>
|
||||
<testResource>
|
||||
<directory>${basedir}/test/resources</directory>
|
||||
</testResource>
|
||||
</testResources>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>${maven.compiler.version}</version>
|
||||
<configuration>
|
||||
<source>${maven.compiler.source}</source>
|
||||
<target>${maven.compiler.target}</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<version>1.4.0</version>
|
||||
<configuration>
|
||||
<mainClass>org.kar.karusic.WebLauncher</mainClass>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!-- Create the source bundle -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<version>3.2.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-sources</id>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<!-- junit results -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>3.0.0-M5</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifest>
|
||||
<mainClass>fully.qualified.MainClass</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
<descriptorRefs>
|
||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||
</descriptorRefs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!-- Create coverage -->
|
||||
<!--
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
<version>0.8.10</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>prepare-agent</id>
|
||||
<goals>
|
||||
<goal>prepare-agent</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>report</id>
|
||||
<phase>test</phase>
|
||||
<goals>
|
||||
<goal>report</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>jacoco-check</id>
|
||||
<goals>
|
||||
<goal>check</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<rules>
|
||||
<rule>
|
||||
<element>PACKAGE</element>
|
||||
<limits>
|
||||
<limit>
|
||||
<counter>LINE</counter>
|
||||
<value>COVEREDRATIO</value>
|
||||
<minimum>0.50</minimum>
|
||||
</limit>
|
||||
</limits>
|
||||
</rule>
|
||||
</rules>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
-->
|
||||
<!-- Java-doc generation for stand-alone site -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<configuration>
|
||||
<show>private</show>
|
||||
<nohelp>true</nohelp>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>exec-maven-plugin</artifactId>
|
||||
<version>3.1.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>exec-application</id>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>java</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<mainClass>org.kar.karusic.WebLauncher</mainClass>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!-- Check the style of the code -->
|
||||
<plugin>
|
||||
<groupId>net.revelc.code.formatter</groupId>
|
||||
<artifactId>formatter-maven-plugin</artifactId>
|
||||
<version>2.23.0</version>
|
||||
<configuration>
|
||||
<encoding>UTF-8</encoding>
|
||||
<lineEnding>LF</lineEnding>
|
||||
<configFile>Formatter.xml</configFile>
|
||||
<directories>
|
||||
<directory>src/</directory>
|
||||
<directory>test/src</directory>
|
||||
</directories>
|
||||
<includes>
|
||||
<include>**/*.java</include>
|
||||
</includes>
|
||||
<excludes>
|
||||
<exclude>module-info.java</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>validate</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>com.github.spotbugs</groupId>
|
||||
<artifactId>spotbugs-maven-plugin</artifactId>
|
||||
<version>4.8.5.0</version>
|
||||
<configuration>
|
||||
<includeFilterFile>spotbugs-security-include.xml</includeFilterFile>
|
||||
<excludeFilterFile>spotbugs-security-exclude.xml</excludeFilterFile>
|
||||
<!--<plugins>
|
||||
<plugin>
|
||||
<groupId>com.h3xstream.findsecbugs</groupId>
|
||||
<artifactId>findsecbugs-plugin</artifactId>
|
||||
<version>1.12.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
-->
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<!-- Generate Java-docs As Part Of Project Reports -->
|
||||
<reporting>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<configuration>
|
||||
<show>public</show>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</reporting>
|
||||
</project>
|
@@ -1,9 +1,9 @@
|
||||
org.kar.karideo.dataTmpFolder=/application/data/tmp
|
||||
org.kar.karideo.dataTmpFolder=/application/data/media
|
||||
org.kar.karideo.rest.oauth=http://192.168.1.156:21080/oauth/api/
|
||||
org.kar.karideo.db.host=1992.156.1.156
|
||||
org.kar.karideo.db.port=20306
|
||||
org.kar.karideo.db.login=root
|
||||
org.kar.karideo.db.port=klkhj456gkgtkhjgvkujfhjgkjhgsdfhb3467465fgdhdesfgh
|
||||
org.kar.karideo.db.name=karideo
|
||||
org.kar.karideo.address=http://0.0.0.0:18080/karideo/api/
|
||||
org.atriasoft.karideo.dataTmpFolder=/application/data/tmp
|
||||
org.atriasoft.karideo.dataTmpFolder=/application/data/media
|
||||
org.atriasoft.karideo.rest.oauth=http://192.168.1.156:21080/oauth/api/
|
||||
org.atriasoft.karideo.db.host=1992.156.1.156
|
||||
org.atriasoft.karideo.db.port=20306
|
||||
org.atriasoft.karideo.db.login=root
|
||||
org.atriasoft.karideo.db.port=klkhj456gkgtkhjgvkujfhjgkjhgsdfhb3467465fgdhdesfgh
|
||||
org.atriasoft.karideo.db.name=karideo
|
||||
org.atriasoft.karideo.address=http://0.0.0.0:18080/karideo/api/
|
||||
|
27
back/src/org/atriasoft/karusic/CodecBson/UUIDCodec.java
Normal file
27
back/src/org/atriasoft/karusic/CodecBson/UUIDCodec.java
Normal file
@@ -0,0 +1,27 @@
|
||||
package org.atriasoft.karusic.CodecBson;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import org.bson.BsonReader;
|
||||
import org.bson.BsonWriter;
|
||||
import org.bson.codecs.Codec;
|
||||
import org.bson.codecs.DecoderContext;
|
||||
import org.bson.codecs.EncoderContext;
|
||||
|
||||
public class UUIDCodec implements Codec<UUID> {
|
||||
|
||||
@Override
|
||||
public UUID decode(final BsonReader reader, final DecoderContext decoderContext) {
|
||||
return UUID.fromString(reader.readString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void encode(final BsonWriter writer, final UUID value, final EncoderContext encoderContext) {
|
||||
writer.writeString(value.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<UUID> getEncoderClass() {
|
||||
return UUID.class;
|
||||
}
|
||||
}
|
17
back/src/org/atriasoft/karusic/GenerateApi.java
Normal file
17
back/src/org/atriasoft/karusic/GenerateApi.java
Normal file
@@ -0,0 +1,17 @@
|
||||
package org.atriasoft.karusic;
|
||||
|
||||
import org.atriasoft.karusic.migration.Initialization;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class GenerateApi {
|
||||
private final static Logger LOGGER = LoggerFactory.getLogger(GenerateApi.class);
|
||||
|
||||
private GenerateApi() {}
|
||||
|
||||
public static void main(final String[] args) throws Exception {
|
||||
LOGGER.info("Generate API");
|
||||
Initialization.generateObjects();
|
||||
LOGGER.info("STOP the REST server.");
|
||||
}
|
||||
}
|
223
back/src/org/atriasoft/karusic/WebLauncher.java
Executable file
223
back/src/org/atriasoft/karusic/WebLauncher.java
Executable file
@@ -0,0 +1,223 @@
|
||||
package org.atriasoft.karusic;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Iterator;
|
||||
import java.util.TimeZone;
|
||||
import java.util.logging.LogManager;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.imageio.ImageReader;
|
||||
import javax.imageio.ImageWriter;
|
||||
|
||||
import org.atriasoft.archidata.UpdateJwtPublicKey;
|
||||
import org.atriasoft.archidata.api.DataResource;
|
||||
import org.atriasoft.archidata.api.ProxyResource;
|
||||
import org.atriasoft.archidata.catcher.GenericCatcher;
|
||||
import org.atriasoft.archidata.cron.CronScheduler;
|
||||
import org.atriasoft.archidata.db.DbConfig;
|
||||
import org.atriasoft.archidata.filter.CORSFilter;
|
||||
import org.atriasoft.archidata.filter.OptionFilter;
|
||||
import org.atriasoft.archidata.migration.MigrationEngine;
|
||||
import org.atriasoft.archidata.tools.ConfigBaseVariable;
|
||||
import org.atriasoft.archidata.tools.ContextGenericTools;
|
||||
import org.atriasoft.karusic.api.AlbumResource;
|
||||
import org.atriasoft.karusic.api.ArtistResource;
|
||||
import org.atriasoft.karusic.api.Front;
|
||||
import org.atriasoft.karusic.api.GenderResource;
|
||||
import org.atriasoft.karusic.api.HealthCheck;
|
||||
import org.atriasoft.karusic.api.PlaylistResource;
|
||||
import org.atriasoft.karusic.api.TrackResource;
|
||||
import org.atriasoft.karusic.api.UserResource;
|
||||
import org.atriasoft.karusic.filter.KarusicAuthenticationFilter;
|
||||
import org.atriasoft.karusic.job.BackupJob;
|
||||
import org.atriasoft.karusic.migration.Initialization;
|
||||
import org.atriasoft.karusic.migration.Migration20250427;
|
||||
import org.atriasoft.karusic.migration.Migration20250928;
|
||||
import org.glassfish.grizzly.http.server.HttpServer;
|
||||
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
|
||||
import org.glassfish.jersey.jackson.JacksonFeature;
|
||||
import org.glassfish.jersey.media.multipart.MultiPartFeature;
|
||||
import org.glassfish.jersey.server.ResourceConfig;
|
||||
import org.glassfish.jersey.server.validation.ValidationFeature;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.slf4j.bridge.SLF4JBridgeHandler;
|
||||
|
||||
import jakarta.ws.rs.core.UriBuilder;
|
||||
|
||||
public class WebLauncher {
|
||||
final static Logger LOGGER = LoggerFactory.getLogger(WebLauncher.class);
|
||||
protected UpdateJwtPublicKey keyUpdater = null;
|
||||
protected HttpServer server = null;
|
||||
protected CronScheduler scheduler = null;
|
||||
|
||||
public WebLauncher() {
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
|
||||
this.scheduler = new CronScheduler();
|
||||
this.scheduler.setGracePeriodMinutes(1);
|
||||
}
|
||||
|
||||
private static URI getBaseURI() {
|
||||
return UriBuilder.fromUri(ConfigBaseVariable.getlocalAddress()).build();
|
||||
}
|
||||
|
||||
public void migrateDB() throws Exception {
|
||||
WebLauncher.LOGGER.info("Create migration engine");
|
||||
final MigrationEngine migrationEngine = new MigrationEngine();
|
||||
WebLauncher.LOGGER.info("Add initialization");
|
||||
migrationEngine.setInit(new Initialization());
|
||||
WebLauncher.LOGGER.info("Add migration since last version");
|
||||
migrationEngine.add(new Migration20250427());
|
||||
migrationEngine.add(new Migration20250928());
|
||||
WebLauncher.LOGGER.info("Migrate the DB [START]");
|
||||
migrationEngine.migrateWaitAdmin(new DbConfig());
|
||||
WebLauncher.LOGGER.info("Migrate the DB [STOP]");
|
||||
}
|
||||
|
||||
public static void main(final String[] args) throws Exception {
|
||||
// Loop-back of logger JDK logging API to SLF4J
|
||||
LogManager.getLogManager().reset();
|
||||
SLF4JBridgeHandler.install();
|
||||
|
||||
WebLauncher.LOGGER.info("[START] application wake UP");
|
||||
ConfigBaseVariable.bdDatabase = "karusic";
|
||||
ConfigBaseVariable.dbType = "mongo";
|
||||
final WebLauncher launcher = new WebLauncher();
|
||||
launcher.migrateDB();
|
||||
|
||||
launcher.process();
|
||||
WebLauncher.LOGGER.info("end-configure the server & wait finish process:");
|
||||
Thread.currentThread().join();
|
||||
WebLauncher.LOGGER.info("STOP Key updater");
|
||||
launcher.stopOther();
|
||||
WebLauncher.LOGGER.info("STOP the REST server:");
|
||||
}
|
||||
|
||||
public void plop(final String aaa) {
|
||||
// List available Image Readers
|
||||
WebLauncher.LOGGER.trace("Available Image Readers:");
|
||||
final Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(aaa);
|
||||
while (readers.hasNext()) {
|
||||
final ImageReader reader = readers.next();
|
||||
WebLauncher.LOGGER.trace("Reader: " + reader.getOriginatingProvider().getDescription(null));
|
||||
WebLauncher.LOGGER.trace("Reader CN: " + reader.getOriginatingProvider().getPluginClassName());
|
||||
// ImageIO.deregisterServiceProvider(reader.getOriginatingProvider());
|
||||
}
|
||||
|
||||
// List available Image Writers
|
||||
WebLauncher.LOGGER.trace("\nAvailable Image Writers:");
|
||||
final Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(aaa);
|
||||
while (writers.hasNext()) {
|
||||
final ImageWriter writer = writers.next();
|
||||
WebLauncher.LOGGER.trace("Writer: " + writer.getOriginatingProvider().getDescription(null));
|
||||
WebLauncher.LOGGER.trace("Writer CN: " + writer.getOriginatingProvider().getPluginClassName());
|
||||
}
|
||||
}
|
||||
|
||||
public void process() throws Exception {
|
||||
|
||||
ImageIO.scanForPlugins();
|
||||
plop("jpeg");
|
||||
plop("png");
|
||||
plop("webmp");
|
||||
plop("webp");
|
||||
// ===================================================================
|
||||
// Configure resources
|
||||
// ===================================================================
|
||||
final ResourceConfig rc = new ResourceConfig();
|
||||
|
||||
// add multipart models ..
|
||||
rc.register(MultiPartFeature.class);
|
||||
// global authentication system
|
||||
rc.register(OptionFilter.class);
|
||||
// remove cors ==> all time called by an other system...
|
||||
rc.register(CORSFilter.class);
|
||||
// global authentication system
|
||||
rc.register(KarusicAuthenticationFilter.class);
|
||||
// register exception catcher
|
||||
GenericCatcher.addAll(rc);
|
||||
// add default resource:
|
||||
rc.register(UserResource.class);
|
||||
rc.register(AlbumResource.class);
|
||||
rc.register(ArtistResource.class);
|
||||
rc.register(GenderResource.class);
|
||||
rc.register(PlaylistResource.class);
|
||||
rc.register(TrackResource.class);
|
||||
rc.register(DataResource.class);
|
||||
rc.register(ProxyResource.class);
|
||||
|
||||
rc.register(HealthCheck.class);
|
||||
rc.register(Front.class);
|
||||
|
||||
ContextGenericTools.addJsr310(rc);
|
||||
|
||||
// add jackson to be discover when we are ins standalone server
|
||||
rc.register(JacksonFeature.class);
|
||||
// enable jersey specific validations (@Valid)
|
||||
rc.register(ValidationFeature.class);
|
||||
// enable this to show low level request
|
||||
// rc.property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_SERVER, Level.WARNING.getName());
|
||||
|
||||
// System.out.println("Connect on the BDD:");
|
||||
// System.out.println(" getDBHost: '" + ConfigVariable.getDBHost() + "'");
|
||||
// System.out.println(" getDBPort: '" + ConfigVariable.getDBPort() + "'");
|
||||
// System.out.println(" getDBLogin: '" + ConfigVariable.getDBLogin() + "'");
|
||||
// System.out.println(" getDBPassword: '" + ConfigVariable.getDBPassword() + "'");
|
||||
// System.out.println(" getDBName: '" + ConfigVariable.getDBName() + "'");
|
||||
System.out.println(" ==> " + new DbConfig());
|
||||
System.out.println("OAuth service " + getBaseURI());
|
||||
this.server = GrizzlyHttpServerFactory.createHttpServer(getBaseURI(), rc);
|
||||
final HttpServer serverLink = this.server;
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println("Stopping server..");
|
||||
serverLink.shutdownNow();
|
||||
}
|
||||
}, "shutdownHook"));
|
||||
|
||||
// ===================================================================
|
||||
// start periodic update of the token ...
|
||||
// ===================================================================
|
||||
this.keyUpdater = new UpdateJwtPublicKey();
|
||||
this.keyUpdater.start();
|
||||
|
||||
// ===================================================================
|
||||
// start generic scheduler ...
|
||||
// ===================================================================
|
||||
this.scheduler.addTask("backup", "0 0 * * *", new BackupJob());
|
||||
this.scheduler.start();
|
||||
|
||||
// ===================================================================
|
||||
// run JERSEY
|
||||
// ===================================================================
|
||||
try {
|
||||
this.server.start();
|
||||
LOGGER.info("Jersey app started at {}", getBaseURI());
|
||||
} catch (final Exception e) {
|
||||
LOGGER.error("There was an error while starting Grizzly HTTP server.");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
if (this.server != null) {
|
||||
this.server.shutdownNow();
|
||||
this.server = null;
|
||||
}
|
||||
if (this.scheduler != null) {
|
||||
this.scheduler.stop();
|
||||
this.scheduler = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void stopOther() {
|
||||
this.keyUpdater.kill();
|
||||
try {
|
||||
this.keyUpdater.join(4000, 0);
|
||||
} catch (final InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
57
back/src/org/atriasoft/karusic/WebLauncherLocal.java
Executable file
57
back/src/org/atriasoft/karusic/WebLauncherLocal.java
Executable file
@@ -0,0 +1,57 @@
|
||||
package org.atriasoft.karusic;
|
||||
|
||||
import java.util.logging.LogManager;
|
||||
|
||||
import org.atriasoft.archidata.tools.ConfigBaseVariable;
|
||||
import org.atriasoft.karusic.migration.Initialization;
|
||||
import org.atriasoft.karusic.util.ConfigVariable;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.slf4j.bridge.SLF4JBridgeHandler;
|
||||
|
||||
public class WebLauncherLocal extends WebLauncher {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(WebLauncherLocal.class);
|
||||
|
||||
private WebLauncherLocal() {}
|
||||
|
||||
public static void main(final String[] args) throws Exception {
|
||||
ConfigBaseVariable.bdDatabase = "karusic";
|
||||
ConfigBaseVariable.dbType = "mongo";
|
||||
// Loop-back of logger JDK logging API to SLF4J
|
||||
LogManager.getLogManager().reset();
|
||||
SLF4JBridgeHandler.install();
|
||||
// Generate the APIs in type-script
|
||||
Initialization.generateObjects();
|
||||
final WebLauncherLocal launcher = new WebLauncherLocal();
|
||||
launcher.process();
|
||||
LOGGER.info("end-configure the server & wait finish process:");
|
||||
Thread.currentThread().join();
|
||||
LOGGER.info("STOP the REST server:");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process() throws Exception {
|
||||
if (true) {
|
||||
// for local test:
|
||||
ConfigBaseVariable.apiAdress = "http://0.0.0.0:19080/karusic/api/";
|
||||
ConfigBaseVariable.testMode = "true";
|
||||
ConfigBaseVariable.dbType = "mongo";
|
||||
}
|
||||
if (ConfigVariable.isInitWithBackup()) {
|
||||
Initialization.initializeWithBackup();
|
||||
}
|
||||
// Test fail of SSO: ConfigBaseVariable.ssoAdress = null;
|
||||
try {
|
||||
super.migrateDB();
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
while (true) {
|
||||
LOGGER.error("============================================================================");
|
||||
LOGGER.error("== Migration fail ==> waiting intervention of administrator...");
|
||||
LOGGER.error("============================================================================");
|
||||
Thread.sleep(60 * 60 * 1000);
|
||||
}
|
||||
}
|
||||
super.process();
|
||||
}
|
||||
}
|
103
back/src/org/atriasoft/karusic/api/AlbumResource.java
Normal file
103
back/src/org/atriasoft/karusic/api/AlbumResource.java
Normal file
@@ -0,0 +1,103 @@
|
||||
package org.atriasoft.karusic.api;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.checker.GroupCreate;
|
||||
import org.atriasoft.archidata.annotation.checker.GroupUpdate;
|
||||
import org.atriasoft.archidata.annotation.checker.ValidGroup;
|
||||
import org.atriasoft.archidata.dataAccess.DataAccess;
|
||||
import org.atriasoft.karusic.model.Album;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.validation.Valid;
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.DELETE;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.PUT;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.PathParam;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
|
||||
@Path("/album")
|
||||
@Produces({ MediaType.APPLICATION_JSON })
|
||||
public class AlbumResource {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(AlbumResource.class);
|
||||
|
||||
@GET
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("USER")
|
||||
@Operation(description = "Get a specific Album with his ID")
|
||||
public Album get(@PathParam("oid") final ObjectId oid) throws Exception {
|
||||
return DataAccess.get(Album.class, oid);
|
||||
// return this.morphiaService.getDatastore().find(Album.class).filter(Filters.eq("id", id)).first();
|
||||
}
|
||||
|
||||
@GET
|
||||
@RolesAllowed("USER")
|
||||
@Operation(description = "Get all the available Albums")
|
||||
public List<Album> gets() throws Exception {
|
||||
return DataAccess.gets(Album.class);
|
||||
// final Query<Album> query = this.morphiaService.getDatastore().find(Album.class);
|
||||
// return query.stream().toList();
|
||||
}
|
||||
|
||||
@POST
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Operation(description = "Add an album (when all the data already exist)")
|
||||
public Album post(@Valid @ValidGroup(GroupCreate.class) final Album data) throws Exception {
|
||||
// TODO: how to manage the checker ???
|
||||
// final Album ret = this.morphiaService.getDatastore().save(data);
|
||||
// return ret;
|
||||
/* final MongoCollection<Track> trackCollection = db.getCollection("TTRACLK", Track.class); final InsertOneResult res = trackCollection.insertOne(plop); LOGGER.warn("plpop {}", res); final
|
||||
* ObjectId ploppppp = res.getInsertedId().asObjectId().getValue(); LOGGER.warn("plpop 2522 {}", res.getInsertedId().asObjectId().getValue()); final Track ret =
|
||||
* trackCollection.find(Filters.eq("_id", res.getInsertedId().asObjectId().getValue())) .first(); System.out.println("Grade found:\t" + ret); */
|
||||
return DataAccess.insert(data);
|
||||
}
|
||||
|
||||
@PUT
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Operation(description = "Update a specific album")
|
||||
public Album put(@PathParam("oid") final ObjectId oid, @Valid @ValidGroup(GroupUpdate.class) final Album album) throws Exception {
|
||||
// final Query<Album> query = this.morphiaService.getDatastore().find(Album.class).filter(Filters.eq("id", id));
|
||||
// final UpdateOperations<Album> ops = this.morphiaService.getDatastore().createUpdateOperations(Album.class)
|
||||
// .set("name", master.getName());
|
||||
// this.morphiaService.getDatastore().update(query, ops);
|
||||
// return Response.ok(master).build();
|
||||
album.oid = oid;
|
||||
DataAccess.update(album, oid);
|
||||
return DataAccess.get(Album.class, oid);
|
||||
}
|
||||
|
||||
// @PUT
|
||||
// @Path("{id}")
|
||||
// @RolesAllowed("ADMIN")
|
||||
// @Consumes(MediaType.APPLICATION_JSON)
|
||||
// @Operation(description = "Update a specific album")
|
||||
// public Album put(@PathParam("id") final ObjectId oid, final Album album)
|
||||
// throws Exception {
|
||||
// final Query<Album> query = this.morphiaService.getDatastore().find(Album.class).filter(Filters.eq("id", id));
|
||||
// final UpdateOperations<Album> ops = this.morphiaService.getDatastore().createUpdateOperations(Album.class)
|
||||
// .set("name", album.getName());
|
||||
// this.morphiaService.getDatastore().update(query, ops);
|
||||
// return Response.ok(album).build();
|
||||
// }
|
||||
|
||||
@DELETE
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Operation(description = "Remove a specific album")
|
||||
public void remove(@PathParam("oid") final ObjectId oid) throws Exception {
|
||||
DataAccess.delete(Album.class, oid);
|
||||
// this.morphiaService.getDatastore().find(Album.class).filter(Filters.eq("id", id)).delete();
|
||||
}
|
||||
|
||||
}
|
67
back/src/org/atriasoft/karusic/api/ArtistResource.java
Normal file
67
back/src/org/atriasoft/karusic/api/ArtistResource.java
Normal file
@@ -0,0 +1,67 @@
|
||||
package org.atriasoft.karusic.api;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.checker.GroupCreate;
|
||||
import org.atriasoft.archidata.annotation.checker.GroupUpdate;
|
||||
import org.atriasoft.archidata.annotation.checker.ValidGroup;
|
||||
import org.atriasoft.archidata.dataAccess.DataAccess;
|
||||
import org.atriasoft.karusic.model.Artist;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.validation.Valid;
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.DELETE;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.PUT;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.PathParam;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
|
||||
@Path("/artist")
|
||||
@Produces({ MediaType.APPLICATION_JSON })
|
||||
public class ArtistResource {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(ArtistResource.class);
|
||||
|
||||
@GET
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("USER")
|
||||
public Artist get(@PathParam("oid") final ObjectId oid) throws Exception {
|
||||
return DataAccess.get(Artist.class, oid);
|
||||
}
|
||||
|
||||
@GET
|
||||
@RolesAllowed("USER")
|
||||
public List<Artist> gets() throws Exception {
|
||||
return DataAccess.gets(Artist.class);
|
||||
}
|
||||
|
||||
@POST
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Artist post(@Valid @ValidGroup(GroupCreate.class) final Artist data) throws Exception {
|
||||
return DataAccess.insert(data);
|
||||
}
|
||||
|
||||
@PUT
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Artist put(@PathParam("oid") final ObjectId oid, @Valid @ValidGroup(GroupUpdate.class) final Artist artist) throws Exception {
|
||||
artist.oid = oid;
|
||||
DataAccess.update(artist, oid);
|
||||
return DataAccess.get(Artist.class, oid);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public void remove(@PathParam("oid") final ObjectId oid) throws Exception {
|
||||
DataAccess.delete(Artist.class, oid);
|
||||
}
|
||||
}
|
@@ -1,7 +1,7 @@
|
||||
package org.kar.karusic.api;
|
||||
package org.atriasoft.karusic.api;
|
||||
|
||||
import org.kar.archidata.api.FrontGeneric;
|
||||
import org.kar.karusic.util.ConfigVariable;
|
||||
import org.atriasoft.archidata.api.FrontGeneric;
|
||||
import org.atriasoft.karusic.util.ConfigVariable;
|
||||
|
||||
import jakarta.ws.rs.Path;
|
||||
|
68
back/src/org/atriasoft/karusic/api/GenderResource.java
Normal file
68
back/src/org/atriasoft/karusic/api/GenderResource.java
Normal file
@@ -0,0 +1,68 @@
|
||||
package org.atriasoft.karusic.api;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.checker.GroupCreate;
|
||||
import org.atriasoft.archidata.annotation.checker.GroupUpdate;
|
||||
import org.atriasoft.archidata.annotation.checker.ValidGroup;
|
||||
import org.atriasoft.archidata.dataAccess.DataAccess;
|
||||
import org.atriasoft.karusic.model.Gender;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.validation.Valid;
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.DELETE;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.PUT;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.PathParam;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
|
||||
@Path("/gender")
|
||||
@Produces({ MediaType.APPLICATION_JSON })
|
||||
public class GenderResource {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(GenderResource.class);
|
||||
|
||||
@GET
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("USER")
|
||||
public Gender get(@PathParam("oid") final ObjectId oid) throws Exception {
|
||||
return DataAccess.get(Gender.class, oid);
|
||||
}
|
||||
|
||||
@GET
|
||||
@RolesAllowed("USER")
|
||||
public List<Gender> gets() throws Exception {
|
||||
return DataAccess.gets(Gender.class);
|
||||
}
|
||||
|
||||
@POST
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Gender post(@Valid @ValidGroup(GroupCreate.class) final Gender data) throws Exception {
|
||||
return DataAccess.insert(data);
|
||||
}
|
||||
|
||||
@PUT
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Gender patch(@PathParam("oid") final ObjectId oid, @Valid @ValidGroup(GroupUpdate.class) final Gender gender) throws Exception {
|
||||
gender.oid = oid;
|
||||
DataAccess.update(gender, oid);
|
||||
return DataAccess.get(Gender.class, oid);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public void remove(@PathParam("oid") final ObjectId oid) throws Exception {
|
||||
DataAccess.delete(Gender.class, oid);
|
||||
}
|
||||
|
||||
}
|
@@ -1,8 +1,8 @@
|
||||
package org.kar.karusic.api;
|
||||
package org.atriasoft.karusic.api;
|
||||
|
||||
import org.kar.archidata.exception.FailException;
|
||||
import org.kar.archidata.tools.ConfigBaseVariable;
|
||||
import org.kar.archidata.tools.JWTWrapper;
|
||||
import org.atriasoft.archidata.exception.FailException;
|
||||
import org.atriasoft.archidata.tools.ConfigBaseVariable;
|
||||
import org.atriasoft.archidata.tools.JWTWrapper;
|
||||
|
||||
import jakarta.annotation.security.PermitAll;
|
||||
import jakarta.ws.rs.GET;
|
||||
@@ -15,8 +15,8 @@ import jakarta.ws.rs.core.Response;
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public class HealthCheck {
|
||||
|
||||
public record HealthResult(
|
||||
String value) {};
|
||||
public record HealthResult(String value) {
|
||||
};
|
||||
|
||||
@GET
|
||||
@PermitAll
|
68
back/src/org/atriasoft/karusic/api/PlaylistResource.java
Normal file
68
back/src/org/atriasoft/karusic/api/PlaylistResource.java
Normal file
@@ -0,0 +1,68 @@
|
||||
package org.atriasoft.karusic.api;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.checker.GroupCreate;
|
||||
import org.atriasoft.archidata.annotation.checker.GroupUpdate;
|
||||
import org.atriasoft.archidata.annotation.checker.ValidGroup;
|
||||
import org.atriasoft.archidata.dataAccess.DataAccess;
|
||||
import org.atriasoft.karusic.model.Playlist;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.validation.Valid;
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.DELETE;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.PUT;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.PathParam;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
|
||||
@Path("/playlist")
|
||||
@Produces({ MediaType.APPLICATION_JSON })
|
||||
public class PlaylistResource {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(PlaylistResource.class);
|
||||
|
||||
@GET
|
||||
@Path("{id}")
|
||||
@RolesAllowed("USER")
|
||||
public Playlist get(@PathParam("id") final ObjectId oid) throws Exception {
|
||||
return DataAccess.get(Playlist.class, oid);
|
||||
}
|
||||
|
||||
@GET
|
||||
@RolesAllowed("USER")
|
||||
public List<Playlist> gets() throws Exception {
|
||||
return DataAccess.gets(Playlist.class);
|
||||
}
|
||||
|
||||
@POST
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Playlist post(@Valid @ValidGroup(GroupCreate.class) final Playlist data) throws Exception {
|
||||
return DataAccess.insert(data);
|
||||
}
|
||||
|
||||
@PUT
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Playlist put(@PathParam("oid") final ObjectId oid, @Valid @ValidGroup(GroupUpdate.class) final Playlist playlist) throws Exception {
|
||||
playlist.oid = oid;
|
||||
DataAccess.update(playlist, oid);
|
||||
return DataAccess.get(Playlist.class, oid);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public void remove(@PathParam("oid") final ObjectId oid) throws Exception {
|
||||
DataAccess.delete(Playlist.class, oid);
|
||||
}
|
||||
|
||||
}
|
164
back/src/org/atriasoft/karusic/api/TrackResource.java
Normal file
164
back/src/org/atriasoft/karusic/api/TrackResource.java
Normal file
@@ -0,0 +1,164 @@
|
||||
package org.atriasoft.karusic.api;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.apiGenerator.ApiAsyncType;
|
||||
import org.atriasoft.archidata.annotation.apiGenerator.ApiInputOptional;
|
||||
import org.atriasoft.archidata.annotation.apiGenerator.ApiTypeScriptProgress;
|
||||
import org.atriasoft.archidata.annotation.checker.GroupCreate;
|
||||
import org.atriasoft.archidata.annotation.checker.GroupUpdate;
|
||||
import org.atriasoft.archidata.annotation.checker.ValidGroup;
|
||||
import org.atriasoft.archidata.dataAccess.DBAccess;
|
||||
import org.atriasoft.archidata.dataAccess.DataAccess;
|
||||
import org.atriasoft.archidata.model.Data;
|
||||
import org.atriasoft.archidata.tools.DataTools;
|
||||
import org.atriasoft.karusic.model.Track;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
|
||||
import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.validation.Valid;
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.DELETE;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.PUT;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.PathParam;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
|
||||
@Path("/track")
|
||||
@Produces({ MediaType.APPLICATION_JSON })
|
||||
public class TrackResource {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(TrackResource.class);
|
||||
|
||||
@GET
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("USER")
|
||||
public Track get(@PathParam("oid") final ObjectId oid) throws Exception {
|
||||
return DataAccess.get(Track.class, oid);
|
||||
}
|
||||
|
||||
@GET
|
||||
@RolesAllowed("USER")
|
||||
public List<Track> gets() throws Exception {
|
||||
return DataAccess.gets(Track.class);
|
||||
}
|
||||
|
||||
@POST
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Track post(@Valid @ValidGroup(GroupCreate.class) final Track data) throws Exception {
|
||||
return DataAccess.insert(data);
|
||||
}
|
||||
|
||||
@PUT
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Track put(@PathParam("oid") final ObjectId oid, @Valid @ValidGroup(GroupUpdate.class) final Track track) throws Exception {
|
||||
track.oid = oid;
|
||||
DataAccess.update(track, oid);
|
||||
return DataAccess.get(Track.class, oid);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public void remove(@PathParam("oid") final ObjectId oid) throws Exception {
|
||||
DataAccess.delete(Track.class, oid);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("upload/")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes({ MediaType.MULTIPART_FORM_DATA })
|
||||
@ApiAsyncType(Track.class)
|
||||
@ApiTypeScriptProgress
|
||||
public Response uploadTrack( //
|
||||
@FormDataParam("title") String title, //
|
||||
@ApiInputOptional @ApiAsyncType(ObjectId.class) @FormDataParam("genderId") String genderId, //
|
||||
@ApiInputOptional @ApiAsyncType(ObjectId.class) @FormDataParam("artistId") String artistId, //
|
||||
@ApiInputOptional @ApiAsyncType(ObjectId.class) @FormDataParam("albumId") String albumId, //
|
||||
@ApiInputOptional @ApiAsyncType(Long.class) @FormDataParam("trackId") String trackId, //
|
||||
@FormDataParam("file") final InputStream fileInputStream, //
|
||||
@FormDataParam("file") final FormDataContentDisposition fileMetaData //
|
||||
) {
|
||||
try (DBAccess db = DBAccess.createInterface()) {
|
||||
// correct input string stream :
|
||||
trackId = DataTools.multipartCorrection(trackId);
|
||||
albumId = DataTools.multipartCorrection(albumId);
|
||||
artistId = DataTools.multipartCorrection(artistId);
|
||||
genderId = DataTools.multipartCorrection(genderId);
|
||||
title = DataTools.multipartCorrection(title);
|
||||
|
||||
// public NodeSmall uploadFile(final FormDataMultiPart form) {
|
||||
LOGGER.info("Upload media file: " + fileMetaData);
|
||||
LOGGER.info(" > genderId: " + genderId);
|
||||
LOGGER.info(" > artistId: " + artistId);
|
||||
LOGGER.info(" > albumId: " + albumId);
|
||||
LOGGER.info(" > trackId: " + trackId);
|
||||
LOGGER.info(" > title: " + title);
|
||||
LOGGER.info(" > fileInputStream: " + fileInputStream);
|
||||
LOGGER.info(" > fileMetaData: " + fileMetaData);
|
||||
/* if (typeId == null) { return Response.status(406). entity("Missing Input 'type'"). type("text/plain"). build(); } */
|
||||
|
||||
final long tmpUID = DataTools.getTmpDataId();
|
||||
final String sha512 = DataTools.saveTemporaryFile(fileInputStream, tmpUID);
|
||||
Data data = DataTools.getWithSha512(db, sha512);
|
||||
if (data == null) {
|
||||
LOGGER.info("Need to add the data in the BDD ... ");
|
||||
|
||||
try {
|
||||
data = DataTools.createNewData(db, tmpUID, fileMetaData.getFileName(), sha512);
|
||||
} catch (final IOException ex) {
|
||||
DataTools.removeTemporaryFile(tmpUID);
|
||||
ex.printStackTrace();
|
||||
return Response.notModified("can not create input media").build();
|
||||
} catch (final SQLException ex) {
|
||||
ex.printStackTrace();
|
||||
DataTools.removeTemporaryFile(tmpUID);
|
||||
return Response.notModified("Error in SQL insertion ...").build();
|
||||
}
|
||||
} else if (data.deleted) {
|
||||
LOGGER.info("Data already exist but deleted");
|
||||
DataTools.undelete(db, data.oid);
|
||||
data.deleted = false;
|
||||
} else {
|
||||
LOGGER.info("Data already exist ... all good");
|
||||
}
|
||||
LOGGER.info("add media");
|
||||
|
||||
Track trackElem = new Track();
|
||||
trackElem.name = title;
|
||||
trackElem.track = trackId != null ? Long.parseLong(trackId) : null;
|
||||
trackElem.albumId = albumId != null ? new ObjectId(albumId) : null;
|
||||
trackElem.genderId = genderId != null ? new ObjectId(genderId) : null;
|
||||
trackElem.dataId = data.oid;
|
||||
// Now list of artist has an internal management:
|
||||
if (artistId != null) {
|
||||
trackElem.artists = new ArrayList<>();
|
||||
trackElem.artists.add(artistId != null ? new ObjectId(artistId) : null);
|
||||
}
|
||||
// TODO: maybe validate here ....
|
||||
|
||||
trackElem = DataAccess.insert(trackElem);
|
||||
/* Old mode of artist insertion (removed due to the slowlest request of getting value if (artistElem != null) { this.dam.addLink(Track.class, trackElem.id, "artist", artistElem.id); } */
|
||||
return Response.ok(trackElem).build();
|
||||
} catch (final Exception ex) {
|
||||
LOGGER.info("Catch an unexpected error ... {}", ex.getMessage());
|
||||
ex.printStackTrace();
|
||||
return Response.status(417).entity("Back-end error : " + ex.getMessage()).type("text/plain").build();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -1,10 +1,12 @@
|
||||
package org.kar.karusic.api;
|
||||
package org.atriasoft.karusic.api;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.kar.archidata.dataAccess.DataAccess;
|
||||
import org.kar.archidata.filter.GenericContext;
|
||||
import org.kar.karusic.model.UserKarusic;
|
||||
import org.atriasoft.archidata.dataAccess.DataAccess;
|
||||
import org.atriasoft.archidata.filter.GenericContext;
|
||||
import org.atriasoft.karusic.api.UserResourceModel.UserMe;
|
||||
import org.atriasoft.karusic.model.UserKarusic;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@@ -20,17 +22,17 @@ import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.SecurityContext;
|
||||
|
||||
@Path("/users")
|
||||
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public class UserResource {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(UserResource.class);
|
||||
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class UserOut {
|
||||
public long id;
|
||||
public ObjectId oid;
|
||||
public String login;
|
||||
|
||||
public UserOut(final long id, final String login) {
|
||||
this.id = id;
|
||||
public UserOut(final ObjectId oid, final String login) {
|
||||
this.oid = oid;
|
||||
this.login = login;
|
||||
}
|
||||
|
||||
@@ -54,9 +56,9 @@ public class UserResource {
|
||||
|
||||
// curl http://localhost:9993/api/users/3
|
||||
@GET
|
||||
@Path("{id}")
|
||||
@Path("{oid}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public UserKarusic get(@Context final SecurityContext sc, @PathParam("id") final long userId) {
|
||||
public UserKarusic get(@Context final SecurityContext sc, @PathParam("oid") final ObjectId userId) {
|
||||
LOGGER.info("getUser {}", userId);
|
||||
final GenericContext gc = (GenericContext) sc.getUserPrincipal();
|
||||
LOGGER.info("===================================================");
|
||||
@@ -74,10 +76,10 @@ public class UserResource {
|
||||
@GET
|
||||
@Path("me")
|
||||
@RolesAllowed("USER")
|
||||
public UserOut getMe(@Context final SecurityContext sc) {
|
||||
public UserMe getMe(@Context final SecurityContext sc) {
|
||||
LOGGER.debug("getMe()");
|
||||
final GenericContext gc = (GenericContext) sc.getUserPrincipal();
|
||||
LOGGER.debug("== USER ? {}", gc.userByToken);
|
||||
return new UserOut(gc.userByToken.id, gc.userByToken.name);
|
||||
return new UserMe(gc.userByToken.oid, gc.userByToken.name);
|
||||
}
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
package org.atriasoft.karusic.api.UserResourceModel;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public class ModuleAuthorizations extends HashMap<String, PartRight> {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
public ModuleAuthorizations() {}
|
||||
}
|
@@ -0,0 +1,29 @@
|
||||
package org.atriasoft.karusic.api.UserResourceModel;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonValue;
|
||||
|
||||
public enum PartRight {
|
||||
READ(1), //
|
||||
WRITE(2), //
|
||||
READ_WRITE(3);
|
||||
|
||||
private final int value;
|
||||
|
||||
PartRight(final int value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@JsonValue
|
||||
public int getValue() {
|
||||
return this.value;
|
||||
}
|
||||
|
||||
public static PartRight fromValue(final int value) {
|
||||
for (final PartRight species : PartRight.values()) {
|
||||
if (species.getValue() == value) {
|
||||
return species;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("PartRight: Unknown value: " + value);
|
||||
}
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
package org.atriasoft.karusic.api.UserResourceModel;
|
||||
|
||||
import org.bson.types.ObjectId;
|
||||
|
||||
public class UserMe {
|
||||
public ObjectId oid;
|
||||
public String login;
|
||||
|
||||
public UserMe() {}
|
||||
|
||||
public UserMe(final ObjectId oid, final String login) {
|
||||
this.oid = oid;
|
||||
this.login = login;
|
||||
}
|
||||
|
||||
}
|
@@ -1,6 +1,6 @@
|
||||
package org.kar.karusic.filter;
|
||||
package org.atriasoft.karusic.filter;
|
||||
|
||||
import org.kar.archidata.filter.AuthenticationFilter;
|
||||
import org.atriasoft.archidata.filter.AuthenticationFilter;
|
||||
|
||||
import jakarta.ws.rs.Priorities;
|
||||
import jakarta.ws.rs.ext.Provider;
|
47
back/src/org/atriasoft/karusic/job/BackupJob.java
Normal file
47
back/src/org/atriasoft/karusic/job/BackupJob.java
Normal file
@@ -0,0 +1,47 @@
|
||||
package org.atriasoft.karusic.job;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
import org.atriasoft.archidata.backup.BackupEngine;
|
||||
import org.atriasoft.archidata.backup.BackupEngine.EngineBackupType;
|
||||
import org.atriasoft.archidata.exception.DataAccessException;
|
||||
import org.atriasoft.archidata.tools.ConfigBaseVariable;
|
||||
import org.atriasoft.karusic.migration.Initialization;
|
||||
import org.atriasoft.karusic.util.ConfigVariable;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class BackupJob implements Runnable {
|
||||
|
||||
final static Logger LOGGER = LoggerFactory.getLogger(BackupJob.class);
|
||||
BackupEngine engine;
|
||||
|
||||
public BackupJob() throws DataAccessException, IOException {
|
||||
final Path path = Paths.get(ConfigVariable.getBackupFolder());
|
||||
Files.createDirectories(path);
|
||||
this.engine = new BackupEngine(path, ConfigBaseVariable.getDBName(), EngineBackupType.JSON_EXTENDED);
|
||||
this.engine.setEnableStoreOrRestoreData(false);
|
||||
for (final Class<?> clazz : Initialization.CLASSES_BASE) {
|
||||
this.engine.addClass(clazz);
|
||||
}
|
||||
this.engine.addCollection("counters");
|
||||
this.engine.addCollection("KAR_migration");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
LOGGER.warn("Backup request");
|
||||
try {
|
||||
final String timestampUtc = ZonedDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd_HH:mm:ss.SSS"));
|
||||
this.engine.store(timestampUtc + "_full");
|
||||
} catch (final Exception ex) {
|
||||
LOGGER.error("Fail in Backup: {}", ex.getMessage());
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
145
back/src/org/atriasoft/karusic/migration/Initialization.java
Normal file
145
back/src/org/atriasoft/karusic/migration/Initialization.java
Normal file
@@ -0,0 +1,145 @@
|
||||
package org.atriasoft.karusic.migration;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.api.DataResource;
|
||||
import org.atriasoft.archidata.api.ProxyResource;
|
||||
import org.atriasoft.archidata.backup.BackupEngine;
|
||||
import org.atriasoft.archidata.backup.BackupEngine.EngineBackupType;
|
||||
import org.atriasoft.archidata.dataAccess.DBAccess;
|
||||
import org.atriasoft.archidata.db.DbConfig;
|
||||
import org.atriasoft.archidata.exception.DataAccessException;
|
||||
import org.atriasoft.archidata.exception.FailException;
|
||||
import org.atriasoft.archidata.externalRestApi.AnalyzeApi;
|
||||
import org.atriasoft.archidata.externalRestApi.TsGenerateApi;
|
||||
import org.atriasoft.archidata.filter.PartRight;
|
||||
import org.atriasoft.archidata.migration.MigrationSqlStep;
|
||||
import org.atriasoft.archidata.model.Data;
|
||||
import org.atriasoft.archidata.model.User;
|
||||
import org.atriasoft.archidata.model.token.JwtToken;
|
||||
import org.atriasoft.archidata.tools.ConfigBaseVariable;
|
||||
import org.atriasoft.karusic.api.AlbumResource;
|
||||
import org.atriasoft.karusic.api.ArtistResource;
|
||||
import org.atriasoft.karusic.api.Front;
|
||||
import org.atriasoft.karusic.api.GenderResource;
|
||||
import org.atriasoft.karusic.api.HealthCheck;
|
||||
import org.atriasoft.karusic.api.PlaylistResource;
|
||||
import org.atriasoft.karusic.api.TrackResource;
|
||||
import org.atriasoft.karusic.api.UserResource;
|
||||
import org.atriasoft.karusic.model.Album;
|
||||
import org.atriasoft.karusic.model.Artist;
|
||||
import org.atriasoft.karusic.model.Gender;
|
||||
import org.atriasoft.karusic.model.Playlist;
|
||||
import org.atriasoft.karusic.model.Track;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import jakarta.ws.rs.InternalServerErrorException;
|
||||
|
||||
public class Initialization extends MigrationSqlStep {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(Initialization.class);
|
||||
|
||||
public static final int KARSO_INITIALISATION_ID = 1;
|
||||
public static final List<Class<?>> CLASSES_BASE = List.of(Album.class, Artist.class, Data.class, Gender.class, Playlist.class, Track.class, User.class);
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Initialization";
|
||||
}
|
||||
|
||||
public static void removeDB() throws DataAccessException, InternalServerErrorException, IOException {
|
||||
final DbConfig config = new DbConfig();
|
||||
LOGGER.info("Remove DB '{}'", config.getDbName());
|
||||
try (DBAccess dba = DBAccess.createInterface(config)) {
|
||||
dba.deleteDB(ConfigBaseVariable.bdDatabase);
|
||||
}
|
||||
}
|
||||
|
||||
/** Restore backup file (./init/backup.tar.gz). */
|
||||
public static void initializeWithBackup() throws IOException, DataAccessException, FailException {
|
||||
final Path path = Paths.get("./init/backup.tar.gz");
|
||||
if (!Files.exists(path)) {
|
||||
throw new FailException("file: ./init/backup.tar.gz does not exist");
|
||||
}
|
||||
removeDB();
|
||||
final BackupEngine engine = new BackupEngine(Paths.get("."), ConfigBaseVariable.bdDatabase, EngineBackupType.JSON_EXTENDED);
|
||||
if (!engine.restoreFile(path, null)) {
|
||||
throw new FailException("Can not retrieve db from backup");
|
||||
}
|
||||
}
|
||||
|
||||
public static void generateObjects() throws Exception {
|
||||
LOGGER.info("Generate APIs");
|
||||
final List<Class<?>> listOfResources = List.of(AlbumResource.class, ArtistResource.class, Front.class, GenderResource.class, HealthCheck.class, PlaylistResource.class, UserResource.class,
|
||||
TrackResource.class, DataResource.class, ProxyResource.class);
|
||||
final AnalyzeApi api = new AnalyzeApi();
|
||||
api.addAllApi(listOfResources);
|
||||
api.addModel(JwtToken.class);
|
||||
api.addModel(PartRight.class);
|
||||
TsGenerateApi.generateApi(api, Paths.get("../front/src/back-api/"));
|
||||
LOGGER.info("Generate APIs (DONE)");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateStep() throws Exception {
|
||||
for (final Class<?> clazz : CLASSES_BASE) {
|
||||
addClass(clazz);
|
||||
}
|
||||
addAction((final DBAccess da) -> {
|
||||
final List<Gender> data = List.of(//
|
||||
new Gender("Variété française"), //
|
||||
new Gender("Pop"), //
|
||||
new Gender("inconnue"), //
|
||||
new Gender("Disco"), //
|
||||
new Gender("Enfants"), //
|
||||
new Gender("Portugaise"), //
|
||||
new Gender("Apprentissage"), //
|
||||
new Gender("Blues"), //
|
||||
new Gender("Jazz"), //
|
||||
new Gender("Chanson Noël"), //
|
||||
new Gender("DubStep"), //
|
||||
new Gender("Rap français"), //
|
||||
new Gender("Classique"), //
|
||||
new Gender("Rock"), //
|
||||
new Gender("Electro"), //
|
||||
new Gender("Celtique"), //
|
||||
new Gender("Country"), //
|
||||
new Gender("Variété Québéquoise"), //
|
||||
new Gender("Médiéval"), //
|
||||
new Gender("Variété Italienne"), //
|
||||
new Gender("Comédie Musicale"), //
|
||||
new Gender("Vianney"), //
|
||||
new Gender("Bande Original"), //
|
||||
new Gender("Bande Originale"), //
|
||||
new Gender("Variété Belge"), //
|
||||
new Gender("Gospel"));
|
||||
da.insertMultiple(data);
|
||||
});
|
||||
}
|
||||
|
||||
public static void dropAll(final DBAccess da) {
|
||||
for (final Class<?> element : CLASSES_BASE) {
|
||||
try {
|
||||
da.drop(element);
|
||||
} catch (final Exception ex) {
|
||||
LOGGER.error("Fail to drop table !!!!!!");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void cleanAll(final DBAccess da) {
|
||||
for (final Class<?> element : CLASSES_BASE) {
|
||||
try {
|
||||
da.cleanAll(element);
|
||||
} catch (final Exception ex) {
|
||||
LOGGER.error("Fail to clean table !!!!!!");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
146
back/src/org/atriasoft/karusic/migration/Migration20250427.java
Normal file
146
back/src/org/atriasoft/karusic/migration/Migration20250427.java
Normal file
@@ -0,0 +1,146 @@
|
||||
package org.atriasoft.karusic.migration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.dataAccess.DBAccess;
|
||||
import org.atriasoft.archidata.dataAccess.options.AccessDeletedItems;
|
||||
import org.atriasoft.archidata.dataAccess.options.DirectData;
|
||||
import org.atriasoft.archidata.dataAccess.options.ReadAllColumn;
|
||||
import org.atriasoft.archidata.db.DbConfig;
|
||||
import org.atriasoft.archidata.migration.MigrationSqlStep;
|
||||
import org.atriasoft.archidata.model.Data;
|
||||
import org.atriasoft.archidata.tools.ConfigBaseVariable;
|
||||
import org.atriasoft.karusic.model.Album;
|
||||
import org.atriasoft.karusic.model.Artist;
|
||||
import org.atriasoft.karusic.model.Gender;
|
||||
import org.atriasoft.karusic.model.Track;
|
||||
import org.atriasoft.karusic.modelOld.AlbumOld;
|
||||
import org.atriasoft.karusic.modelOld.ArtistOld;
|
||||
import org.atriasoft.karusic.modelOld.GenderOld;
|
||||
import org.atriasoft.karusic.modelOld.TrackOld;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class Migration20250427 extends MigrationSqlStep {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(Migration20250427.class);
|
||||
|
||||
public static final int KARSO_INITIALISATION_ID = 1;
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "migration-2025-04-27: Migrate to MongoDB";
|
||||
}
|
||||
|
||||
public static ObjectId getElementArtist(final List<ArtistOld> datas, final Long id) throws Exception {
|
||||
if (id == null) {
|
||||
return null;
|
||||
}
|
||||
for (final var elem : datas) {
|
||||
if (elem.id.equals(id)) {
|
||||
return elem.getOid();
|
||||
}
|
||||
}
|
||||
throw new Exception("Does not exist");
|
||||
}
|
||||
|
||||
public static ObjectId getElementAlbum(final List<AlbumOld> datas, final Long id) throws Exception {
|
||||
if (id == null) {
|
||||
return null;
|
||||
}
|
||||
for (final var elem : datas) {
|
||||
if (elem.id.equals(id)) {
|
||||
return elem.getOid();
|
||||
}
|
||||
}
|
||||
throw new Exception("Does not exist");
|
||||
}
|
||||
|
||||
public static ObjectId getElementGender(final List<GenderOld> datas, final Long id) throws Exception {
|
||||
if (id == null) {
|
||||
return null;
|
||||
}
|
||||
for (final var elem : datas) {
|
||||
if (elem.id.equals(id)) {
|
||||
return elem.getOid();
|
||||
}
|
||||
}
|
||||
throw new Exception("Does not exist");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateStep() throws Exception {
|
||||
addAction((final DBAccess daMongo) -> {
|
||||
// Create the previous connection on SQL:
|
||||
final DbConfig configSQL = new DbConfig("mysql", "db", (short) 3306, ConfigBaseVariable.getDBLogin(), ConfigBaseVariable.getDBPassword(), ConfigBaseVariable.getDBName(),
|
||||
ConfigBaseVariable.getDBKeepConnected(), List.of(ConfigBaseVariable.getBbInterfacesClasses()));
|
||||
try (final DBAccess daSQL = DBAccess.createInterface(configSQL)) {
|
||||
final List<Data> allData = daSQL.gets(Data.class, new ReadAllColumn(), new AccessDeletedItems());
|
||||
final List<AlbumOld> allOldAlbums = daSQL.gets(AlbumOld.class, new ReadAllColumn(), new AccessDeletedItems());
|
||||
final List<ArtistOld> allOldArtist = daSQL.gets(ArtistOld.class, new ReadAllColumn(), new AccessDeletedItems());
|
||||
final List<GenderOld> allOldGender = daSQL.gets(GenderOld.class, new ReadAllColumn(), new AccessDeletedItems());
|
||||
final List<TrackOld> allTOldrack = daSQL.gets(TrackOld.class, new ReadAllColumn(), new AccessDeletedItems());
|
||||
for (final Data elem : allData) {
|
||||
daMongo.insert(elem, new DirectData());
|
||||
}
|
||||
for (final AlbumOld elem : allOldAlbums) {
|
||||
final Album tmp = new Album();
|
||||
tmp.oid = elem.getOid();
|
||||
tmp.deleted = elem.deleted;
|
||||
tmp.updatedAt = elem.updatedAt;
|
||||
tmp.createdAt = elem.createdAt;
|
||||
tmp.name = elem.name;
|
||||
tmp.description = elem.description;
|
||||
tmp.covers = elem.covers;
|
||||
daMongo.insert(tmp, new DirectData());
|
||||
}
|
||||
for (final ArtistOld elem : allOldArtist) {
|
||||
final Artist tmp = new Artist();
|
||||
tmp.oid = elem.getOid();
|
||||
tmp.deleted = elem.deleted;
|
||||
tmp.updatedAt = elem.updatedAt;
|
||||
tmp.createdAt = elem.createdAt;
|
||||
tmp.name = elem.name;
|
||||
tmp.description = elem.description;
|
||||
tmp.covers = elem.covers;
|
||||
tmp.firstName = elem.firstName;
|
||||
tmp.birth = elem.birth;
|
||||
tmp.death = elem.death;
|
||||
daMongo.insert(tmp, new DirectData());
|
||||
}
|
||||
for (final GenderOld elem : allOldGender) {
|
||||
final Gender tmp = new Gender();
|
||||
tmp.oid = elem.getOid();
|
||||
tmp.deleted = elem.deleted;
|
||||
tmp.updatedAt = elem.updatedAt;
|
||||
tmp.createdAt = elem.createdAt;
|
||||
tmp.name = elem.name;
|
||||
tmp.description = elem.description;
|
||||
tmp.covers = elem.covers;
|
||||
daMongo.insert(tmp, new DirectData());
|
||||
}
|
||||
for (final TrackOld elem : allTOldrack) {
|
||||
final Track tmp = new Track();
|
||||
tmp.oid = elem.getOid();
|
||||
tmp.deleted = elem.deleted;
|
||||
tmp.updatedAt = elem.updatedAt;
|
||||
tmp.createdAt = elem.createdAt;
|
||||
tmp.name = elem.name;
|
||||
tmp.description = elem.description;
|
||||
tmp.covers = elem.covers;
|
||||
tmp.genderId = getElementGender(allOldGender, elem.genderId);
|
||||
tmp.albumId = getElementAlbum(allOldAlbums, elem.albumId);
|
||||
tmp.track = elem.track;
|
||||
tmp.dataId = elem.dataId;
|
||||
tmp.artists = new ArrayList<>();
|
||||
for (final Long artistId : elem.artists) {
|
||||
tmp.artists.add(getElementArtist(allOldArtist, artistId));
|
||||
}
|
||||
daMongo.insert(tmp, new DirectData());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,27 @@
|
||||
package org.atriasoft.karusic.migration;
|
||||
|
||||
import org.atriasoft.archidata.dataAccess.DBAccess;
|
||||
import org.atriasoft.archidata.dataAccess.DBAccessMongo;
|
||||
import org.atriasoft.archidata.migration.MigrationSqlStep;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class Migration20250928 extends MigrationSqlStep {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(Migration20250928.class);
|
||||
|
||||
public static final int KARSO_INITIALISATION_ID = 1;
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "migration-2025-09-28: Renzme collection Data in Data";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateStep() throws Exception {
|
||||
addAction((final DBAccess da) -> {
|
||||
if (da instanceof final DBAccessMongo daMongo) {
|
||||
daMongo.renameCollection("Data", "data");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@@ -1,9 +1,10 @@
|
||||
package org.kar.karusic.migration.model;
|
||||
package org.atriasoft.karusic.migration.model;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.kar.archidata.annotation.DataJson;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.atriasoft.archidata.annotation.DataJson;
|
||||
|
||||
import jakarta.persistence.Id;
|
||||
|
||||
@@ -12,4 +13,6 @@ public class CoverConversion {
|
||||
public Long id = null;
|
||||
@DataJson
|
||||
public List<UUID> covers = null;
|
||||
@DataJson
|
||||
public List<ObjectId> covers_oid = null;
|
||||
}
|
@@ -0,0 +1,14 @@
|
||||
package org.atriasoft.karusic.migration.model;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import org.bson.types.ObjectId;
|
||||
|
||||
import jakarta.persistence.Id;
|
||||
|
||||
public class MediaConversion {
|
||||
@Id
|
||||
public Long id = null;
|
||||
public UUID dataId = null;
|
||||
public ObjectId dataOid = null;
|
||||
}
|
@@ -0,0 +1,13 @@
|
||||
package org.atriasoft.karusic.migration.model;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import org.bson.types.ObjectId;
|
||||
|
||||
import jakarta.persistence.Id;
|
||||
|
||||
public class OIDConversion {
|
||||
@Id
|
||||
public UUID uuid = null;
|
||||
public ObjectId _id = null;
|
||||
}
|
42
back/src/org/atriasoft/karusic/model/Album.java
Normal file
42
back/src/org/atriasoft/karusic/model/Album.java
Normal file
@@ -0,0 +1,42 @@
|
||||
package org.atriasoft.karusic.model;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.DataIfNotExists;
|
||||
import org.atriasoft.archidata.annotation.apiGenerator.ApiGenerationMode;
|
||||
import org.atriasoft.archidata.annotation.checker.CheckForeignKey;
|
||||
import org.atriasoft.archidata.annotation.checker.CollectionNotEmpty;
|
||||
import org.atriasoft.archidata.model.Data;
|
||||
import org.atriasoft.archidata.model.OIDGenericDataSoftDelete;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.hibernate.validator.constraints.UniqueElements;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.annotation.Nullable;
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
@Entity()
|
||||
@DataIfNotExists
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@ApiGenerationMode(create = true, update = true)
|
||||
public class Album extends OIDGenericDataSoftDelete {
|
||||
@Column(length = 256)
|
||||
@Size(min = 1, max = 256)
|
||||
public String name = null;
|
||||
@Column(length = 0)
|
||||
@Size(min = 0, max = 8192)
|
||||
public String description = null;
|
||||
@Schema(description = "List of Id of the specific covers")
|
||||
@Nullable
|
||||
@CollectionNotEmpty
|
||||
@UniqueElements
|
||||
public List<@CheckForeignKey(target = Data.class) @NotNull ObjectId> covers = null;
|
||||
|
||||
public Date publication;
|
||||
}
|
54
back/src/org/atriasoft/karusic/model/Artist.java
Normal file
54
back/src/org/atriasoft/karusic/model/Artist.java
Normal file
@@ -0,0 +1,54 @@
|
||||
package org.atriasoft.karusic.model;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.DataIfNotExists;
|
||||
import org.atriasoft.archidata.annotation.apiGenerator.ApiGenerationMode;
|
||||
import org.atriasoft.archidata.annotation.checker.CheckForeignKey;
|
||||
import org.atriasoft.archidata.annotation.checker.CollectionNotEmpty;
|
||||
import org.atriasoft.archidata.model.Data;
|
||||
import org.atriasoft.archidata.model.OIDGenericDataSoftDelete;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.hibernate.validator.constraints.UniqueElements;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.annotation.Nullable;
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
@Entity()
|
||||
@DataIfNotExists
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@ApiGenerationMode(create = true, update = true)
|
||||
public class Artist extends OIDGenericDataSoftDelete {
|
||||
@Column(length = 256)
|
||||
@Size(min = 1, max = 256)
|
||||
public String name = null;
|
||||
@Column(length = 0)
|
||||
@Size(min = 0, max = 8192)
|
||||
public String description = null;
|
||||
@Schema(description = "List of Id of the specific covers")
|
||||
@Nullable
|
||||
@CollectionNotEmpty
|
||||
@UniqueElements
|
||||
public List<@CheckForeignKey(target = Data.class) @NotNull ObjectId> covers = null;
|
||||
@Column(length = 256)
|
||||
@Size(min = 1, max = 256)
|
||||
public String firstName = null;
|
||||
@Column(length = 256)
|
||||
@Size(min = 1, max = 256)
|
||||
public String surname = null;
|
||||
public Date birth = null;
|
||||
public Date death = null;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Artist [id=" + this.oid + ", name=" + this.name + ", description=" + this.description + ", covers=" + this.covers + ", firstName=" + this.firstName + ", surname=" + this.surname
|
||||
+ ", birth=" + this.birth + ", death=" + this.death + "]";
|
||||
}
|
||||
}
|
63
back/src/org/atriasoft/karusic/model/Gender.java
Normal file
63
back/src/org/atriasoft/karusic/model/Gender.java
Normal file
@@ -0,0 +1,63 @@
|
||||
package org.atriasoft.karusic.model;
|
||||
/*
|
||||
CREATE TABLE `node` (
|
||||
`id` bigint NOT NULL COMMENT 'table ID' AUTO_INCREMENT PRIMARY KEY,
|
||||
`deleted` BOOLEAN NOT NULL DEFAULT false,
|
||||
`create_date` datetime NOT NULL DEFAULT now() COMMENT 'Time the element has been created',
|
||||
`modify_date` datetime NOT NULL DEFAULT now() COMMENT 'Time the element has been update',
|
||||
`type` enum("TYPE", "UNIVERS", "SERIE", "SAISON", "MEDIA") NOT NULL DEFAULT 'TYPE',
|
||||
`name` TEXT COLLATE 'utf8_general_ci' NOT NULL,
|
||||
`description` TEXT COLLATE 'utf8_general_ci',
|
||||
`parent_id` bigint
|
||||
) AUTO_INCREMENT=10;
|
||||
*/
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.DataIfNotExists;
|
||||
import org.atriasoft.archidata.annotation.apiGenerator.ApiGenerationMode;
|
||||
import org.atriasoft.archidata.annotation.checker.CheckForeignKey;
|
||||
import org.atriasoft.archidata.annotation.checker.CollectionNotEmpty;
|
||||
import org.atriasoft.archidata.model.Data;
|
||||
import org.atriasoft.archidata.model.OIDGenericDataSoftDelete;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.hibernate.validator.constraints.UniqueElements;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.annotation.Nullable;
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
@Entity()
|
||||
@DataIfNotExists
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@ApiGenerationMode(create = true, update = true)
|
||||
public class Gender extends OIDGenericDataSoftDelete {
|
||||
@Column(length = 256)
|
||||
@Size(min = 1, max = 256)
|
||||
public String name = null;
|
||||
@Column(length = 0)
|
||||
@Size(min = 0, max = 8192)
|
||||
public String description = null;
|
||||
@Schema(description = "List of Id of the specific covers")
|
||||
@Nullable
|
||||
@CollectionNotEmpty
|
||||
@UniqueElements
|
||||
public List<@CheckForeignKey(target = Data.class) @NotNull ObjectId> covers = null;
|
||||
|
||||
public Gender() {}
|
||||
|
||||
public Gender(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Gender(final ObjectId oid, final String name) {
|
||||
this.oid = oid;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
}
|
52
back/src/org/atriasoft/karusic/model/Playlist.java
Normal file
52
back/src/org/atriasoft/karusic/model/Playlist.java
Normal file
@@ -0,0 +1,52 @@
|
||||
package org.atriasoft.karusic.model;
|
||||
/*
|
||||
CREATE TABLE `node` (
|
||||
`id` bigint NOT NULL COMMENT 'table ID' AUTO_INCREMENT PRIMARY KEY,
|
||||
`deleted` BOOLEAN NOT NULL DEFAULT false,
|
||||
`create_date` datetime NOT NULL DEFAULT now() COMMENT 'Time the element has been created',
|
||||
`modify_date` datetime NOT NULL DEFAULT now() COMMENT 'Time the element has been update',
|
||||
`type` enum("TYPE", "UNIVERS", "SERIE", "SAISON", "MEDIA") NOT NULL DEFAULT 'TYPE',
|
||||
`name` TEXT COLLATE 'utf8_general_ci' NOT NULL,
|
||||
`description` TEXT COLLATE 'utf8_general_ci',
|
||||
`parent_id` bigint
|
||||
) AUTO_INCREMENT=10;
|
||||
*/
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.DataIfNotExists;
|
||||
import org.atriasoft.archidata.annotation.apiGenerator.ApiGenerationMode;
|
||||
import org.atriasoft.archidata.annotation.checker.CheckForeignKey;
|
||||
import org.atriasoft.archidata.annotation.checker.CollectionNotEmpty;
|
||||
import org.atriasoft.archidata.model.Data;
|
||||
import org.atriasoft.archidata.model.OIDGenericDataSoftDelete;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.hibernate.validator.constraints.UniqueElements;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.annotation.Nullable;
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
@Entity()
|
||||
@DataIfNotExists
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@ApiGenerationMode(create = true, update = true)
|
||||
public class Playlist extends OIDGenericDataSoftDelete {
|
||||
@Column(length = 256)
|
||||
@Size(min = 1, max = 256)
|
||||
public String name = null;
|
||||
@Column(length = 0)
|
||||
@Size(min = 0, max = 8192)
|
||||
public String description = null;
|
||||
@Schema(description = "List of Id of the specific covers")
|
||||
@Nullable
|
||||
@CollectionNotEmpty
|
||||
@UniqueElements
|
||||
public List<@CheckForeignKey(target = Data.class) @NotNull ObjectId> covers = null;
|
||||
public List<@CheckForeignKey(target = Track.class) @NotNull ObjectId> tracks = null;
|
||||
}
|
10
back/src/org/atriasoft/karusic/model/State.java
Normal file
10
back/src/org/atriasoft/karusic/model/State.java
Normal file
@@ -0,0 +1,10 @@
|
||||
package org.atriasoft.karusic.model;
|
||||
|
||||
public enum State {
|
||||
// User has remove his account
|
||||
REMOVED,
|
||||
// User has been blocked his account
|
||||
BLOCKED,
|
||||
// generic user
|
||||
USER
|
||||
}
|
57
back/src/org/atriasoft/karusic/model/Track.java
Normal file
57
back/src/org/atriasoft/karusic/model/Track.java
Normal file
@@ -0,0 +1,57 @@
|
||||
package org.atriasoft.karusic.model;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.DataIfNotExists;
|
||||
import org.atriasoft.archidata.annotation.apiGenerator.ApiGenerationMode;
|
||||
import org.atriasoft.archidata.annotation.checker.CheckForeignKey;
|
||||
import org.atriasoft.archidata.annotation.checker.CollectionNotEmpty;
|
||||
import org.atriasoft.archidata.model.Data;
|
||||
import org.atriasoft.archidata.model.OIDGenericDataSoftDelete;
|
||||
import org.bson.types.ObjectId;
|
||||
import org.hibernate.validator.constraints.UniqueElements;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.annotation.Nullable;
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import jakarta.validation.constraints.PositiveOrZero;
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
@Entity()
|
||||
@DataIfNotExists
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
@ApiGenerationMode(create = true, update = true)
|
||||
public class Track extends OIDGenericDataSoftDelete {
|
||||
|
||||
@Column(length = 256)
|
||||
@Size(min = 1, max = 256)
|
||||
public String name = null;
|
||||
@Column(length = 0)
|
||||
@Size(min = 0, max = 8192)
|
||||
public String description = null;
|
||||
@Schema(description = "List of Id of the specific covers")
|
||||
@Nullable
|
||||
@CollectionNotEmpty
|
||||
@UniqueElements
|
||||
public List<@CheckForeignKey(target = Data.class) @NotNull ObjectId> covers = null;
|
||||
@CheckForeignKey(target = Gender.class)
|
||||
public ObjectId genderId = null;
|
||||
@CheckForeignKey(target = Album.class)
|
||||
public ObjectId albumId = null;
|
||||
@PositiveOrZero
|
||||
public Long track = null;
|
||||
@CheckForeignKey(target = Data.class)
|
||||
public ObjectId dataId = null;
|
||||
@Column(length = 0)
|
||||
public List<@CheckForeignKey(target = Artist.class) @NotNull ObjectId> artists = null;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Track [oid=" + this.oid + ", deleted=" + this.deleted + ", createdAt=" + this.createdAt + ", updatedAt=" + this.updatedAt + ", name=" + this.name + ", description=" + this.description
|
||||
+ ", covers=" + this.covers + ", genderId=" + this.genderId + ", albumId=" + this.albumId + ", track=" + this.track + ", dataId=" + this.dataId + ", artists=" + this.artists + "]";
|
||||
}
|
||||
}
|
@@ -1,7 +1,7 @@
|
||||
package org.kar.karusic.model;
|
||||
package org.atriasoft.karusic.model;
|
||||
|
||||
import org.kar.archidata.annotation.DataIfNotExists;
|
||||
import org.kar.archidata.model.User;
|
||||
import org.atriasoft.archidata.annotation.DataIfNotExists;
|
||||
import org.atriasoft.archidata.model.User;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
32
back/src/org/atriasoft/karusic/modelOld/AlbumOld.java
Normal file
32
back/src/org/atriasoft/karusic/modelOld/AlbumOld.java
Normal file
@@ -0,0 +1,32 @@
|
||||
package org.atriasoft.karusic.modelOld;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.DataJson;
|
||||
import org.atriasoft.archidata.model.GenericDataSoftDelete;
|
||||
import org.bson.types.ObjectId;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Table;
|
||||
|
||||
@Table(name = "album")
|
||||
public class AlbumOld extends GenericDataSoftDelete {
|
||||
@Column(length = 256)
|
||||
public String name = null;
|
||||
@Column(length = 0)
|
||||
public String description = null;
|
||||
@Schema(description = "List of Id of the specific covers")
|
||||
@DataJson()
|
||||
public List<ObjectId> covers = null;
|
||||
|
||||
public Date publication;
|
||||
|
||||
@Column(nullable = true)
|
||||
private final ObjectId oid = new ObjectId();
|
||||
|
||||
public ObjectId getOid() {
|
||||
return this.oid;
|
||||
}
|
||||
}
|
34
back/src/org/atriasoft/karusic/modelOld/ArtistOld.java
Normal file
34
back/src/org/atriasoft/karusic/modelOld/ArtistOld.java
Normal file
@@ -0,0 +1,34 @@
|
||||
package org.atriasoft.karusic.modelOld;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.DataJson;
|
||||
import org.atriasoft.archidata.model.GenericDataSoftDelete;
|
||||
import org.bson.types.ObjectId;
|
||||
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Table;
|
||||
|
||||
@Table(name = "artist")
|
||||
public class ArtistOld extends GenericDataSoftDelete {
|
||||
@Column(length = 256)
|
||||
public String name = null;
|
||||
@Column(length = 0)
|
||||
public String description = null;
|
||||
@DataJson()
|
||||
public List<ObjectId> covers = null;
|
||||
@Column(length = 256)
|
||||
public String firstName = null;
|
||||
@Column(length = 256)
|
||||
public String surname = null;
|
||||
public Date birth = null;
|
||||
public Date death = null;
|
||||
|
||||
@Column(nullable = true)
|
||||
private final ObjectId oid = new ObjectId();
|
||||
|
||||
public ObjectId getOid() {
|
||||
return this.oid;
|
||||
}
|
||||
}
|
53
back/src/org/atriasoft/karusic/modelOld/GenderOld.java
Normal file
53
back/src/org/atriasoft/karusic/modelOld/GenderOld.java
Normal file
@@ -0,0 +1,53 @@
|
||||
package org.atriasoft.karusic.modelOld;
|
||||
/*
|
||||
CREATE TABLE `node` (
|
||||
`id` bigint NOT NULL COMMENT 'table ID' AUTO_INCREMENT PRIMARY KEY,
|
||||
`deleted` BOOLEAN NOT NULL DEFAULT false,
|
||||
`create_date` datetime NOT NULL DEFAULT now() COMMENT 'Time the element has been created',
|
||||
`modify_date` datetime NOT NULL DEFAULT now() COMMENT 'Time the element has been update',
|
||||
`type` enum("TYPE", "UNIVERS", "SERIE", "SAISON", "MEDIA") NOT NULL DEFAULT 'TYPE',
|
||||
`name` TEXT COLLATE 'utf8_general_ci' NOT NULL,
|
||||
`description` TEXT COLLATE 'utf8_general_ci',
|
||||
`parent_id` bigint
|
||||
) AUTO_INCREMENT=10;
|
||||
*/
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.atriasoft.archidata.annotation.DataJson;
|
||||
import org.atriasoft.archidata.annotation.checker.CheckForeignKey;
|
||||
import org.atriasoft.archidata.model.Data;
|
||||
import org.atriasoft.archidata.model.GenericDataSoftDelete;
|
||||
import org.bson.types.ObjectId;
|
||||
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Table;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
@Table(name = "gender")
|
||||
public class GenderOld extends GenericDataSoftDelete {
|
||||
@Column(length = 256)
|
||||
public String name = null;
|
||||
@Column(length = 0)
|
||||
public String description = null;
|
||||
@DataJson()
|
||||
public List<@CheckForeignKey(target = Data.class) @NotNull ObjectId> covers = null;
|
||||
|
||||
public GenderOld() {}
|
||||
|
||||
public GenderOld(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public GenderOld(final Long id, final String name) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Column(nullable = true)
|
||||
private final ObjectId oid = new ObjectId();
|
||||
|
||||
public ObjectId getOid() {
|
||||
return this.oid;
|
||||
}
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
package org.kar.karusic.model;
|
||||
package org.atriasoft.karusic.modelOld;
|
||||
/*
|
||||
CREATE TABLE `node` (
|
||||
`id` bigint NOT NULL COMMENT 'table ID' AUTO_INCREMENT PRIMARY KEY,
|
||||
@@ -13,32 +13,36 @@ CREATE TABLE `node` (
|
||||
*/
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.kar.archidata.annotation.DataIfNotExists;
|
||||
import org.kar.archidata.annotation.DataJson;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import org.atriasoft.archidata.annotation.DataJson;
|
||||
import org.atriasoft.archidata.annotation.checker.CheckForeignKey;
|
||||
import org.atriasoft.archidata.model.Data;
|
||||
import org.atriasoft.archidata.model.GenericDataSoftDelete;
|
||||
import org.bson.types.ObjectId;
|
||||
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Table;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
@Table(name = "track")
|
||||
@DataIfNotExists
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class Track extends NodeSmall {
|
||||
public class TrackOld extends GenericDataSoftDelete {
|
||||
@Column(length = 256)
|
||||
public String name = null;
|
||||
@Column(length = 0)
|
||||
public String description = null;
|
||||
@DataJson()
|
||||
public List<@CheckForeignKey(target = Data.class) @NotNull ObjectId> covers = null;
|
||||
public Long genderId = null;
|
||||
public Long albumId = null;
|
||||
public Long track = null;
|
||||
public UUID dataId = null;
|
||||
//@ManyToMany(fetch = FetchType.LAZY, targetEntity = Artist.class)
|
||||
public ObjectId dataId = null;
|
||||
@DataJson
|
||||
@Column(length = 0)
|
||||
public List<Long> artists = null;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Track [id=" + this.id + ", deleted=" + this.deleted + ", createdAt=" + this.createdAt + ", updatedAt=" + this.updatedAt + ", name=" + this.name + ", description=" + this.description
|
||||
+ ", covers=" + this.covers + ", genderId=" + this.genderId + ", albumId=" + this.albumId + ", track=" + this.track + ", dataId=" + this.dataId + ", artists=" + this.artists + "]";
|
||||
@Column(nullable = true)
|
||||
private final ObjectId oid = new ObjectId();
|
||||
|
||||
public ObjectId getOid() {
|
||||
return this.oid;
|
||||
}
|
||||
}
|
29
back/src/org/atriasoft/karusic/util/ConfigVariable.java
Normal file
29
back/src/org/atriasoft/karusic/util/ConfigVariable.java
Normal file
@@ -0,0 +1,29 @@
|
||||
package org.atriasoft.karusic.util;
|
||||
|
||||
public class ConfigVariable {
|
||||
public static final String BASE_NAME = "ORG_KARUSIC_";
|
||||
|
||||
public static String getFrontFolder() {
|
||||
final String out = System.getenv(BASE_NAME + "FRONT_FOLDER");
|
||||
if (out == null) {
|
||||
return "/application/front";
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
public static String getBackupFolder() {
|
||||
final String out = System.getenv(BASE_NAME + "BACKUP_FOLDER");
|
||||
if (out == null) {
|
||||
return "/application/backup";
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
public static boolean isInitWithBackup() {
|
||||
final String out = System.getenv(BASE_NAME + "INIT_WITH_BACKUP");
|
||||
if (out == null) {
|
||||
return false;
|
||||
}
|
||||
return "true".equals(out);
|
||||
}
|
||||
}
|
@@ -1,169 +0,0 @@
|
||||
package org.kar.karusic;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import org.glassfish.grizzly.http.server.HttpServer;
|
||||
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
|
||||
import org.glassfish.jersey.jackson.JacksonFeature;
|
||||
import org.glassfish.jersey.media.multipart.MultiPartFeature;
|
||||
import org.glassfish.jersey.server.ResourceConfig;
|
||||
import org.kar.archidata.GlobalConfiguration;
|
||||
import org.kar.archidata.UpdateJwtPublicKey;
|
||||
import org.kar.archidata.api.DataResource;
|
||||
import org.kar.archidata.catcher.ExceptionCatcher;
|
||||
import org.kar.archidata.catcher.FailExceptionCatcher;
|
||||
import org.kar.archidata.catcher.InputExceptionCatcher;
|
||||
import org.kar.archidata.catcher.JacksonCatcher;
|
||||
import org.kar.archidata.catcher.SystemExceptionCatcher;
|
||||
import org.kar.archidata.filter.CORSFilter;
|
||||
import org.kar.archidata.filter.OptionFilter;
|
||||
import org.kar.archidata.migration.MigrationEngine;
|
||||
import org.kar.archidata.tools.ConfigBaseVariable;
|
||||
import org.kar.karusic.api.AlbumResource;
|
||||
import org.kar.karusic.api.ArtistResource;
|
||||
import org.kar.karusic.api.Front;
|
||||
import org.kar.karusic.api.GenderResource;
|
||||
import org.kar.karusic.api.HealthCheck;
|
||||
import org.kar.karusic.api.PlaylistResource;
|
||||
import org.kar.karusic.api.TrackResource;
|
||||
import org.kar.karusic.api.UserResource;
|
||||
import org.kar.karusic.filter.KarusicAuthenticationFilter;
|
||||
import org.kar.karusic.migration.Initialization;
|
||||
import org.kar.karusic.migration.Migration20231126;
|
||||
import org.kar.karusic.migration.Migration20240225;
|
||||
import org.kar.karusic.migration.Migration20240226;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import jakarta.ws.rs.core.UriBuilder;
|
||||
|
||||
public class WebLauncher {
|
||||
final static Logger LOGGER = LoggerFactory.getLogger(WebLauncher.class);
|
||||
protected UpdateJwtPublicKey keyUpdater = null;
|
||||
protected HttpServer server = null;
|
||||
|
||||
public WebLauncher() {
|
||||
ConfigBaseVariable.bdDatabase = "karusic";
|
||||
}
|
||||
|
||||
private static URI getBaseURI() {
|
||||
return UriBuilder.fromUri(ConfigBaseVariable.getlocalAddress()).build();
|
||||
}
|
||||
|
||||
public void migrateDB() throws Exception {
|
||||
WebLauncher.LOGGER.info("Create migration engine");
|
||||
final MigrationEngine migrationEngine = new MigrationEngine();
|
||||
WebLauncher.LOGGER.info("Add initialization");
|
||||
migrationEngine.setInit(new Initialization());
|
||||
WebLauncher.LOGGER.info("Add migration since last version");
|
||||
migrationEngine.add(new Migration20231126());
|
||||
migrationEngine.add(new Migration20240225());
|
||||
migrationEngine.add(new Migration20240226());
|
||||
WebLauncher.LOGGER.info("Migrate the DB [START]");
|
||||
migrationEngine.migrateWaitAdmin(GlobalConfiguration.dbConfig);
|
||||
WebLauncher.LOGGER.info("Migrate the DB [STOP]");
|
||||
}
|
||||
|
||||
public static void main(final String[] args) throws Exception {
|
||||
WebLauncher.LOGGER.info("[START] application wake UP");
|
||||
final WebLauncher launcher = new WebLauncher();
|
||||
launcher.migrateDB();
|
||||
|
||||
launcher.process();
|
||||
WebLauncher.LOGGER.info("end-configure the server & wait finish process:");
|
||||
Thread.currentThread().join();
|
||||
WebLauncher.LOGGER.info("STOP Key updater");
|
||||
launcher.stopOther();
|
||||
WebLauncher.LOGGER.info("STOP the REST server:");
|
||||
}
|
||||
|
||||
public void process() throws InterruptedException {
|
||||
// ===================================================================
|
||||
// Configure resources
|
||||
// ===================================================================
|
||||
final ResourceConfig rc = new ResourceConfig();
|
||||
|
||||
// add multipart models ..
|
||||
rc.register(MultiPartFeature.class);
|
||||
// global authentication system
|
||||
rc.register(OptionFilter.class);
|
||||
// remove cors ==> all time called by an other system...
|
||||
rc.register(CORSFilter.class);
|
||||
// global authentication system
|
||||
rc.register(KarusicAuthenticationFilter.class);
|
||||
// register exception catcher
|
||||
rc.register(JacksonCatcher.class);
|
||||
rc.register(InputExceptionCatcher.class);
|
||||
rc.register(SystemExceptionCatcher.class);
|
||||
rc.register(FailExceptionCatcher.class);
|
||||
rc.register(ExceptionCatcher.class);
|
||||
// add default resource:
|
||||
rc.register(UserResource.class);
|
||||
rc.register(AlbumResource.class);
|
||||
rc.register(ArtistResource.class);
|
||||
rc.register(GenderResource.class);
|
||||
rc.register(PlaylistResource.class);
|
||||
rc.register(TrackResource.class);
|
||||
rc.register(DataResource.class);
|
||||
|
||||
rc.register(HealthCheck.class);
|
||||
rc.register(Front.class);
|
||||
|
||||
// add jackson to be discover when we are ins standalone server
|
||||
rc.register(JacksonFeature.class);
|
||||
// enable this to show low level request
|
||||
//rc.property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_SERVER, Level.WARNING.getName());
|
||||
|
||||
//System.out.println("Connect on the BDD:");
|
||||
//System.out.println(" getDBHost: '" + ConfigVariable.getDBHost() + "'");
|
||||
//System.out.println(" getDBPort: '" + ConfigVariable.getDBPort() + "'");
|
||||
//System.out.println(" getDBLogin: '" + ConfigVariable.getDBLogin() + "'");
|
||||
//System.out.println(" getDBPassword: '" + ConfigVariable.getDBPassword() + "'");
|
||||
//System.out.println(" getDBName: '" + ConfigVariable.getDBName() + "'");
|
||||
System.out.println(" ==> " + GlobalConfiguration.dbConfig);
|
||||
System.out.println("OAuth service " + getBaseURI());
|
||||
this.server = GrizzlyHttpServerFactory.createHttpServer(getBaseURI(), rc);
|
||||
final HttpServer serverLink = this.server;
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
System.out.println("Stopping server..");
|
||||
serverLink.shutdownNow();
|
||||
}
|
||||
}, "shutdownHook"));
|
||||
|
||||
// ===================================================================
|
||||
// start periodic update of the token ...
|
||||
// ===================================================================
|
||||
this.keyUpdater = new UpdateJwtPublicKey();
|
||||
this.keyUpdater.start();
|
||||
|
||||
// ===================================================================
|
||||
// run JERSEY
|
||||
// ===================================================================
|
||||
try {
|
||||
this.server.start();
|
||||
LOGGER.info("Jersey app started at {}", getBaseURI());
|
||||
} catch (final Exception e) {
|
||||
LOGGER.error("There was an error while starting Grizzly HTTP server.");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
if (this.server != null) {
|
||||
this.server.shutdownNow();
|
||||
this.server = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void stopOther() {
|
||||
this.keyUpdater.kill();
|
||||
try {
|
||||
this.keyUpdater.join(4000, 0);
|
||||
} catch (final InterruptedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,65 +0,0 @@
|
||||
package org.kar.karusic;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.kar.archidata.api.DataResource;
|
||||
import org.kar.archidata.dataAccess.DataFactoryTsApi;
|
||||
import org.kar.archidata.tools.ConfigBaseVariable;
|
||||
import org.kar.karusic.api.AlbumResource;
|
||||
import org.kar.karusic.api.ArtistResource;
|
||||
import org.kar.karusic.api.Front;
|
||||
import org.kar.karusic.api.GenderResource;
|
||||
import org.kar.karusic.api.HealthCheck;
|
||||
import org.kar.karusic.api.PlaylistResource;
|
||||
import org.kar.karusic.api.TrackResource;
|
||||
import org.kar.karusic.api.UserResource;
|
||||
import org.kar.karusic.migration.Initialization;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class WebLauncherLocal extends WebLauncher {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(WebLauncherLocal.class);
|
||||
|
||||
private WebLauncherLocal() {}
|
||||
|
||||
public static void main(final String[] args) throws Exception {
|
||||
DataFactoryTsApi.generatePackage(List.of(
|
||||
AlbumResource.class,
|
||||
ArtistResource.class,
|
||||
Front.class,
|
||||
GenderResource.class,
|
||||
HealthCheck.class,
|
||||
PlaylistResource.class,
|
||||
UserResource.class,
|
||||
TrackResource.class,
|
||||
DataResource.class),
|
||||
Initialization.CLASSES_BASE, "../front/src/app/back-api/");
|
||||
final WebLauncherLocal launcher = new WebLauncherLocal();
|
||||
launcher.process();
|
||||
launcher.LOGGER.info("end-configure the server & wait finish process:");
|
||||
Thread.currentThread().join();
|
||||
launcher.LOGGER.info("STOP the REST server:");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process() throws InterruptedException {
|
||||
if (true) {
|
||||
// for local test:
|
||||
ConfigBaseVariable.apiAdress = "http://0.0.0.0:19080/karusic/api/";
|
||||
//ConfigBaseVariable.ssoAdress = "https://atria-soft.org/karso/api/";
|
||||
ConfigBaseVariable.dbPort = "3906";
|
||||
}
|
||||
try {
|
||||
super.migrateDB();
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
while (true) {
|
||||
LOGGER.error("============================================================================");
|
||||
LOGGER.error("== Migration fail ==> waiting intervention of administrator...");
|
||||
LOGGER.error("============================================================================");
|
||||
Thread.sleep(60 * 60 * 1000);
|
||||
}
|
||||
}
|
||||
super.process();
|
||||
}
|
||||
}
|
@@ -1,117 +0,0 @@
|
||||
package org.kar.karusic.api;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
|
||||
import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||
import org.kar.archidata.annotation.AsyncType;
|
||||
import org.kar.archidata.annotation.TypeScriptProgress;
|
||||
import org.kar.archidata.dataAccess.DataAccess;
|
||||
import org.kar.archidata.dataAccess.addOn.AddOnDataJson;
|
||||
import org.kar.archidata.dataAccess.addOn.AddOnManyToMany;
|
||||
import org.kar.archidata.tools.DataTools;
|
||||
import org.kar.karusic.model.Album;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.DELETE;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.PATCH;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.PathParam;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
|
||||
@Path("/album")
|
||||
@Produces({ MediaType.APPLICATION_JSON })
|
||||
public class AlbumResource {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(AlbumResource.class);
|
||||
|
||||
@GET
|
||||
@Path("{id}")
|
||||
@RolesAllowed("USER")
|
||||
@Operation(description = "Get a specific Album with his ID")
|
||||
public static Album get(@PathParam("id") final Long id) throws Exception {
|
||||
return DataAccess.get(Album.class, id);
|
||||
}
|
||||
|
||||
@GET
|
||||
@RolesAllowed("USER")
|
||||
@Operation(description = "Get all the available Albums")
|
||||
public List<Album> gets() throws Exception {
|
||||
return DataAccess.gets(Album.class);
|
||||
}
|
||||
|
||||
@POST
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Operation(description = "Add an album (when all the data already exist)")
|
||||
public Album post(@AsyncType(Album.class) final String jsonRequest) throws Exception {
|
||||
return DataAccess.insertWithJson(Album.class, jsonRequest);
|
||||
}
|
||||
|
||||
@PATCH
|
||||
@Path("{id}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Operation(description = "Update a specific album")
|
||||
public Album patch(@PathParam("id") final Long id, @AsyncType(Album.class) final String jsonRequest) throws Exception {
|
||||
DataAccess.updateWithJson(Album.class, id, jsonRequest);
|
||||
return DataAccess.get(Album.class, id);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Operation(description = "Remove a specific album")
|
||||
public void remove(@PathParam("id") final Long id) throws Exception {
|
||||
DataAccess.delete(Album.class, id);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("{id}/track/{trackId}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes({ MediaType.MULTIPART_FORM_DATA })
|
||||
@Operation(description = "Add a Track on a specific album")
|
||||
public Album addTrack(@PathParam("id") final Long id, @PathParam("trackId") final Long trackId) throws Exception {
|
||||
AddOnManyToMany.removeLink(Album.class, id, "track", trackId);
|
||||
return DataAccess.get(Album.class, id);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}/track/{trackId}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Operation(description = "Remove a Track on a specific album")
|
||||
public Album removeTrack(@PathParam("id") final Long id, @PathParam("trackId") final Long trackId) throws Exception {
|
||||
AddOnManyToMany.removeLink(Album.class, id, "track", trackId);
|
||||
return DataAccess.get(Album.class, id);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("{id}/cover")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes({ MediaType.MULTIPART_FORM_DATA })
|
||||
@Operation(description = "Add a cover on a specific album")
|
||||
@AsyncType(Album.class)
|
||||
@TypeScriptProgress
|
||||
public Response uploadCover(@PathParam("id") final Long id, @FormDataParam("fileName") final String fileName, @FormDataParam("file") final InputStream fileInputStream,
|
||||
@FormDataParam("file") final FormDataContentDisposition fileMetaData) {
|
||||
return DataTools.uploadCover(Album.class, id, fileName, fileInputStream, fileMetaData);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}/cover/{coverId}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Operation(description = "Remove a cover on a specific album")
|
||||
public Album removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception {
|
||||
AddOnDataJson.removeLink(Album.class, id, "covers", coverId);
|
||||
return DataAccess.get(Album.class, id);
|
||||
}
|
||||
}
|
@@ -1,90 +0,0 @@
|
||||
package org.kar.karusic.api;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
|
||||
import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||
import org.kar.archidata.annotation.AsyncType;
|
||||
import org.kar.archidata.annotation.TypeScriptProgress;
|
||||
import org.kar.archidata.dataAccess.DataAccess;
|
||||
import org.kar.archidata.dataAccess.addOn.AddOnDataJson;
|
||||
import org.kar.archidata.tools.DataTools;
|
||||
import org.kar.karusic.model.Artist;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.DELETE;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.PATCH;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.PathParam;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
|
||||
@Path("/artist")
|
||||
@Produces({ MediaType.APPLICATION_JSON })
|
||||
public class ArtistResource {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(ArtistResource.class);
|
||||
|
||||
@GET
|
||||
@Path("{id}")
|
||||
@RolesAllowed("USER")
|
||||
public static Artist get(@PathParam("id") final Long id) throws Exception {
|
||||
return DataAccess.get(Artist.class, id);
|
||||
}
|
||||
|
||||
@GET
|
||||
@RolesAllowed("USER")
|
||||
public List<Artist> gets() throws Exception {
|
||||
return DataAccess.gets(Artist.class);
|
||||
}
|
||||
|
||||
@POST
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Artist post(@AsyncType(Artist.class) final String jsonRequest) throws Exception {
|
||||
return DataAccess.insertWithJson(Artist.class, jsonRequest);
|
||||
}
|
||||
|
||||
@PATCH
|
||||
@Path("{id}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Artist patch(@PathParam("id") final Long id, @AsyncType(Artist.class) final String jsonRequest) throws Exception {
|
||||
DataAccess.updateWithJson(Artist.class, id, jsonRequest);
|
||||
return DataAccess.get(Artist.class, id);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public void remove(@PathParam("id") final Long id) throws Exception {
|
||||
DataAccess.delete(Artist.class, id);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("{id}/cover")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes({ MediaType.MULTIPART_FORM_DATA })
|
||||
@AsyncType(Artist.class)
|
||||
@TypeScriptProgress
|
||||
public Response uploadCover(@PathParam("id") final Long id, @FormDataParam("fileName") final String fileName, @FormDataParam("file") final InputStream fileInputStream,
|
||||
@FormDataParam("file") final FormDataContentDisposition fileMetaData) {
|
||||
return DataTools.uploadCover(Artist.class, id, fileName, fileInputStream, fileMetaData);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}/cover/{coverId}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public Artist removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception {
|
||||
LOGGER.error("klmlmkmlkmlklmklmk");
|
||||
AddOnDataJson.removeLink(Artist.class, id, "covers", coverId);
|
||||
return DataAccess.get(Artist.class, id);
|
||||
}
|
||||
}
|
@@ -1,89 +0,0 @@
|
||||
package org.kar.karusic.api;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
|
||||
import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||
import org.kar.archidata.annotation.AsyncType;
|
||||
import org.kar.archidata.annotation.TypeScriptProgress;
|
||||
import org.kar.archidata.dataAccess.DataAccess;
|
||||
import org.kar.archidata.dataAccess.addOn.AddOnDataJson;
|
||||
import org.kar.archidata.tools.DataTools;
|
||||
import org.kar.karusic.model.Gender;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.DELETE;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.PATCH;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.PathParam;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
|
||||
@Path("/gender")
|
||||
@Produces({ MediaType.APPLICATION_JSON })
|
||||
public class GenderResource {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(GenderResource.class);
|
||||
|
||||
@GET
|
||||
@Path("{id}")
|
||||
@RolesAllowed("USER")
|
||||
public static Gender get(@PathParam("id") final Long id) throws Exception {
|
||||
return DataAccess.get(Gender.class, id);
|
||||
}
|
||||
|
||||
@GET
|
||||
@RolesAllowed("USER")
|
||||
public List<Gender> gets() throws Exception {
|
||||
return DataAccess.gets(Gender.class);
|
||||
}
|
||||
|
||||
@POST
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Gender post(@AsyncType(Gender.class) final String jsonRequest) throws Exception {
|
||||
return DataAccess.insertWithJson(Gender.class, jsonRequest);
|
||||
}
|
||||
|
||||
@PATCH
|
||||
@Path("{id}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Gender patch(@PathParam("id") final Long id, @AsyncType(Gender.class) final String jsonRequest) throws Exception {
|
||||
DataAccess.updateWithJson(Gender.class, id, jsonRequest);
|
||||
return DataAccess.get(Gender.class, id);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public void remove(@PathParam("id") final Long id) throws Exception {
|
||||
DataAccess.delete(Gender.class, id);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("{id}/cover")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes({ MediaType.MULTIPART_FORM_DATA })
|
||||
@AsyncType(Gender.class)
|
||||
@TypeScriptProgress
|
||||
public Response uploadCover(@PathParam("id") final Long id, @FormDataParam("fileName") final String fileName, @FormDataParam("file") final InputStream fileInputStream,
|
||||
@FormDataParam("file") final FormDataContentDisposition fileMetaData) {
|
||||
return DataTools.uploadCover(Gender.class, id, fileName, fileInputStream, fileMetaData);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}/cover/{coverId}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public Gender removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception {
|
||||
AddOnDataJson.removeLink(Gender.class, id, "covers", coverId);
|
||||
return DataAccess.get(Gender.class, id);
|
||||
}
|
||||
}
|
@@ -1,105 +0,0 @@
|
||||
package org.kar.karusic.api;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
|
||||
import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||
import org.kar.archidata.annotation.AsyncType;
|
||||
import org.kar.archidata.dataAccess.DataAccess;
|
||||
import org.kar.archidata.dataAccess.addOn.AddOnDataJson;
|
||||
import org.kar.archidata.dataAccess.addOn.AddOnManyToMany;
|
||||
import org.kar.archidata.tools.DataTools;
|
||||
import org.kar.karusic.model.Playlist;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.DELETE;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.PATCH;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.PathParam;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
|
||||
@Path("/playlist")
|
||||
@Produces({ MediaType.APPLICATION_JSON })
|
||||
public class PlaylistResource {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(PlaylistResource.class);
|
||||
|
||||
@GET
|
||||
@Path("{id}")
|
||||
@RolesAllowed("USER")
|
||||
public static Playlist get(@PathParam("id") final Long id) throws Exception {
|
||||
return DataAccess.get(Playlist.class, id);
|
||||
}
|
||||
|
||||
@GET
|
||||
@RolesAllowed("USER")
|
||||
public List<Playlist> gets() throws Exception {
|
||||
return DataAccess.gets(Playlist.class);
|
||||
}
|
||||
|
||||
@POST
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Playlist post(@AsyncType(Playlist.class) final String jsonRequest) throws Exception {
|
||||
return DataAccess.insertWithJson(Playlist.class, jsonRequest);
|
||||
}
|
||||
|
||||
@PATCH
|
||||
@Path("{id}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Playlist patch(@PathParam("id") final Long id, @AsyncType(Playlist.class) final String jsonRequest) throws Exception {
|
||||
DataAccess.updateWithJson(Playlist.class, id, jsonRequest);
|
||||
return DataAccess.get(Playlist.class, id);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public void remove(@PathParam("id") final Long id) throws Exception {
|
||||
DataAccess.delete(Playlist.class, id);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("{id}/track/{trackId}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes({ MediaType.MULTIPART_FORM_DATA })
|
||||
public Playlist addTrack(@PathParam("id") final Long id, @PathParam("trackId") final Long trackId) throws Exception {
|
||||
AddOnManyToMany.removeLink(Playlist.class, id, "track", trackId);
|
||||
return DataAccess.get(Playlist.class, id);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}/track/{trackId}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public Playlist removeTrack(@PathParam("id") final Long id, @PathParam("trackId") final Long trackId) throws Exception {
|
||||
AddOnManyToMany.removeLink(Playlist.class, id, "track", trackId);
|
||||
return DataAccess.get(Playlist.class, id);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("{id}/cover")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes({ MediaType.MULTIPART_FORM_DATA })
|
||||
@AsyncType(Playlist.class)
|
||||
public Response uploadCover(@PathParam("id") final Long id, @FormDataParam("fileName") final String fileName, @FormDataParam("file") final InputStream fileInputStream,
|
||||
@FormDataParam("file") final FormDataContentDisposition fileMetaData) {
|
||||
return DataTools.uploadCover(Playlist.class, id, fileName, fileInputStream, fileMetaData);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}/cover/{coverId}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public Playlist removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception {
|
||||
AddOnDataJson.removeLink(Playlist.class, id, "covers", coverId);
|
||||
return DataAccess.get(Playlist.class, id);
|
||||
}
|
||||
}
|
@@ -1,258 +0,0 @@
|
||||
package org.kar.karusic.api;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
|
||||
import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||
import org.kar.archidata.annotation.AsyncType;
|
||||
import org.kar.archidata.annotation.TypeScriptProgress;
|
||||
import org.kar.archidata.dataAccess.DataAccess;
|
||||
import org.kar.archidata.dataAccess.QueryCondition;
|
||||
import org.kar.archidata.dataAccess.addOn.AddOnDataJson;
|
||||
import org.kar.archidata.dataAccess.addOn.AddOnManyToMany;
|
||||
import org.kar.archidata.dataAccess.options.Condition;
|
||||
import org.kar.archidata.model.Data;
|
||||
import org.kar.archidata.tools.DataTools;
|
||||
import org.kar.karusic.model.Album;
|
||||
import org.kar.karusic.model.Artist;
|
||||
import org.kar.karusic.model.Gender;
|
||||
import org.kar.karusic.model.Track;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.ws.rs.Consumes;
|
||||
import jakarta.ws.rs.DELETE;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.PATCH;
|
||||
import jakarta.ws.rs.POST;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.PathParam;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
|
||||
@Path("/track")
|
||||
@Produces({ MediaType.APPLICATION_JSON })
|
||||
public class TrackResource {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(TrackResource.class);
|
||||
|
||||
@GET
|
||||
@Path("{id}")
|
||||
@RolesAllowed("USER")
|
||||
public static Track get(@PathParam("id") final Long id) throws Exception {
|
||||
return DataAccess.get(Track.class, id);
|
||||
}
|
||||
|
||||
@GET
|
||||
@RolesAllowed("USER")
|
||||
public List<Track> gets() throws Exception {
|
||||
return DataAccess.gets(Track.class);
|
||||
}
|
||||
|
||||
@POST
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Track post(@AsyncType(Track.class) final String jsonRequest) throws Exception {
|
||||
return DataAccess.insertWithJson(Track.class, jsonRequest);
|
||||
}
|
||||
|
||||
@PATCH
|
||||
@Path("{id}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public Track patch(@PathParam("id") final Long id, @AsyncType(Track.class) final String jsonRequest) throws Exception {
|
||||
DataAccess.updateWithJson(Track.class, id, jsonRequest);
|
||||
return DataAccess.get(Track.class, id);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public void remove(@PathParam("id") final Long id) throws Exception {
|
||||
DataAccess.delete(Track.class, id);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("{id}/artist/{artistId}")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes({ MediaType.MULTIPART_FORM_DATA })
|
||||
public Track addTrack(@PathParam("id") final Long id, @PathParam("artistId") final Long artistId) throws Exception {
|
||||
AddOnManyToMany.removeLink(Track.class, id, "artist", artistId);
|
||||
return DataAccess.get(Track.class, id);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}/artist/{trackId}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public Track removeTrack(@PathParam("id") final Long id, @PathParam("artistId") final Long artistId) throws Exception {
|
||||
AddOnManyToMany.removeLink(Track.class, id, "artist", artistId);
|
||||
return DataAccess.get(Track.class, id);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("{id}/cover")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes({ MediaType.MULTIPART_FORM_DATA })
|
||||
@AsyncType(Track.class)
|
||||
@TypeScriptProgress
|
||||
public Response uploadCover(@PathParam("id") final Long id, @FormDataParam("fileName") final String fileName, @FormDataParam("file") final InputStream fileInputStream,
|
||||
@FormDataParam("file") final FormDataContentDisposition fileMetaData) {
|
||||
return DataTools.uploadCover(Track.class, id, fileName, fileInputStream, fileMetaData);
|
||||
}
|
||||
|
||||
@DELETE
|
||||
@Path("{id}/cover/{coverId}")
|
||||
@RolesAllowed("ADMIN")
|
||||
public Track removeCover(@PathParam("id") final Long id, @PathParam("coverId") final UUID coverId) throws Exception {
|
||||
AddOnDataJson.removeLink(Track.class, id, "covers", coverId);
|
||||
return DataAccess.get(Track.class, id);
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("upload/")
|
||||
@RolesAllowed("ADMIN")
|
||||
@Consumes({ MediaType.MULTIPART_FORM_DATA })
|
||||
// Formatter:off
|
||||
@AsyncType(Track.class)
|
||||
@TypeScriptProgress
|
||||
public Response uploadTrack(
|
||||
@FormDataParam("fileName") String fileName, //
|
||||
@FormDataParam("gender") String gender, //
|
||||
@FormDataParam("artist") String artist, //
|
||||
//@FormDataParam("seriesId") String seriesId, Not used ...
|
||||
@FormDataParam("album") String album, //
|
||||
@AsyncType(Long.class) @FormDataParam("trackId") String trackId, //
|
||||
@FormDataParam("title") String title, //
|
||||
@FormDataParam("file") final InputStream fileInputStream, //
|
||||
@FormDataParam("file") final FormDataContentDisposition fileMetaData //
|
||||
) {
|
||||
// Formatter:on
|
||||
try {
|
||||
// correct input string stream :
|
||||
fileName = DataTools.multipartCorrection(fileName);
|
||||
gender = DataTools.multipartCorrection(gender);
|
||||
artist = DataTools.multipartCorrection(artist);
|
||||
album = DataTools.multipartCorrection(album);
|
||||
trackId = DataTools.multipartCorrection(trackId);
|
||||
title = DataTools.multipartCorrection(title);
|
||||
|
||||
//public NodeSmall uploadFile(final FormDataMultiPart form) {
|
||||
LOGGER.info("Upload media file: " + fileMetaData);
|
||||
LOGGER.info(" > fileName: " + fileName);
|
||||
LOGGER.info(" > gender: " + gender);
|
||||
LOGGER.info(" > artist: " + artist);
|
||||
LOGGER.info(" > album: " + album);
|
||||
LOGGER.info(" > trackId: " + trackId);
|
||||
LOGGER.info(" > title: " + title);
|
||||
LOGGER.info(" > fileInputStream: " + fileInputStream);
|
||||
LOGGER.info(" > fileMetaData: " + fileMetaData);
|
||||
/*
|
||||
if (typeId == null) {
|
||||
return Response.status(406).
|
||||
entity("Missong Input 'type'").
|
||||
type("text/plain").
|
||||
build();
|
||||
}
|
||||
*/
|
||||
|
||||
final long tmpUID = DataTools.getTmpDataId();
|
||||
final String sha512 = DataTools.saveTemporaryFile(fileInputStream, tmpUID);
|
||||
Data data = DataTools.getWithSha512(sha512);
|
||||
if (data == null) {
|
||||
LOGGER.info("Need to add the data in the BDD ... ");
|
||||
|
||||
try {
|
||||
data = DataTools.createNewData(tmpUID, fileName, sha512);
|
||||
} catch (final IOException ex) {
|
||||
DataTools.removeTemporaryFile(tmpUID);
|
||||
ex.printStackTrace();
|
||||
return Response.notModified("can not create input media").build();
|
||||
} catch (final SQLException ex) {
|
||||
ex.printStackTrace();
|
||||
DataTools.removeTemporaryFile(tmpUID);
|
||||
return Response.notModified("Error in SQL insertion ...").build();
|
||||
}
|
||||
} else if (data.deleted) {
|
||||
LOGGER.info("Data already exist but deleted");
|
||||
DataTools.undelete(data.id);
|
||||
data.deleted = false;
|
||||
} else {
|
||||
LOGGER.info("Data already exist ... all good");
|
||||
}
|
||||
// Fist step: retrieve all the Id of each parents:...
|
||||
LOGGER.info("Find typeNode");
|
||||
Gender genderElem = null;
|
||||
if (gender != null) {
|
||||
genderElem = DataAccess.getWhere(Gender.class, new Condition(new QueryCondition("name", "=", gender)));
|
||||
if (genderElem == null) {
|
||||
genderElem = new Gender();
|
||||
genderElem.name = gender;
|
||||
genderElem = DataAccess.insert(genderElem);
|
||||
}
|
||||
}
|
||||
// NodeSmall typeNode = TypeResource.getWithId(Long.parseLong(typeId));
|
||||
// if (typeNode == null) {
|
||||
// DataTools.removeTemporaryFile(tmpUID);
|
||||
// return Response.notModified("TypeId does not exist ...").build();
|
||||
// }
|
||||
LOGGER.info(" ==> genderElem={}", genderElem);
|
||||
|
||||
Artist artistElem = null;
|
||||
if (artist != null) {
|
||||
LOGGER.info(" Try to find Artist: '{}'", artist);
|
||||
artistElem = DataAccess.getWhere(Artist.class, new Condition(new QueryCondition("name", "=", artist)));
|
||||
if (artistElem == null) {
|
||||
LOGGER.info(" ** Create a new one...");
|
||||
artistElem = new Artist();
|
||||
artistElem.name = artist;
|
||||
artistElem = DataAccess.insert(artistElem);
|
||||
}
|
||||
}
|
||||
LOGGER.info(" ==> artistElem={}", artistElem);
|
||||
|
||||
Album albumElem = null;
|
||||
if (album != null) {
|
||||
albumElem = DataAccess.getWhere(Album.class, new Condition(new QueryCondition("name", "=", album)));
|
||||
if (albumElem == null) {
|
||||
albumElem = new Album();
|
||||
albumElem.name = album;
|
||||
albumElem = DataAccess.insert(albumElem);
|
||||
}
|
||||
}
|
||||
LOGGER.info(" ==> " + album);
|
||||
|
||||
LOGGER.info("add media");
|
||||
|
||||
Track trackElem = new Track();
|
||||
trackElem.name = title;
|
||||
trackElem.track = trackId != null ? Long.parseLong(trackId) : null;
|
||||
trackElem.albumId = albumElem != null ? albumElem.id : null;
|
||||
trackElem.genderId = genderElem != null ? genderElem.id : null;
|
||||
trackElem.dataId = data.id;
|
||||
// Now list of artist has an internal management:
|
||||
if (artistElem != null) {
|
||||
trackElem.artists = new ArrayList<>();
|
||||
trackElem.artists.add(artistElem.id);
|
||||
}
|
||||
trackElem = DataAccess.insert(trackElem);
|
||||
/*
|
||||
Old mode of artist insertion (removed due to the slowlest request of getting value
|
||||
if (artistElem != null) {
|
||||
DataAccess.addLink(Track.class, trackElem.id, "artist", artistElem.id);
|
||||
}
|
||||
*/
|
||||
return Response.ok(trackElem).build();
|
||||
} catch (final Exception ex) {
|
||||
LOGGER.info("Catch an unexpected error ... {}", ex.getMessage());
|
||||
ex.printStackTrace();
|
||||
return Response.status(417).entity("Back-end error : " + ex.getMessage()).type("text/plain").build();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -1,60 +0,0 @@
|
||||
package org.kar.karusic.internal;
|
||||
|
||||
//import io.scenarium.logger.LogLevel;
|
||||
//import io.scenarium.logger.Logger;
|
||||
|
||||
public class Log {
|
||||
// private static final String LIB_NAME = "logger";
|
||||
// private static final String LIB_NAME_DRAW = Logger.getDrawableName(LIB_NAME);
|
||||
// private static final boolean PRINT_CRITICAL = Logger.getNeedPrint(LIB_NAME, LogLevel.CRITICAL);
|
||||
// private static final boolean PRINT_ERROR = Logger.getNeedPrint(LIB_NAME, LogLevel.ERROR);
|
||||
// private static final boolean PRINT_WARNING = Logger.getNeedPrint(LIB_NAME, LogLevel.WARNING);
|
||||
// private static final boolean PRINT_INFO = Logger.getNeedPrint(LIB_NAME, LogLevel.INFO);
|
||||
// private static final boolean PRINT_DEBUG = Logger.getNeedPrint(LIB_NAME, LogLevel.DEBUG);
|
||||
// private static final boolean PRINT_VERBOSE = Logger.getNeedPrint(LIB_NAME, LogLevel.VERBOSE);
|
||||
// private static final boolean PRINT_TODO = Logger.getNeedPrint(LIB_NAME, LogLevel.TODO);
|
||||
// private static final boolean PRINT_PRINT = Logger.getNeedPrint(LIB_NAME, LogLevel.PRINT);
|
||||
//
|
||||
// private Log() {}
|
||||
//
|
||||
// public static void print(String data) {
|
||||
// if (PRINT_PRINT)
|
||||
// Logger.print(LIB_NAME_DRAW, data);
|
||||
// }
|
||||
//
|
||||
// public static void todo(String data) {
|
||||
// if (PRINT_TODO)
|
||||
// Logger.todo(LIB_NAME_DRAW, data);
|
||||
// }
|
||||
//
|
||||
// public static void critical(String data) {
|
||||
// if (PRINT_CRITICAL)
|
||||
// Logger.critical(LIB_NAME_DRAW, data);
|
||||
// }
|
||||
//
|
||||
// public static void error(String data) {
|
||||
// if (PRINT_ERROR)
|
||||
// Logger.error(LIB_NAME_DRAW, data);
|
||||
// }
|
||||
//
|
||||
// public static void warning(String data) {
|
||||
// if (PRINT_WARNING)
|
||||
// Logger.warning(LIB_NAME_DRAW, data);
|
||||
// }
|
||||
//
|
||||
// public static void info(String data) {
|
||||
// if (PRINT_INFO)
|
||||
// Logger.info(LIB_NAME_DRAW, data);
|
||||
// }
|
||||
//
|
||||
// public static void debug(String data) {
|
||||
// if (PRINT_DEBUG)
|
||||
// Logger.debug(LIB_NAME_DRAW, data);
|
||||
// }
|
||||
//
|
||||
// public static void verbose(String data) {
|
||||
// if (PRINT_VERBOSE)
|
||||
// Logger.verbose(LIB_NAME_DRAW, data);
|
||||
// }
|
||||
|
||||
}
|
@@ -1,84 +0,0 @@
|
||||
package org.kar.karusic.migration;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.kar.archidata.migration.MigrationSqlStep;
|
||||
import org.kar.archidata.model.Data;
|
||||
import org.kar.archidata.model.User;
|
||||
import org.kar.karusic.model.Album;
|
||||
import org.kar.karusic.model.Artist;
|
||||
import org.kar.karusic.model.Gender;
|
||||
import org.kar.karusic.model.Playlist;
|
||||
import org.kar.karusic.model.Track;
|
||||
|
||||
public class Initialization extends MigrationSqlStep {
|
||||
|
||||
public static final int KARSO_INITIALISATION_ID = 1;
|
||||
public static final List<Class<?>> CLASSES_BASE = List.of(Album.class,Artist.class,Data.class,Gender.class,Playlist.class,Track.class,User.class);
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Initialization";
|
||||
}
|
||||
|
||||
public Initialization() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateStep() throws Exception {
|
||||
for (final Class<?> elem : CLASSES_BASE) {
|
||||
addClass(elem);
|
||||
}
|
||||
|
||||
addAction("""
|
||||
INSERT INTO `gender` (`id`, `name`, `description`) VALUES
|
||||
(1, 'Variété française', NULL),
|
||||
(2, 'Pop', NULL),
|
||||
(3, 'inconnue', NULL),
|
||||
(4, 'Disco', NULL),
|
||||
(5, 'Enfants', NULL),
|
||||
(6, 'Portugaise', NULL),
|
||||
(7, 'Apprentissage', NULL),
|
||||
(8, 'Blues', NULL),
|
||||
(9, 'Jazz', NULL),
|
||||
(10, 'Chanson Noël', NULL),
|
||||
(11, 'DubStep', NULL),
|
||||
(12, 'Rap français', NULL),
|
||||
(13, 'Classique', NULL),
|
||||
(14, 'Rock', NULL),
|
||||
(15, 'Electro', NULL),
|
||||
(16, 'Celtique', NULL),
|
||||
(17, 'Country', NULL),
|
||||
(18, 'Variété Québéquoise', NULL),
|
||||
(19, 'Médiéval', NULL),
|
||||
(20, 'Variété Italienne', NULL),
|
||||
(21, 'Comédie Musicale', NULL),
|
||||
(22, 'Vianney', NULL),
|
||||
(23, 'Bande Original', NULL),
|
||||
(24, 'Bande Originale', NULL),
|
||||
(25, 'Variété Belge', NULL),
|
||||
(26, 'Gospel', NULL);
|
||||
""");
|
||||
// set start increment element to permit to add after default elements
|
||||
addAction("""
|
||||
ALTER TABLE `album` AUTO_INCREMENT = 1000;
|
||||
""", "mysql");
|
||||
addAction("""
|
||||
ALTER TABLE `artist` AUTO_INCREMENT = 1000;
|
||||
""", "mysql");
|
||||
addAction("""
|
||||
ALTER TABLE `gender` AUTO_INCREMENT = 1000;
|
||||
""", "mysql");
|
||||
addAction("""
|
||||
ALTER TABLE `playlist` AUTO_INCREMENT = 1000;
|
||||
""", "mysql");
|
||||
addAction("""
|
||||
ALTER TABLE `track` AUTO_INCREMENT = 1000;
|
||||
""", "mysql");
|
||||
addAction("""
|
||||
ALTER TABLE `user` AUTO_INCREMENT = 1000;
|
||||
""", "mysql");
|
||||
}
|
||||
|
||||
}
|
@@ -1,169 +0,0 @@
|
||||
package org.kar.karusic.migration;
|
||||
|
||||
import org.kar.archidata.migration.MigrationSqlStep;
|
||||
|
||||
public class Migration20231126 extends MigrationSqlStep {
|
||||
|
||||
public static final int KARSO_INITIALISATION_ID = 1;
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "migration-2023-11-26: reorder the migration for the new API of archidata";
|
||||
}
|
||||
|
||||
public Migration20231126() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateStep() throws Exception {
|
||||
// update migration update (last one)
|
||||
addAction("""
|
||||
ALTER TABLE `KAR_migration`
|
||||
CHANGE `id` `id` bigint NOT NULL COMMENT 'Primary key of the base' AUTO_INCREMENT FIRST,
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'Create time of the object' AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'When update the object' AFTER `createdAt`,
|
||||
CHANGE `deleted` `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'When delete, they are not removed, they are just set in a deleted state' AFTER `updatedAt`,
|
||||
ADD `version` int NOT NULL DEFAULT '2' AFTER `deleted`,
|
||||
CHANGE `name` `name` varchar(256) COLLATE 'utf8mb4_0900_ai_ci' NULL COMMENT 'Name of the migration' AFTER `version`,
|
||||
CHANGE `terminated` `terminated` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'if the migration is well terminated or not' AFTER `name`,
|
||||
CHANGE `stepId` `stepId` int NULL COMMENT 'index in the migration progression' AFTER `terminated`,
|
||||
CHANGE `count` `count` int NULL COMMENT 'number of element in the migration' AFTER `stepId`,
|
||||
CHANGE `log` `log` text COLLATE 'utf8mb3_general_ci' NULL COMMENT 'Log generate by the migration' AFTER `count`;
|
||||
""");
|
||||
|
||||
addAction("""
|
||||
ALTER TABLE `album`
|
||||
CHANGE `id` `id` bigint NOT NULL COMMENT 'Primary key of the base' AUTO_INCREMENT FIRST,
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'Create time of the object' AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'When update the object' AFTER `createdAt`,
|
||||
CHANGE `deleted` `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'When delete, they are not removed, they are just set in a deleted state' AFTER `updatedAt`,
|
||||
CHANGE `name` `name` varchar(256) COLLATE 'utf8mb4_0900_ai_ci' NULL AFTER `deleted`,
|
||||
CHANGE `description` `description` text COLLATE 'utf8mb3_general_ci' NULL AFTER `name`,
|
||||
CHANGE `publication` `publication` date NULL AFTER `description`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `album_link_cover`
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `createdAt`,
|
||||
CHANGE `deleted` `deleted` tinyint(1) NOT NULL DEFAULT '0' AFTER `updatedAt`,
|
||||
CHANGE `album_id` `object1id` bigint NOT NULL AFTER `deleted`,
|
||||
CHANGE `cover_id` `object2id` bigint NOT NULL AFTER `object1id`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `artist`
|
||||
CHANGE `id` `id` bigint NOT NULL COMMENT 'Primary key of the base' AUTO_INCREMENT FIRST,
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'Create time of the object' AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'When update the object' AFTER `createdAt`,
|
||||
CHANGE `deleted` `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'When delete, they are not removed, they are just set in a deleted state' AFTER `updatedAt`,
|
||||
CHANGE `firstName` `firstName` varchar(256) COLLATE 'utf8mb4_0900_ai_ci' NULL AFTER `description`,
|
||||
CHANGE `surname` `surname` varchar(256) COLLATE 'utf8mb4_0900_ai_ci' NULL AFTER `firstName`,
|
||||
CHANGE `birth` `birth` date NULL AFTER `surname`,
|
||||
CHANGE `death` `death` date NULL AFTER `birth`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `artist_link_cover`
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `createdAt`,
|
||||
CHANGE `deleted` `deleted` tinyint(1) NOT NULL DEFAULT '0' AFTER `updatedAt`,
|
||||
CHANGE `artist_id` `object1id` bigint NOT NULL AFTER `deleted`,
|
||||
CHANGE `cover_id` `object2id` bigint NOT NULL AFTER `object1id`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `data`
|
||||
CHANGE `id` `id` bigint NOT NULL COMMENT 'Primary key of the base' AUTO_INCREMENT FIRST,
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'Create time of the object' AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'When update the object' AFTER `createdAt`,
|
||||
CHANGE `deleted` `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'When delete, they are not removed, they are just set in a deleted state' AFTER `updatedAt`,
|
||||
CHANGE `sha512` `sha512` varchar(128) COLLATE 'utf8mb4_0900_ai_ci' NOT NULL COMMENT 'Sha512 of the data' AFTER `deleted`,
|
||||
CHANGE `mimeType` `mimeType` varchar(128) COLLATE 'utf8mb4_0900_ai_ci' NOT NULL COMMENT 'Mime -type of the media' AFTER `sha512`,
|
||||
CHANGE `size` `size` bigint NOT NULL COMMENT 'Size in Byte of the data' AFTER `mimeType`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `gender`
|
||||
CHANGE `id` `id` bigint NOT NULL COMMENT 'Primary key of the base' AUTO_INCREMENT FIRST,
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'Create time of the object' AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'When update the object' AFTER `createdAt`,
|
||||
CHANGE `name` `name` varchar(256) COLLATE 'utf8mb4_0900_ai_ci' NULL AFTER `deleted`,
|
||||
CHANGE `description` `description` text COLLATE 'utf8mb3_general_ci' NULL AFTER `name`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `gender_link_cover`
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `createdAt`,
|
||||
CHANGE `deleted` `deleted` tinyint(1) NOT NULL DEFAULT '0' AFTER `updatedAt`,
|
||||
CHANGE `gender_id` `object1id` bigint NOT NULL AFTER `deleted`,
|
||||
CHANGE `cover_id` `object2id` bigint NOT NULL AFTER `object1id`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `playlist`
|
||||
CHANGE `id` `id` bigint NOT NULL COMMENT 'Primary key of the base' AUTO_INCREMENT FIRST,
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'Create time of the object' AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'When update the object' AFTER `createdAt`,
|
||||
CHANGE `name` `name` varchar(256) COLLATE 'utf8mb4_0900_ai_ci' NULL AFTER `deleted`,
|
||||
CHANGE `description` `description` text COLLATE 'utf8mb3_general_ci' NULL AFTER `name`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `playlist_link_cover`
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `createdAt`,
|
||||
CHANGE `deleted` `deleted` tinyint(1) NOT NULL DEFAULT '0' AFTER `updatedAt`,
|
||||
CHANGE `playlist_id` `object1id` bigint NOT NULL AFTER `deleted`,
|
||||
CHANGE `cover_id` `object2id` bigint NOT NULL AFTER `object1id`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `playlist_link_track`
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `createdAt`,
|
||||
CHANGE `deleted` `deleted` tinyint(1) NOT NULL DEFAULT '0' AFTER `updatedAt`,
|
||||
CHANGE `playlist_id` `object1id` bigint NOT NULL AFTER `deleted`,
|
||||
CHANGE `track_id` `object2id` bigint NOT NULL AFTER `object1id`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `track`
|
||||
CHANGE `id` `id` bigint NOT NULL COMMENT 'Primary key of the base' AUTO_INCREMENT FIRST,
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'Create time of the object' AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'When update the object' AFTER `createdAt`,
|
||||
CHANGE `deleted` `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'When delete, they are not removed, they are just set in a deleted state' AFTER `updatedAt`,
|
||||
CHANGE `name` `name` varchar(256) COLLATE 'utf8mb4_0900_ai_ci' NULL AFTER `deleted`,
|
||||
CHANGE `description` `description` text COLLATE 'utf8mb3_general_ci' NULL AFTER `name`,
|
||||
CHANGE `genderId` `genderId` bigint NULL AFTER `description`,
|
||||
CHANGE `albumId` `albumId` bigint NULL AFTER `genderId`,
|
||||
CHANGE `track` `track` bigint NULL AFTER `albumId`,
|
||||
CHANGE `dataId` `dataId` bigint NULL AFTER `track`,
|
||||
CHANGE `artists` `artists` text COLLATE 'utf8mb4_0900_ai_ci' NULL AFTER `dataId`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `track_link_cover`
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) AFTER `createdAt`,
|
||||
CHANGE `deleted` `deleted` tinyint(1) NOT NULL DEFAULT '0' AFTER `updatedAt`,
|
||||
CHANGE `track_id` `object1id` bigint NOT NULL AFTER `deleted`,
|
||||
CHANGE `cover_id` `object2id` bigint NOT NULL AFTER `object1id`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `user`
|
||||
CHANGE `id` `id` bigint NOT NULL COMMENT 'Primary key of the base' AUTO_INCREMENT FIRST,
|
||||
CHANGE `create_date` `createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'Create time of the object' AFTER `id`,
|
||||
CHANGE `modify_date` `updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'When update the object' AFTER `createdAt`,
|
||||
CHANGE `deleted` `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'When delete, they are not removed, they are just set in a deleted state' AFTER `updatedAt`,
|
||||
CHANGE `login` `login` varchar(128) COLLATE 'utf8mb4_0900_ai_ci' NULL AFTER `deleted`,
|
||||
CHANGE `lastConnection` `lastConnection` timestamp(3) NULL AFTER `login`,
|
||||
CHANGE `admin` `admin` tinyint(1) NOT NULL DEFAULT '0' AFTER `lastConnection`,
|
||||
CHANGE `blocked` `blocked` tinyint(1) NOT NULL DEFAULT '0' AFTER `admin`,
|
||||
CHANGE `removed` `removed` tinyint(1) NOT NULL DEFAULT '0' AFTER `blocked`;
|
||||
""");
|
||||
addAction("""
|
||||
CREATE TABLE `user_link_cover` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'Primary key of the base' ,
|
||||
`createdAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'Create time of the object' ,
|
||||
`updatedAt` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT 'When update the object' ,
|
||||
`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'When delete, they are not removed, they are just set in a deleted state' ,
|
||||
`object1Id` bigint NOT NULL COMMENT 'Object reference 1' ,
|
||||
`object2Id` bigint NOT NULL COMMENT 'Object reference 2' ,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
||||
""");
|
||||
}
|
||||
|
||||
}
|
@@ -1,26 +0,0 @@
|
||||
package org.kar.karusic.migration;
|
||||
|
||||
import org.kar.archidata.migration.MigrationSqlStep;
|
||||
|
||||
public class Migration20240225 extends MigrationSqlStep {
|
||||
|
||||
public static final int KARSO_INITIALISATION_ID = 1;
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "migration-2024-02-25: change model of thrack to use real json";
|
||||
}
|
||||
|
||||
public Migration20240225() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateStep() throws Exception {
|
||||
// update migration update (last one)
|
||||
addAction("""
|
||||
UPDATE `track` SET artists = CONCAT('[', artists, ']') WHERE artists IS NOT NULL
|
||||
""");
|
||||
}
|
||||
|
||||
}
|
@@ -1,135 +0,0 @@
|
||||
package org.kar.karusic.migration;
|
||||
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.kar.archidata.api.DataResource;
|
||||
import org.kar.archidata.dataAccess.DataAccess;
|
||||
import org.kar.archidata.dataAccess.addOn.model.LinkTable;
|
||||
import org.kar.archidata.dataAccess.options.AccessDeletedItems;
|
||||
import org.kar.archidata.dataAccess.options.OverrideTableName;
|
||||
import org.kar.archidata.migration.MigrationSqlStep;
|
||||
import org.kar.archidata.tools.UuidUtils;
|
||||
import org.kar.karusic.migration.model.CoverConversion;
|
||||
import org.kar.karusic.migration.model.MediaConversion;
|
||||
import org.kar.karusic.migration.model.UUIDConversion;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class Migration20240226 extends MigrationSqlStep {
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(Migration20240226.class);
|
||||
|
||||
public static final int KARSO_INITIALISATION_ID = 1;
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "migration-2024-02-26: convert base with UUID";
|
||||
}
|
||||
|
||||
public Migration20240226() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateStep() throws Exception {
|
||||
addAction("""
|
||||
ALTER TABLE `data` ADD `uuid` binary(16) AFTER `id`;
|
||||
""");
|
||||
addAction(() -> {
|
||||
final List<UUIDConversion> datas = DataAccess.gets(UUIDConversion.class, new AccessDeletedItems(), new OverrideTableName("data"));
|
||||
for (final UUIDConversion elem: datas) {
|
||||
elem.uuid = UuidUtils.nextUUID();
|
||||
}
|
||||
for (final UUIDConversion elem: datas) {
|
||||
DataAccess.update(elem, elem.id, List.of("uuid"), new OverrideTableName("data"));
|
||||
}
|
||||
});
|
||||
addAction("""
|
||||
ALTER TABLE `data` CHANGE `uuid` `uuid` binary(16) DEFAULT (UUID_TO_BIN(UUID(), TRUE));
|
||||
""");
|
||||
final List<String> tableToTransform = List.of("album", "artist", "gender", "playlist", "track", "user");
|
||||
for (final String tableName : tableToTransform ) {
|
||||
addAction("ALTER TABLE `" + tableName + "` ADD `covers` text NULL;");
|
||||
addAction(() -> {
|
||||
final List<UUIDConversion> datas = DataAccess.gets(UUIDConversion.class, new AccessDeletedItems(), new OverrideTableName("data"));
|
||||
final List<CoverConversion> medias = DataAccess.gets(CoverConversion.class, new AccessDeletedItems(), new OverrideTableName(tableName));
|
||||
final List<LinkTable> links = DataAccess.gets(LinkTable.class, new OverrideTableName(tableName + "_link_cover"));
|
||||
LOGGER.info("Get somes data: {} {} {}", datas.size(), medias.size(), links.size());
|
||||
for (final CoverConversion media: medias) {
|
||||
final List<UUID> values = new ArrayList<>();
|
||||
for (final LinkTable link: links) {
|
||||
if (link.object1Id.equals(media.id)) {
|
||||
for (final UUIDConversion data: datas) {
|
||||
if (data.id.equals(link.object2Id)) {
|
||||
values.add(data.uuid);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (values.size() != 0) {
|
||||
media.covers = values;
|
||||
LOGGER.info(" update: {} => {}", media.id, media.covers);
|
||||
DataAccess.update(media, media.id, List.of("covers"), new OverrideTableName(tableName));
|
||||
}
|
||||
}
|
||||
});
|
||||
addAction("DROP TABLE `" + tableName + "_link_cover`;");
|
||||
}
|
||||
addAction("""
|
||||
ALTER TABLE `track` ADD `dataUUID` binary(16) AFTER dataId;
|
||||
""");
|
||||
addAction(() -> {
|
||||
final List<UUIDConversion> datas = DataAccess.gets(UUIDConversion.class, new AccessDeletedItems(), new OverrideTableName("data"));
|
||||
final List<MediaConversion> medias = DataAccess.gets(MediaConversion.class, new AccessDeletedItems(), new OverrideTableName("track"));
|
||||
for (final MediaConversion media: medias) {
|
||||
for (final UUIDConversion data: datas) {
|
||||
if (data.id.equals(media.dataId)) {
|
||||
media.dataUUID = data.uuid;
|
||||
DataAccess.update(media, media.id, List.of("dataUUID"), new OverrideTableName("track"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
addAction("""
|
||||
DROP TABLE `playlist`;
|
||||
""");
|
||||
addAction("""
|
||||
DROP TABLE `playlist_link_track`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `track` DROP `dataId`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `track` CHANGE `dataUUID` `dataId` binary(16) NOT NULL;
|
||||
""");
|
||||
// Move the files...
|
||||
addAction(() -> {
|
||||
final List<UUIDConversion> datas = DataAccess.gets(UUIDConversion.class, new AccessDeletedItems(), new OverrideTableName("data"));
|
||||
for (final UUIDConversion data: datas) {
|
||||
final String origin = DataResource.getFileDataOld(data.id);
|
||||
final String destination = DataResource.getFileData(data.uuid);
|
||||
LOGGER.info("move file = {}", origin);
|
||||
LOGGER.info(" ==> {}", destination);
|
||||
Files.move(Paths.get(origin), Paths.get(destination), StandardCopyOption.ATOMIC_MOVE);
|
||||
}
|
||||
});
|
||||
addAction("""
|
||||
ALTER TABLE `data` DROP `id`;
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `data` CHANGE `uuid` `id` binary(16) DEFAULT (UUID_TO_BIN(UUID(), TRUE));
|
||||
""");
|
||||
addAction("""
|
||||
ALTER TABLE `data` ADD PRIMARY KEY `id` (`id`);
|
||||
""");
|
||||
}
|
||||
|
||||
}
|
@@ -1,12 +0,0 @@
|
||||
package org.kar.karusic.migration.model;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import jakarta.persistence.Id;
|
||||
|
||||
public class MediaConversion {
|
||||
@Id
|
||||
public Long id = null;
|
||||
public Long dataId = null;
|
||||
public UUID dataUUID = null;
|
||||
}
|
@@ -1,11 +0,0 @@
|
||||
package org.kar.karusic.migration.model;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import jakarta.persistence.Id;
|
||||
|
||||
public class UUIDConversion {
|
||||
@Id
|
||||
public Long id = null;
|
||||
public UUID uuid = null;
|
||||
}
|
@@ -1,16 +0,0 @@
|
||||
package org.kar.karusic.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.kar.archidata.annotation.DataIfNotExists;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
import jakarta.persistence.Table;
|
||||
|
||||
@Table(name = "album")
|
||||
@DataIfNotExists
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class Album extends NodeSmall {
|
||||
public LocalDate publication = null;
|
||||
}
|
@@ -1,28 +0,0 @@
|
||||
package org.kar.karusic.model;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
import org.kar.archidata.annotation.DataIfNotExists;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
import jakarta.persistence.Column;
|
||||
import jakarta.persistence.Table;
|
||||
|
||||
@Table(name = "artist")
|
||||
@DataIfNotExists
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class Artist extends NodeSmall {
|
||||
@Column(length = 256)
|
||||
public String firstName = null;
|
||||
@Column(length = 256)
|
||||
public String surname = null;
|
||||
public LocalDate birth = null;
|
||||
public LocalDate death = null;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Artist [id=" + this.id + ", name=" + this.name + ", description=" + this.description + ", covers=" + this.covers + ", firstName=" + this.firstName + ", surname=" + this.surname
|
||||
+ ", birth=" + this.birth + ", death=" + this.death + "]";
|
||||
}
|
||||
}
|
@@ -1,26 +0,0 @@
|
||||
package org.kar.karusic.model;
|
||||
/*
|
||||
CREATE TABLE `node` (
|
||||
`id` bigint NOT NULL COMMENT 'table ID' AUTO_INCREMENT PRIMARY KEY,
|
||||
`deleted` BOOLEAN NOT NULL DEFAULT false,
|
||||
`create_date` datetime NOT NULL DEFAULT now() COMMENT 'Time the element has been created',
|
||||
`modify_date` datetime NOT NULL DEFAULT now() COMMENT 'Time the element has been update',
|
||||
`type` enum("TYPE", "UNIVERS", "SERIE", "SAISON", "MEDIA") NOT NULL DEFAULT 'TYPE',
|
||||
`name` TEXT COLLATE 'utf8_general_ci' NOT NULL,
|
||||
`description` TEXT COLLATE 'utf8_general_ci',
|
||||
`parent_id` bigint
|
||||
) AUTO_INCREMENT=10;
|
||||
*/
|
||||
|
||||
import org.kar.archidata.annotation.DataIfNotExists;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
import jakarta.persistence.Table;
|
||||
|
||||
@Table(name = "gender")
|
||||
@DataIfNotExists
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class Gender extends NodeSmall {
|
||||
|
||||
}
|
@@ -1,36 +0,0 @@
|
||||
package org.kar.karusic.model;
|
||||
/*
|
||||
CREATE TABLE `node` (
|
||||
`id` bigint NOT NULL COMMENT 'table ID' AUTO_INCREMENT PRIMARY KEY,
|
||||
`deleted` BOOLEAN NOT NULL DEFAULT false,
|
||||
`create_date` datetime NOT NULL DEFAULT now() COMMENT 'Time the element has been created',
|
||||
`modify_date` datetime NOT NULL DEFAULT now() COMMENT 'Time the element has been update',
|
||||
`type` enum("TYPE", "UNIVERS", "SERIE", "SAISON", "MEDIA") NOT NULL DEFAULT 'TYPE',
|
||||
`name` TEXT COLLATE 'utf8_general_ci' NOT NULL,
|
||||
`description` TEXT COLLATE 'utf8_general_ci',
|
||||
`parent_id` bigint
|
||||
) AUTO_INCREMENT=10;
|
||||
*/
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import org.kar.archidata.annotation.DataJson;
|
||||
import org.kar.archidata.model.Data;
|
||||
import org.kar.archidata.model.GenericDataSoftDelete;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.persistence.Column;
|
||||
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class NodeSmall extends GenericDataSoftDelete {
|
||||
@Column(length = 256)
|
||||
public String name = null;
|
||||
@Column(length = 0)
|
||||
public String description = null;
|
||||
@Schema(description = "List of Id of the specific covers")
|
||||
@DataJson(targetEntity = Data.class)
|
||||
public List<UUID> covers = null;
|
||||
}
|
@@ -1,31 +0,0 @@
|
||||
package org.kar.karusic.model;
|
||||
/*
|
||||
CREATE TABLE `node` (
|
||||
`id` bigint NOT NULL COMMENT 'table ID' AUTO_INCREMENT PRIMARY KEY,
|
||||
`deleted` BOOLEAN NOT NULL DEFAULT false,
|
||||
`create_date` datetime NOT NULL DEFAULT now() COMMENT 'Time the element has been created',
|
||||
`modify_date` datetime NOT NULL DEFAULT now() COMMENT 'Time the element has been update',
|
||||
`type` enum("TYPE", "UNIVERS", "SERIE", "SAISON", "MEDIA") NOT NULL DEFAULT 'TYPE',
|
||||
`name` TEXT COLLATE 'utf8_general_ci' NOT NULL,
|
||||
`description` TEXT COLLATE 'utf8_general_ci',
|
||||
`parent_id` bigint
|
||||
) AUTO_INCREMENT=10;
|
||||
*/
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.kar.archidata.annotation.DataIfNotExists;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
|
||||
import jakarta.persistence.FetchType;
|
||||
import jakarta.persistence.ManyToMany;
|
||||
import jakarta.persistence.Table;
|
||||
|
||||
@Table(name = "playlist")
|
||||
@DataIfNotExists
|
||||
@JsonInclude(JsonInclude.Include.NON_NULL)
|
||||
public class Playlist extends NodeSmall {
|
||||
@ManyToMany(fetch = FetchType.LAZY, targetEntity = Track.class)
|
||||
public List<Long> tracks = null;
|
||||
}
|
@@ -1,10 +0,0 @@
|
||||
package org.kar.karusic.model;
|
||||
|
||||
public enum State {
|
||||
// User has remove his account
|
||||
REMOVED,
|
||||
// User has been blocked his account
|
||||
BLOCKED,
|
||||
// generic user
|
||||
USER
|
||||
}
|
@@ -1,15 +0,0 @@
|
||||
package org.kar.karusic.util;
|
||||
|
||||
public class ConfigVariable {
|
||||
public static final String BASE_NAME = "ORG_KARUSIC_";
|
||||
|
||||
|
||||
public static String getFrontFolder() {
|
||||
String out = System.getenv(BASE_NAME + "FRONT_FOLDER");
|
||||
if (out == null) {
|
||||
return "/application/front";
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
}
|
50
back/src/resources/logback.xml
Normal file
50
back/src/resources/logback.xml
Normal file
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
<!-- environment detection (defaut: dev) -->
|
||||
<property name="LOG_LEVEL_ENV" value="${LOG_LEVEL:-dev}" />
|
||||
<!-- Appender for development -->
|
||||
<if condition="property("LOG_LEVEL_ENV").equals("dev")">
|
||||
<then>
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%green(%d{HH:mm:ss.SSS}) %highlight(%-5level) %-30((%file:%line\)): %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
<logger name="org.atriasoft.karusic" level="TRACE" />
|
||||
<logger name="org.atriasoft.archidata" level="DEBUG" />
|
||||
<root level="INFO">
|
||||
<appender-ref ref="CONSOLE" />
|
||||
</root>
|
||||
</then>
|
||||
</if>
|
||||
<!-- Appender for production -->
|
||||
<if condition="property("LOG_LEVEL_ENV").matches("^prod.*")">
|
||||
<then>
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>[%thread] %level %logger - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
<root level="INFO">
|
||||
<appender-ref ref="CONSOLE" />
|
||||
</root>
|
||||
</then>
|
||||
</if>
|
||||
<if condition="property("LOG_LEVEL_ENV").equals("prod-debug")">
|
||||
<then>
|
||||
<logger name="org.atriasoft.karusic" level="DEBUG" />
|
||||
</then>
|
||||
</if>
|
||||
<if condition="property("LOG_LEVEL_ENV").equals("prod-trace")">
|
||||
<then>
|
||||
<logger name="org.atriasoft.karusic" level="TRACE" />
|
||||
<logger name="org.atriasoft.archidata" level="DEBUG" />
|
||||
</then>
|
||||
</if>
|
||||
<if condition="property("LOG_LEVEL_ENV").equals("prod-trace-full")">
|
||||
<then>
|
||||
<logger name="org.atriasoft.karusic" level="TRACE" />
|
||||
<logger name="org.atriasoft.archidata" level="TRACE" />
|
||||
</then>
|
||||
</if>
|
||||
</configuration>
|
@@ -1,35 +0,0 @@
|
||||
# SLF4J's SimpleLogger configuration file
|
||||
# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err.
|
||||
# Default logging detail level for all instances of SimpleLogger.
|
||||
# Must be one of ("trace", "debug", "info", "warn", or "error").
|
||||
# If not specified, defaults to "info".
|
||||
org.slf4j.simpleLogger.defaultLogLevel=trace
|
||||
|
||||
# Logging detail level for a SimpleLogger instance named "xxxxx".
|
||||
# Must be one of ("trace", "debug", "info", "warn", or "error").
|
||||
# If not specified, the default logging detail level is used.
|
||||
#org.slf4j.simpleLogger.log.xxxxx=
|
||||
|
||||
# Set to true if you want the current date and time to be included in output messages.
|
||||
# Default is false, and will output the number of milliseconds elapsed since startup.
|
||||
#org.slf4j.simpleLogger.showDateTime=false
|
||||
|
||||
# The date and time format to be used in the output messages.
|
||||
# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat.
|
||||
# If the format is not specified or is invalid, the default format is used.
|
||||
# The default format is yyyy-MM-dd HH:mm:ss:SSS Z.
|
||||
#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z
|
||||
|
||||
# Set to true if you want to output the current thread name.
|
||||
# Defaults to true.
|
||||
org.slf4j.simpleLogger.showThreadName=true
|
||||
|
||||
# Set to true if you want the Logger instance name to be included in output messages.
|
||||
# Defaults to true.
|
||||
#org.slf4j.simpleLogger.showLogName=true
|
||||
|
||||
# Set to true if you want the last component of the name to be included in output messages.
|
||||
# Defaults to false.
|
||||
#org.slf4j.simpleLogger.showShortLogName=false
|
||||
|
||||
|
BIN
back/test/resources/icon-192x192.png
Normal file
BIN
back/test/resources/icon-192x192.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
11
back/test/src/test/atriasoft/karusic/Common.java
Normal file
11
back/test/src/test/atriasoft/karusic/Common.java
Normal file
@@ -0,0 +1,11 @@
|
||||
package test.atriasoft.karusic;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.atriasoft.archidata.filter.PartRight;
|
||||
import org.atriasoft.archidata.tools.JWTWrapper;
|
||||
|
||||
public class Common {
|
||||
static String USER_TOKEN = JWTWrapper.createJwtTestToken(16512, "test_user_login", "KarAuth", "karusic", Map.of("karusic", Map.of("USER", PartRight.READ)));
|
||||
static String ADMIN_TOKEN = JWTWrapper.createJwtTestToken(16512, "test_admin_login", "KarAuth", "karusic", Map.of("karusic", Map.of("USER", PartRight.READ_WRITE, "ADMIN", PartRight.READ_WRITE)));
|
||||
}
|
61
back/test/src/test/atriasoft/karusic/ConfigureDb.java
Normal file
61
back/test/src/test/atriasoft/karusic/ConfigureDb.java
Normal file
@@ -0,0 +1,61 @@
|
||||
package test.atriasoft.karusic;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.atriasoft.archidata.dataAccess.DBAccess;
|
||||
import org.atriasoft.archidata.db.DbConfig;
|
||||
import org.atriasoft.archidata.db.DbIoFactory;
|
||||
import org.atriasoft.archidata.exception.DataAccessException;
|
||||
import org.atriasoft.archidata.tools.ConfigBaseVariable;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import jakarta.ws.rs.InternalServerErrorException;
|
||||
|
||||
public class ConfigureDb {
|
||||
final static private Logger LOGGER = LoggerFactory.getLogger(ConfigureDb.class);
|
||||
final static private String modeTestForced = null;// "MONGO";
|
||||
public static DBAccess da = null;
|
||||
|
||||
public static void configure() throws IOException, InternalServerErrorException, DataAccessException {
|
||||
ConfigBaseVariable.testMode = "true";
|
||||
ConfigBaseVariable.dbType = "mongo";
|
||||
ConfigBaseVariable.bdDatabase = "test_karusic_db";
|
||||
removeDB();
|
||||
// Connect the dataBase...
|
||||
da = DBAccess.createInterface();
|
||||
}
|
||||
|
||||
public static void removeDB() {
|
||||
DbConfig config = null;
|
||||
try {
|
||||
config = new DbConfig();
|
||||
} catch (final DataAccessException e) {
|
||||
e.printStackTrace();
|
||||
LOGGER.error("Fail to clean the DB");
|
||||
return;
|
||||
}
|
||||
LOGGER.info("Remove the DB and create a new one '{}'", config.getDbName());
|
||||
try (final DBAccess daRoot = DBAccess.createInterface(config)) {
|
||||
daRoot.deleteDB(ConfigBaseVariable.bdDatabase);
|
||||
daRoot.createDB(ConfigBaseVariable.bdDatabase);
|
||||
} catch (final InternalServerErrorException e) {
|
||||
e.printStackTrace();
|
||||
LOGGER.error("Fail to clean the DB");
|
||||
return;
|
||||
} catch (final IOException e) {
|
||||
e.printStackTrace();
|
||||
LOGGER.error("Fail to clean the DB");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public static void clear() throws IOException {
|
||||
LOGGER.info("Remove the test db");
|
||||
removeDB();
|
||||
// The connection is by default open ==> close it at the end of test:
|
||||
da.close();
|
||||
DbIoFactory.closeAllForceMode();
|
||||
ConfigBaseVariable.clearAllValue();
|
||||
}
|
||||
}
|
15
back/test/src/test/atriasoft/karusic/ResourceUtils.java
Normal file
15
back/test/src/test/atriasoft/karusic/ResourceUtils.java
Normal file
@@ -0,0 +1,15 @@
|
||||
package test.atriasoft.karusic;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.Objects;
|
||||
|
||||
public class ResourceUtils {
|
||||
|
||||
public static File getResourceFile(final String resourcePath) throws IOException {
|
||||
final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||
final URL resource = Objects.requireNonNull(classLoader.getResource(resourcePath), "Fichier non trouvé : " + resourcePath);
|
||||
return new File(resource.getFile());
|
||||
}
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
package test.kar.karusic;
|
||||
package test.atriasoft.karusic;
|
||||
|
||||
import org.junit.jupiter.api.extension.ConditionEvaluationResult;
|
||||
import org.junit.jupiter.api.extension.ExecutionCondition;
|
59
back/test/src/test/atriasoft/karusic/TestHealthCheck.java
Normal file
59
back/test/src/test/atriasoft/karusic/TestHealthCheck.java
Normal file
@@ -0,0 +1,59 @@
|
||||
package test.atriasoft.karusic;
|
||||
|
||||
import org.atriasoft.archidata.exception.RESTErrorResponseException;
|
||||
import org.atriasoft.archidata.tools.ConfigBaseVariable;
|
||||
import org.atriasoft.archidata.tools.RESTApi;
|
||||
import org.atriasoft.karusic.api.HealthCheck.HealthResult;
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.MethodOrderer;
|
||||
import org.junit.jupiter.api.Order;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestMethodOrder;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@ExtendWith(StepwiseExtension.class)
|
||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||
public class TestHealthCheck {
|
||||
private final static Logger LOGGER = LoggerFactory.getLogger(TestHealthCheck.class);
|
||||
|
||||
static WebLauncherTest webInterface = null;
|
||||
static RESTApi api = null;
|
||||
|
||||
@BeforeAll
|
||||
public static void configureWebServer() throws Exception {
|
||||
ConfigureDb.configure();
|
||||
LOGGER.info("configure server ...");
|
||||
webInterface = new WebLauncherTest();
|
||||
LOGGER.info("Start REST (BEGIN)");
|
||||
webInterface.process();
|
||||
LOGGER.info("Start REST (DONE)");
|
||||
api = new RESTApi(ConfigBaseVariable.apiAdress);
|
||||
api.setToken(Common.ADMIN_TOKEN);
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
public static void stopWebServer() throws Exception {
|
||||
LOGGER.info("Kill the web server");
|
||||
webInterface.stop();
|
||||
webInterface = null;
|
||||
ConfigureDb.clear();
|
||||
}
|
||||
|
||||
@Order(1)
|
||||
@Test
|
||||
public void checkHealthCheck() throws Exception {
|
||||
final HealthResult result = api.request("health_check").get().fetch(HealthResult.class);
|
||||
Assertions.assertEquals(result.value(), "alive and kicking");
|
||||
}
|
||||
|
||||
@Order(2)
|
||||
@Test
|
||||
public void checkHealthCheckWrongAPI() throws Exception {
|
||||
Assertions.assertThrows(RESTErrorResponseException.class, () -> api.request("health_check_kaboom").get().fetch());
|
||||
}
|
||||
|
||||
}
|
115
back/test/src/test/atriasoft/karusic/TestTrack.java
Normal file
115
back/test/src/test/atriasoft/karusic/TestTrack.java
Normal file
@@ -0,0 +1,115 @@
|
||||
package test.atriasoft.karusic;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.http.HttpResponse;
|
||||
import java.nio.file.Files;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.atriasoft.archidata.tools.ConfigBaseVariable;
|
||||
import org.atriasoft.archidata.tools.RESTApi;
|
||||
import org.atriasoft.karusic.model.Track;
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.MethodOrderer;
|
||||
import org.junit.jupiter.api.Order;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestMethodOrder;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@ExtendWith(StepwiseExtension.class)
|
||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||
public class TestTrack {
|
||||
private final static Logger LOGGER = LoggerFactory.getLogger(TestTrack.class);
|
||||
public final static String ENDPOINT_NAME = "track";
|
||||
public final static String ENDPOINT_DATA_NAME = "data";
|
||||
|
||||
static WebLauncherTest webInterface = null;
|
||||
static RESTApi api = null;
|
||||
|
||||
@BeforeAll
|
||||
public static void configureWebServer() throws Exception {
|
||||
ConfigureDb.configure();
|
||||
LOGGER.info("configure server ...");
|
||||
webInterface = new WebLauncherTest();
|
||||
LOGGER.info("Create BDD");
|
||||
webInterface.migrateDB();
|
||||
LOGGER.info("Start REST (BEGIN)");
|
||||
webInterface.process();
|
||||
LOGGER.info("Start REST (DONE)");
|
||||
api = new RESTApi(ConfigBaseVariable.apiAdress);
|
||||
api.setToken(Common.ADMIN_TOKEN);
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
public static void stopWebServer() throws Exception {
|
||||
LOGGER.info("Kill the web server");
|
||||
webInterface.stop();
|
||||
webInterface = null;
|
||||
ConfigureDb.clear();
|
||||
}
|
||||
|
||||
public static boolean compareResponseWithFile(final byte[] responseBody, final File file) throws IOException {
|
||||
final byte[] fileBytes = Files.readAllBytes(file.toPath());
|
||||
if (responseBody == null && fileBytes == null) {
|
||||
return true;
|
||||
}
|
||||
if (responseBody == null || fileBytes == null) {
|
||||
return false;
|
||||
}
|
||||
if (responseBody.length != fileBytes.length) {
|
||||
LOGGER.error("The data have not the same size: {} != {}(ref)", responseBody.length, fileBytes.length);
|
||||
return false;
|
||||
}
|
||||
for (int iii = 0; iii < responseBody.length; iii++) {
|
||||
if (responseBody[iii] != fileBytes[iii]) {
|
||||
LOGGER.error("Detect error at the {}/{} element", iii, responseBody.length);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Order(1)
|
||||
@Test
|
||||
public void createTrack() throws Exception {
|
||||
final File dataToUpload = ResourceUtils.getResourceFile("icon-192x192.png");
|
||||
final Track data = new Track();
|
||||
data.name = "test track";
|
||||
data.description = "My track description";
|
||||
final Map<String, Object> multipart = new HashMap<>();
|
||||
multipart.put("title", data.name);
|
||||
multipart.put("genderId", null);
|
||||
multipart.put("artistId", null);
|
||||
multipart.put("albumId", null);
|
||||
multipart.put("trackId", 9);
|
||||
multipart.put("file", dataToUpload);
|
||||
|
||||
final Track inserted = api.request(TestTrack.ENDPOINT_NAME, "upload").post().bodyMultipart(multipart).fetch(Track.class);
|
||||
|
||||
Assertions.assertNotNull(inserted);
|
||||
Assertions.assertNotNull(inserted.oid);
|
||||
// Assertions.assertTrue(inserted.oid >= 0);
|
||||
Assertions.assertNull(inserted.updatedAt);
|
||||
Assertions.assertNull(inserted.createdAt);
|
||||
Assertions.assertNull(inserted.deleted);
|
||||
Assertions.assertNotNull(inserted.name);
|
||||
Assertions.assertEquals(data.name, inserted.name);
|
||||
Assertions.assertNotNull(inserted.dataId);
|
||||
|
||||
// Retrieve Data:
|
||||
final HttpResponse<byte[]> retreiveData = api.request(TestTrack.ENDPOINT_DATA_NAME, inserted.dataId.toString()).get().fetchByte();
|
||||
Assertions.assertNotNull(retreiveData);
|
||||
Assertions.assertEquals(200, retreiveData.statusCode());
|
||||
Assertions.assertEquals("11999", retreiveData.headers().firstValue("content-length").orElse(null));
|
||||
final String contentType = retreiveData.headers().firstValue("content-type").orElse(null);
|
||||
Assertions.assertEquals("image/png", contentType);
|
||||
Assertions.assertTrue(compareResponseWithFile(retreiveData.body(), dataToUpload));
|
||||
|
||||
}
|
||||
|
||||
}
|
12
back/test/src/test/atriasoft/karusic/WebLauncherTest.java
Executable file
12
back/test/src/test/atriasoft/karusic/WebLauncherTest.java
Executable file
@@ -0,0 +1,12 @@
|
||||
|
||||
package test.atriasoft.karusic;
|
||||
|
||||
import org.atriasoft.karusic.WebLauncher;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class WebLauncherTest extends WebLauncher {
|
||||
final private static Logger LOGGER = LoggerFactory.getLogger(WebLauncherTest.class);
|
||||
|
||||
public WebLauncherTest() {}
|
||||
}
|
@@ -1,250 +0,0 @@
|
||||
package test.kar.karusic;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.MethodOrderer;
|
||||
import org.junit.jupiter.api.Order;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestMethodOrder;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.kar.archidata.exception.RESTErrorResponseExeption;
|
||||
import org.kar.archidata.model.GetToken;
|
||||
import org.kar.archidata.tools.ConfigBaseVariable;
|
||||
import org.kar.archidata.tools.JWTWrapper;
|
||||
import org.kar.archidata.tools.RESTApi;
|
||||
import org.kar.karusic.api.HealthCheck.HealthResult;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import com.nimbusds.jwt.JWTClaimsSet;
|
||||
|
||||
@ExtendWith(StepwiseExtension.class)
|
||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||
public class TestBase {
|
||||
private final static Logger LOGGER = LoggerFactory.getLogger(TestBase.class);
|
||||
|
||||
static WebLauncherTest webInterface = null;
|
||||
static RESTApi api = null;
|
||||
|
||||
public void login(final String login, final String password) {
|
||||
try {
|
||||
final GetToken token = api.post(GetToken.class, "users/get_token", DataGetToken.generate(login, "v1", "202515252", password));
|
||||
api.setToken(token.jwt());
|
||||
} catch (final Exception ex) {
|
||||
Assertions.fail("Can not get Authentication for '" + login + "' ==> " + ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public void loginAdmin() {
|
||||
login("karadmin", "adminA@666");
|
||||
}
|
||||
|
||||
@BeforeAll
|
||||
public static void configureWebServer() throws Exception {
|
||||
LOGGER.info("configure server ...");
|
||||
webInterface = new WebLauncherTest();
|
||||
LOGGER.info("Create DB");
|
||||
try {
|
||||
webInterface.migrateDB();
|
||||
} catch (final Exception ex) {
|
||||
ex.printStackTrace();
|
||||
LOGGER.error("Detect an error: {}", ex.getMessage());
|
||||
}
|
||||
LOGGER.info("Start REST (BEGIN)");
|
||||
webInterface.process();
|
||||
LOGGER.info("Start REST (DONE)");
|
||||
api = new RESTApi(ConfigBaseVariable.apiAdress);
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
public static void stopWebServer() throws InterruptedException {
|
||||
LOGGER.info("Kill the web server");
|
||||
webInterface = null;
|
||||
// TODO: do it better...
|
||||
}
|
||||
|
||||
@Order(1)
|
||||
@Test
|
||||
//@RepeatedTest(10)
|
||||
public void checkHealthCheck() throws Exception {
|
||||
final HealthResult result = api.get(HealthResult.class, "health_check");
|
||||
Assertions.assertEquals(result.value(), "alive and kicking");
|
||||
}
|
||||
|
||||
@Order(2)
|
||||
@Test
|
||||
public void checkHealthCheckWrongAPI() throws Exception {
|
||||
Assertions.assertThrows(RESTErrorResponseExeption.class, () -> api.get(HealthResult.class, "health_checks"));
|
||||
}
|
||||
|
||||
@Order(3)
|
||||
@Test
|
||||
public void firstUserConnect() throws Exception {
|
||||
final GetToken result = api.post(GetToken.class, "users/get_token", DataGetToken.generate("karadmin", "v1", "202515252", "adminA@666"));
|
||||
final String[] splitted = result.jwt().split("\\.");
|
||||
Assertions.assertEquals(3, splitted.length);
|
||||
final String authorization = result.jwt();
|
||||
LOGGER.debug(" validate token : " + authorization);
|
||||
// Note with local access we get the internal key of the system.
|
||||
final JWTClaimsSet ret = JWTWrapper.validateToken(authorization, "KarAuth", null);
|
||||
// check the token is valid !!! (signed and coherent issuer...
|
||||
Assertions.assertNotNull(ret);
|
||||
// check userID
|
||||
final String userUID = ret.getSubject();
|
||||
final long id = Long.parseLong(userUID);
|
||||
Assertions.assertEquals(1, id);
|
||||
final String name = (String) ret.getClaim("login");
|
||||
Assertions.assertEquals("karadmin", name);
|
||||
|
||||
final Object rowRight = ret.getClaim("right");
|
||||
Assertions.assertNotNull(rowRight);
|
||||
final Map<String, Map<String, Object>> rights = (Map<String, Map<String, Object>>) ret.getClaim("right");
|
||||
// Check if the element contain the basic keys:
|
||||
Assertions.assertEquals(rights.size(), 1);
|
||||
Assertions.assertTrue(rights.containsKey("karusic"));
|
||||
final Map<String, Object> applRight = rights.get("karusic");
|
||||
//logger.error("full right: {}", applRight);
|
||||
Assertions.assertEquals(applRight.size(), 2);
|
||||
Assertions.assertTrue(applRight.containsKey("ADMIN"));
|
||||
Assertions.assertEquals(true, applRight.get("ADMIN"));
|
||||
Assertions.assertTrue(applRight.containsKey("USER"));
|
||||
Assertions.assertEquals(true, applRight.get("USER"));
|
||||
|
||||
//logger.debug("request user: '{}' right: '{}' row='{}'", userUID, applRight, rowRight);
|
||||
|
||||
//Assertions.assertEquals("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9", splitted[0]);
|
||||
//Assertions.assertEquals("eyJzdWIiOiIwIiwiYXBwbGljYXRpb24iOiJrYXJzbyIsImlzcyI6IkthckF1dGgiLCJyaWdodCI6eyJrYXJzbyI6eyJBRE1JTiI6dHJ1ZSwiVVNFUiI6dHJ1ZX19LCJsb2dpbiI6ImthcmFkbWluIiwiZXhwIjoxNjg0MTk5MTkzLCJpYXQiOjE2ODI3NTU0MjV9", splitted[1]);
|
||||
// TODO ... Assertions.assertEquals("????", splitted[2]);
|
||||
}
|
||||
|
||||
public void checkFail(final String type, final String urlOffset, final int errorStatus) {
|
||||
checkFail(type, urlOffset, errorStatus, null);
|
||||
}
|
||||
|
||||
public void checkFail(final String type, final String urlOffset, final int errorStatus, final String data) {
|
||||
LOGGER.info("Test API: url={} urlOffset={}", type, urlOffset);
|
||||
try {
|
||||
if ("GET".equals(type)) {
|
||||
api.get(String.class, urlOffset);
|
||||
} else if ("POST".equals(type)) {
|
||||
api.post(String.class, urlOffset, data);
|
||||
} else if ("PUT".equals(type)) {
|
||||
api.put(String.class, urlOffset, data);
|
||||
} else if ("DELETE".equals(type)) {
|
||||
api.delete(String.class, urlOffset);
|
||||
}
|
||||
Assertions.fail("Request on URL does not fail as expected: '" + type + "' url='" + urlOffset + "'");
|
||||
} catch (final RESTErrorResponseExeption ex) {
|
||||
if (errorStatus != ex.status) {
|
||||
LOGGER.error("Fail in test with the wrong return errors: {}", ex.toString());
|
||||
}
|
||||
Assertions.assertEquals(errorStatus, ex.status);
|
||||
} catch (final Exception ex) {
|
||||
LOGGER.error("Unexpected throw error: {}", ex);
|
||||
Assertions.fail("Unexpected throws...");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void checkWork(final String type, final String urlOffset) {
|
||||
checkWork(type, urlOffset, null);
|
||||
}
|
||||
|
||||
public void checkWork(final String type, final String urlOffset, final String data) {
|
||||
LOGGER.info("Test API: url={} urlOffset={}", type, urlOffset);
|
||||
try {
|
||||
if ("GET".equals(type)) {
|
||||
api.get(String.class, urlOffset);
|
||||
} else if ("POST".equals(type)) {
|
||||
api.post(String.class, urlOffset, data);
|
||||
} else if ("PUT".equals(type)) {
|
||||
api.put(String.class, urlOffset, data);
|
||||
} else if ("DELETE".equals(type)) {
|
||||
api.delete(String.class, urlOffset);
|
||||
}
|
||||
//Assertions.fail("Request on URL does not fail as expected: '" + type + "' url='" + urlOffset + "'");
|
||||
} catch (final RESTErrorResponseExeption ex) {
|
||||
Assertions.fail("Must not fail ... " + ex.toString());
|
||||
} catch (final Exception ex) {
|
||||
LOGGER.error("Unexpected throw error: {}", ex);
|
||||
Assertions.fail("Unexpected throws...");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Order(4)
|
||||
@Test
|
||||
public void checkUnAuthorizedAPI() throws Exception {
|
||||
// /application/
|
||||
checkFail("GET", "application/", 401);
|
||||
checkFail("POST", "application/", 401, "{}");
|
||||
checkFail("PUT", "application/", 405, "{}"); // does not exist
|
||||
checkFail("DELETE", "application/", 405); // does not exist
|
||||
// /application/{id}
|
||||
checkFail("GET", "application/0", 401);
|
||||
checkFail("PUT", "application/0", 401, "{}");
|
||||
checkFail("POST", "application/0", 405, "{}");
|
||||
checkFail("DELETE", "application/0", 401);
|
||||
// /application/{id}/*
|
||||
checkFail("GET", "application/0/users", 401);
|
||||
// /application/*
|
||||
checkFail("GET", "application/small", 401);
|
||||
checkFail("GET", "application/get_token", 401);
|
||||
checkFail("GET", "application/return", 401);
|
||||
|
||||
// /application_token/ section:
|
||||
checkFail("GET", "application_token/0", 401);
|
||||
checkFail("DELETE", "application_token/0/5", 401);
|
||||
checkFail("DELETE", "application_token/0/create", 401);
|
||||
|
||||
// /front/*
|
||||
checkFail("GET", "front", 404); // no index in test section
|
||||
// health check
|
||||
checkWork("GET", "health_check");
|
||||
|
||||
// public_key (only application)
|
||||
checkFail("GET", "public_key", 401);
|
||||
checkFail("GET", "public_key/pem", 401);
|
||||
|
||||
// /right
|
||||
checkFail("GET", "right", 401);
|
||||
checkFail("POST", "right", 401, "{}");
|
||||
checkFail("GET", "right/0", 401);
|
||||
checkFail("PUT", "right/0", 401, "{}");
|
||||
checkFail("DELETE", "right/0", 401);
|
||||
|
||||
// /system_config
|
||||
checkWork("GET", "system_config/is_sign_up_availlable");
|
||||
checkFail("GET", "system_config/key/skjdfhkjsdhfkjsh", 401);
|
||||
checkFail("PUT", "system_config/key/skjdfhkjsdhfkjsh", 401, "{}");
|
||||
|
||||
// /users
|
||||
checkFail("GET", "users", 401);
|
||||
checkFail("GET", "users/0", 401);
|
||||
checkFail("POST", "users/0/application/0/link", 401, "{}");
|
||||
checkFail("POST", "users/0/set_admin", 401, "{}");
|
||||
checkFail("POST", "users/0/set_blocked", 401, "{}");
|
||||
checkFail("POST", "users/create_new_user", 401, "{}");
|
||||
checkFail("GET", "users/me", 401, "{}");
|
||||
checkFail("POST", "users/password", 401, "{}");
|
||||
checkWork("GET", "users/check_login?login=karadmin");
|
||||
checkFail("GET", "users/check_login?login=jhkjhkjh", 404);
|
||||
checkWork("GET", "users/check_email?email=admin@admin.ZZZ");
|
||||
checkFail("GET", "users/check_email?email=ksjhdkjfhskjdh", 404);
|
||||
// not testable : get_token
|
||||
|
||||
}
|
||||
|
||||
@Order(5)
|
||||
@Test
|
||||
public void testMeWithToken() throws Exception {
|
||||
loginAdmin();
|
||||
final String result = api.get(String.class, "users/me");
|
||||
Assertions.assertEquals("{\"id\":1,\"login\":\"karadmin\"}", result);
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -1,28 +0,0 @@
|
||||
|
||||
package test.kar.karusic;
|
||||
|
||||
import org.kar.archidata.tools.ConfigBaseVariable;
|
||||
import org.kar.karusic.WebLauncher;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class WebLauncherTest extends WebLauncher {
|
||||
final private static Logger LOGGER = LoggerFactory.getLogger(WebLauncherTest.class);
|
||||
|
||||
public WebLauncherTest() {
|
||||
LOGGER.debug("Configure REST system");
|
||||
// for local test:
|
||||
ConfigBaseVariable.apiAdress = "http://127.0.0.1:12345/test/api/";
|
||||
|
||||
ConfigBaseVariable.dbPort = "3306";
|
||||
// for the test we a in memory sqlite..
|
||||
ConfigBaseVariable.dbType = "sqlite";
|
||||
ConfigBaseVariable.dbHost = "memory";
|
||||
// for test we need to connect all time the DB
|
||||
ConfigBaseVariable.dbKeepConnected = "true";
|
||||
|
||||
ConfigBaseVariable.dbHost = "localhost";
|
||||
ConfigBaseVariable.dbUser = "root";
|
||||
ConfigBaseVariable.dbPassword = "ZERTYSDGFVHSDFGHJYZSDFGSQxfgsqdfgsqdrf4564654";
|
||||
}
|
||||
}
|
56
env_dev/docker-compose.yaml
Normal file
56
env_dev/docker-compose.yaml
Normal file
@@ -0,0 +1,56 @@
|
||||
services:
|
||||
kar_db_service:
|
||||
image: mysql:latest
|
||||
restart: always
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=base_db_password
|
||||
volumes:
|
||||
- ./data:/var/lib/mysql
|
||||
mem_limit: 300m
|
||||
ports:
|
||||
- 3906:3306
|
||||
healthcheck:
|
||||
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
# perform a 1 minute grace to let the DB to perform the initialization
|
||||
start_period: 1m
|
||||
start_interval: 1m
|
||||
|
||||
kar_mongodb_service:
|
||||
image: mongo:latest
|
||||
restart: always
|
||||
environment:
|
||||
MONGO_INITDB_ROOT_USERNAME: root
|
||||
MONGO_INITDB_ROOT_PASSWORD: base_db_password
|
||||
ports:
|
||||
- 27017:27017
|
||||
volumes:
|
||||
- ./dataMongo:/data/db
|
||||
|
||||
kar_adminer_service:
|
||||
image: adminer:latest
|
||||
restart: always
|
||||
depends_on:
|
||||
kar_db_service:
|
||||
condition: service_healthy
|
||||
links:
|
||||
- kar_db_service:db
|
||||
- kar_mongodb_service:dbm
|
||||
ports:
|
||||
- 4079:8080
|
||||
mem_limit: 50m
|
||||
|
||||
mongo_express_service:
|
||||
image: mongo-express
|
||||
restart: always
|
||||
ports:
|
||||
- 4077:8081
|
||||
links:
|
||||
- kar_mongodb_service:db
|
||||
environment:
|
||||
ME_CONFIG_MONGODB_ADMINUSERNAME: root
|
||||
ME_CONFIG_MONGODB_ADMINPASSWORD: base_db_password
|
||||
ME_CONFIG_MONGODB_URL: mongodb://root:base_db_password@db:27017/
|
||||
ME_CONFIG_BASICAUTH: false
|
||||
|
@@ -1,12 +0,0 @@
|
||||
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
|
||||
# For additional information regarding the format and rule options, please see:
|
||||
# https://github.com/browserslist/browserslist#queries
|
||||
|
||||
# You can see what browsers were selected by your queries by running:
|
||||
# npx browserslist
|
||||
|
||||
> 0.5%
|
||||
last 2 versions
|
||||
Firefox ESR
|
||||
not dead
|
||||
not IE 9-11 # For IE 9-11 support, remove 'not'.
|
@@ -1,13 +0,0 @@
|
||||
# Editor configuration, see http://editorconfig.org
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
max_line_length = off
|
||||
trim_trailing_whitespace = false
|
1
front/.env
Normal file
1
front/.env
Normal file
@@ -0,0 +1 @@
|
||||
NODE_ENV=development
|
2
front/.env.production
Normal file
2
front/.env.production
Normal file
@@ -0,0 +1,2 @@
|
||||
# URL for database connection
|
||||
VITE_API_BASE_URL=karusic/api/
|
@@ -1,4 +0,0 @@
|
||||
node_modules/*
|
||||
build/*
|
||||
out/*
|
||||
dist/*
|
@@ -1,225 +0,0 @@
|
||||
var OFF = 0, WARN = 1, ERROR = 2;
|
||||
|
||||
module.exports = {
|
||||
'env': {
|
||||
'browser': true,
|
||||
'es2021': true,
|
||||
},
|
||||
'extends': [
|
||||
'eslint:recommended',
|
||||
],
|
||||
'parser': '@typescript-eslint/parser',
|
||||
'parserOptions': {
|
||||
'ecmaVersion': 'latest',
|
||||
'sourceType': 'module',
|
||||
},
|
||||
'plugins': [
|
||||
'@typescript-eslint',
|
||||
],
|
||||
"rules": {
|
||||
// Possible Errors (overrides from recommended set)
|
||||
"no-extra-parens": ERROR,
|
||||
"no-unexpected-multiline": ERROR,
|
||||
// All JSDoc comments must be valid
|
||||
"valid-jsdoc": [ OFF, {
|
||||
"requireReturn": false,
|
||||
"requireReturnDescription": false,
|
||||
"requireParamDescription": true,
|
||||
"prefer": {
|
||||
"return": "returns"
|
||||
}
|
||||
}],
|
||||
|
||||
// Best Practices
|
||||
|
||||
// Allowed a getter without setter, but all setters require getters
|
||||
"accessor-pairs": [ OFF, {
|
||||
"getWithoutSet": false,
|
||||
"setWithoutGet": true
|
||||
}],
|
||||
"block-scoped-var": WARN,
|
||||
"consistent-return": OFF,
|
||||
"curly": ERROR,
|
||||
"default-case": WARN,
|
||||
// the dot goes with the property when doing multiline
|
||||
"dot-location": [ WARN, "property" ],
|
||||
"dot-notation": WARN,
|
||||
"eqeqeq": [ ERROR, "smart" ],
|
||||
"guard-for-in": WARN,
|
||||
"no-alert": ERROR,
|
||||
"no-caller": ERROR,
|
||||
"no-case-declarations": WARN,
|
||||
"no-div-regex": WARN,
|
||||
"no-else-return": WARN,
|
||||
"no-empty-pattern": WARN,
|
||||
"no-eq-null": ERROR,
|
||||
"no-eval": ERROR,
|
||||
"no-extend-native": ERROR,
|
||||
"no-extra-bind": WARN,
|
||||
"no-floating-decimal": WARN,
|
||||
"no-implicit-coercion": [ WARN, {
|
||||
"boolean": true,
|
||||
"number": true,
|
||||
"string": true
|
||||
}],
|
||||
"no-implied-eval": ERROR,
|
||||
"no-invalid-this": ERROR,
|
||||
"no-iterator": ERROR,
|
||||
"no-labels": WARN,
|
||||
"no-lone-blocks": WARN,
|
||||
"no-loop-func": ERROR,
|
||||
"no-magic-numbers": OFF,
|
||||
"no-multi-spaces": ERROR,
|
||||
"no-multi-str": WARN,
|
||||
"no-native-reassign": ERROR,
|
||||
"no-new-func": ERROR,
|
||||
"no-new-wrappers": ERROR,
|
||||
"no-new": ERROR,
|
||||
"no-octal-escape": ERROR,
|
||||
"no-param-reassign": ERROR,
|
||||
"no-process-env": WARN,
|
||||
"no-proto": ERROR,
|
||||
"no-redeclare": ERROR,
|
||||
"no-return-assign": ERROR,
|
||||
"no-script-url": ERROR,
|
||||
"no-self-compare": ERROR,
|
||||
"no-throw-literal": ERROR,
|
||||
"no-unused-expressions": ERROR,
|
||||
"no-useless-call": ERROR,
|
||||
"no-useless-concat": ERROR,
|
||||
"no-void": WARN,
|
||||
// Produce warnings when something is commented as TODO or FIXME
|
||||
"no-warning-comments": [ WARN, {
|
||||
"terms": [ "TODO", "FIXME" ],
|
||||
"location": "start"
|
||||
}],
|
||||
"no-with": WARN,
|
||||
"radix": WARN,
|
||||
"vars-on-top": ERROR,
|
||||
// Enforces the style of wrapped functions
|
||||
"wrap-iife": [ ERROR, "outside" ],
|
||||
"yoda": ERROR,
|
||||
|
||||
// Strict Mode - for ES6, never use strict.
|
||||
"strict": [ ERROR, "never" ],
|
||||
|
||||
// Variables
|
||||
"init-declarations": [ OFF, "always" ],
|
||||
"no-catch-shadow": WARN,
|
||||
"no-delete-var": ERROR,
|
||||
"no-label-var": ERROR,
|
||||
"no-shadow-restricted-names": ERROR,
|
||||
"no-shadow": WARN,
|
||||
// We require all vars to be initialized (see init-declarations)
|
||||
// If we NEED a var to be initialized to undefined, it needs to be explicit
|
||||
"no-undef-init": OFF,
|
||||
"no-undef": ERROR,
|
||||
"no-undefined": OFF,
|
||||
"no-unused-vars": OFF,
|
||||
// Disallow hoisting - let & const don't allow hoisting anyhow
|
||||
"no-use-before-define": ERROR,
|
||||
|
||||
// Node.js and CommonJS
|
||||
"callback-return": [ WARN, [ "callback", "next" ]],
|
||||
"global-require": ERROR,
|
||||
"handle-callback-err": WARN,
|
||||
"no-mixed-requires": WARN,
|
||||
"no-new-require": ERROR,
|
||||
// Use path.concat instead
|
||||
"no-path-concat": ERROR,
|
||||
"no-process-exit": ERROR,
|
||||
"no-restricted-modules": OFF,
|
||||
"no-sync": WARN,
|
||||
|
||||
// ECMAScript 6 support
|
||||
"arrow-body-style": [ ERROR, "always" ],
|
||||
"arrow-parens": [ ERROR, "always" ],
|
||||
"arrow-spacing": [ ERROR, { "before": true, "after": true }],
|
||||
"constructor-super": ERROR,
|
||||
"generator-star-spacing": [ ERROR, "before" ],
|
||||
"no-confusing-arrow": ERROR,
|
||||
"no-class-assign": ERROR,
|
||||
"no-const-assign": ERROR,
|
||||
"no-dupe-class-members": ERROR,
|
||||
"no-this-before-super": ERROR,
|
||||
"no-var": WARN,
|
||||
"object-shorthand": [ WARN, "never" ],
|
||||
"prefer-arrow-callback": WARN,
|
||||
"prefer-spread": WARN,
|
||||
"prefer-template": WARN,
|
||||
"require-yield": ERROR,
|
||||
|
||||
// Stylistic - everything here is a warning because of style.
|
||||
"array-bracket-spacing": [ WARN, "always" ],
|
||||
"block-spacing": [ WARN, "always" ],
|
||||
"brace-style": [ WARN, "1tbs", { "allowSingleLine": false } ],
|
||||
"camelcase": WARN,
|
||||
"comma-spacing": [ WARN, { "before": false, "after": true } ],
|
||||
"comma-style": [ WARN, "last" ],
|
||||
"computed-property-spacing": [ WARN, "never" ],
|
||||
"consistent-this": [ WARN, "self" ],
|
||||
"eol-last": WARN,
|
||||
"func-names": WARN,
|
||||
"func-style": [ WARN, "declaration" ],
|
||||
"id-length": [ WARN, { "min": 2, "max": 32 } ],
|
||||
"indent": [ WARN, 'tab' ],
|
||||
"jsx-quotes": [ WARN, "prefer-double" ],
|
||||
"linebreak-style": [ WARN, "unix" ],
|
||||
"lines-around-comment": [ OFF, { "beforeBlockComment": true } ],
|
||||
"max-depth": [ WARN, 8 ],
|
||||
"max-len": [ WARN, 182 ],
|
||||
"max-nested-callbacks": [ WARN, 8 ],
|
||||
"max-params": [ WARN, 10 ],
|
||||
"new-cap": OFF,
|
||||
"new-parens": WARN,
|
||||
"no-array-constructor": WARN,
|
||||
"no-bitwise": OFF,
|
||||
"no-continue": OFF,
|
||||
"no-inline-comments": OFF,
|
||||
"no-lonely-if": OFF,
|
||||
"no-mixed-spaces-and-tabs": OFF,
|
||||
"no-multiple-empty-lines": WARN,
|
||||
"no-negated-condition": OFF,
|
||||
"no-nested-ternary": WARN,
|
||||
"no-new-object": WARN,
|
||||
"no-plusplus": OFF,
|
||||
"no-spaced-func": WARN,
|
||||
"no-ternary": OFF,
|
||||
"no-trailing-spaces": WARN,
|
||||
"no-underscore-dangle": WARN,
|
||||
"no-unneeded-ternary": WARN,
|
||||
"object-curly-spacing": [ WARN, "always" ],
|
||||
"one-var": OFF,
|
||||
"operator-assignment": [ WARN, "never" ],
|
||||
"operator-linebreak": [ WARN, "after" ],
|
||||
"padded-blocks": [ WARN, "never" ],
|
||||
"quote-props": [ WARN, "consistent-as-needed" ],
|
||||
"quotes": [ WARN, "single" ],
|
||||
"require-jsdoc": [ OFF, {
|
||||
"require": {
|
||||
"FunctionDeclaration": true,
|
||||
"MethodDefinition": true,
|
||||
"ClassDeclaration": false
|
||||
}
|
||||
}],
|
||||
"semi-spacing": [ WARN, { "before": false, "after": true }],
|
||||
"semi": [ ERROR, "always" ],
|
||||
"sort-vars": OFF,
|
||||
"keyword-spacing": [WARN, {
|
||||
"overrides": {
|
||||
"if": { "after": false },
|
||||
"for": { "after": false },
|
||||
"while": { "after": false },
|
||||
"static": { "after": false },
|
||||
"as": { "after": false }
|
||||
}
|
||||
}],
|
||||
"space-before-blocks": [ WARN, "always" ],
|
||||
"space-before-function-paren": [ WARN, "never" ],
|
||||
"space-in-parens": [ WARN, "never" ],
|
||||
"space-infix-ops": [ WARN, { "int32Hint": true } ],
|
||||
"space-unary-ops": ERROR,
|
||||
"spaced-comment": [ WARN, "always" ],
|
||||
"wrap-regex": WARN,
|
||||
},
|
||||
};
|
3
front/.gitignore
vendored
3
front/.gitignore
vendored
@@ -1,3 +0,0 @@
|
||||
/node_modules/
|
||||
/.angular/
|
||||
/.idea/
|
27
front/.storybook/main.ts
Normal file
27
front/.storybook/main.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import type { StorybookConfig } from '@storybook/react-vite';
|
||||
|
||||
const config: StorybookConfig = {
|
||||
framework: {
|
||||
name: '@storybook/react-vite',
|
||||
options: {},
|
||||
},
|
||||
|
||||
core: {
|
||||
disableTelemetry: true,
|
||||
builder: '@storybook/builder-vite',
|
||||
},
|
||||
|
||||
stories: ['../src/**/*.@(mdx|stories.@(js|jsx|ts|tsx))'],
|
||||
|
||||
addons: ['@storybook/addon-links', '@storybook/addon-essentials'],
|
||||
|
||||
staticDirs: ['../public'],
|
||||
|
||||
typescript: {
|
||||
reactDocgen: false,
|
||||
},
|
||||
|
||||
docs: {},
|
||||
};
|
||||
|
||||
export default config;
|
16
front/.storybook/preview-head.html
Normal file
16
front/.storybook/preview-head.html
Normal file
@@ -0,0 +1,16 @@
|
||||
<style>
|
||||
html {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.docs-story > :first-child {
|
||||
padding: 0;
|
||||
}
|
||||
.docs-story > * {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
#root #start-ui-storybook-wrapper {
|
||||
min-height: 100vh;
|
||||
}
|
||||
</style>
|
34
front/.storybook/preview.tsx
Normal file
34
front/.storybook/preview.tsx
Normal file
@@ -0,0 +1,34 @@
|
||||
import React from 'react';
|
||||
|
||||
import { Box } from '@chakra-ui/react';
|
||||
import { ChakraProvider } from '@chakra-ui/react';
|
||||
import { MemoryRouter } from 'react-router-dom';
|
||||
|
||||
import { ColorModeProvider } from '../src/components/ui/color-mode';
|
||||
import { Toaster } from '../src/components/ui/toaster';
|
||||
import { systemTheme } from '../src/theme/theme';
|
||||
|
||||
// .
|
||||
const DocumentationWrapper = ({ children }) => {
|
||||
return (
|
||||
<Box id="start-ui-storybook-wrapper" p="4" pb="8" flex="1">
|
||||
{children}
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
export const decorators = [
|
||||
(Story, context) => (
|
||||
<ColorModeProvider>
|
||||
<ChakraProvider value={systemTheme}>
|
||||
{/* Using MemoryRouter to avoid route clashing with Storybook */}
|
||||
<MemoryRouter>
|
||||
<DocumentationWrapper>
|
||||
<Story {...context} />
|
||||
</DocumentationWrapper>
|
||||
</MemoryRouter>
|
||||
<Toaster />
|
||||
</ChakraProvider>
|
||||
</ColorModeProvider>
|
||||
),
|
||||
];
|
@@ -1,33 +0,0 @@
|
||||
# base image
|
||||
FROM node:lts as build
|
||||
|
||||
# add `/application/node_modules/.bin` to $PATH
|
||||
ENV PATH /application/node_modules/.bin:$PATH
|
||||
|
||||
ADD package-lock.json /application/
|
||||
ADD package.json /application/
|
||||
#ADD browserslist /application/
|
||||
ADD karma.conf.js /application/
|
||||
ADD protractor.conf.js /application/
|
||||
WORKDIR /application/
|
||||
|
||||
# install and cache app dependencies
|
||||
RUN npm install
|
||||
|
||||
ADD e2e /application/e2e
|
||||
ADD tsconfig.json tslint.json angular.json ./
|
||||
ADD src /application/src
|
||||
|
||||
# generate build
|
||||
RUN ng build --output-path=dist --configuration=production --base-href=/karideo/ --deploy-url=/karideo/
|
||||
|
||||
############
|
||||
### prod ###
|
||||
############
|
||||
|
||||
# base image
|
||||
FROM httpd:latest
|
||||
|
||||
# copy artifact build from the 'build environment'
|
||||
COPY --from=build /application/dist /usr/local/apache2/htdocs/
|
||||
COPY httpd/httpd.conf /usr/local/apache2/conf/httpd.conf
|
@@ -1,24 +0,0 @@
|
||||
# base image
|
||||
FROM node:latest
|
||||
|
||||
ADD src /application/src
|
||||
ADD e2e /application/e2e
|
||||
ADD package-lock.json /application/
|
||||
ADD package.json /application/
|
||||
ADD angular.json /application/
|
||||
ADD browserslist /application/
|
||||
ADD karma.conf.js /application/
|
||||
ADD protractor.conf.js /application/
|
||||
ADD tsconfig.json /application/
|
||||
ADD tslint.json /application/
|
||||
WORKDIR /application/
|
||||
|
||||
# add `/app/node_modules/.bin` to $PATH
|
||||
ENV PATH /app/node_modules/.bin:$PATH
|
||||
|
||||
# install and cache app dependencies
|
||||
RUN npm install
|
||||
|
||||
# start app
|
||||
CMD ["npx", "ng", "serve", "--host", "0.0.0.0"]
|
||||
|
2
front/LICENSE
Normal file
2
front/LICENSE
Normal file
@@ -0,0 +1,2 @@
|
||||
Proprietary
|
||||
@copyright Edouard Dupin 2024
|
@@ -1,172 +0,0 @@
|
||||
{
|
||||
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
|
||||
"version": 1,
|
||||
"newProjectRoot": "projects",
|
||||
"projects": {
|
||||
"karusic": {
|
||||
"root": "",
|
||||
"sourceRoot": "src",
|
||||
"projectType": "application",
|
||||
"architect": {
|
||||
"build": {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"options": {
|
||||
"outputPath": "dist",
|
||||
"index": "src/index.html",
|
||||
"main": "src/main.ts",
|
||||
"tsConfig": "src/tsconfig.app.json",
|
||||
"preserveSymlinks": true,
|
||||
"polyfills": [
|
||||
"zone.js"
|
||||
],
|
||||
"assets": [
|
||||
"src/assets",
|
||||
"src/favicon.ico"
|
||||
],
|
||||
"styles": [
|
||||
"src/styles.less",
|
||||
"src/generic_page.less",
|
||||
"src/theme.color.blue.less",
|
||||
"src/theme.checkbox.less",
|
||||
"src/theme.modal.less"
|
||||
],
|
||||
"scripts": []
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"optimization": true,
|
||||
"outputHashing": "all",
|
||||
"sourceMap": false,
|
||||
"namedChunks": false,
|
||||
"aot": true,
|
||||
"extractLicenses": true,
|
||||
"vendorChunk": false,
|
||||
"buildOptimizer": true,
|
||||
"fileReplacements": [
|
||||
{
|
||||
"replace": "src/environments/environment.ts",
|
||||
"with": "src/environments/environment.prod.ts"
|
||||
}
|
||||
]
|
||||
},
|
||||
"develop": {
|
||||
"optimization": false,
|
||||
"outputHashing": "none",
|
||||
"namedChunks": true,
|
||||
"aot": false,
|
||||
"extractLicenses": true,
|
||||
"vendorChunk": true,
|
||||
"buildOptimizer": false,
|
||||
"sourceMap": {
|
||||
"scripts": true,
|
||||
"styles": true,
|
||||
"hidden": false,
|
||||
"vendor": true
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"serve": {
|
||||
"builder": "@angular-devkit/build-angular:dev-server",
|
||||
"options": {
|
||||
"buildTarget": "karusic:build"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"buildTarget": "karusic:build:production"
|
||||
},
|
||||
"develop": {
|
||||
"buildTarget": "karusic:build:develop"
|
||||
}
|
||||
}
|
||||
},
|
||||
"extract-i18n": {
|
||||
"builder": "@angular-devkit/build-angular:extract-i18n",
|
||||
"options": {
|
||||
"buildTarget": "karusic:build"
|
||||
}
|
||||
},
|
||||
"test": {
|
||||
"builder": "@angular-devkit/build-angular:karma",
|
||||
"options": {
|
||||
"main": "src/test.ts",
|
||||
"karmaConfig": "./karma.conf.js",
|
||||
"polyfills": [
|
||||
"zone.js"
|
||||
],
|
||||
"tsConfig": "src/tsconfig.spec.json",
|
||||
"scripts": [],
|
||||
"styles": [
|
||||
"src/styles.less",
|
||||
"src/generic_page.less",
|
||||
"src/theme.color.blue.less",
|
||||
"src/theme.checkbox.less",
|
||||
"src/theme.modal.less"
|
||||
],
|
||||
"assets": [
|
||||
"src/assets",
|
||||
"src/favicon.ico"
|
||||
]
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"builder": "@angular-eslint/builder:lint",
|
||||
"options": {
|
||||
"fix": true,
|
||||
"eslintConfig": ".eslintrc.js",
|
||||
"lintFilePatterns": [
|
||||
"src/**/*.spec.ts",
|
||||
"src/**/*.ts"
|
||||
]
|
||||
}
|
||||
},
|
||||
"TTTTTTlint": {
|
||||
"builder": "@angular-devkit/build-angular:tslint",
|
||||
"options": {
|
||||
"tsConfig": [
|
||||
"src/tsconfig.app.json",
|
||||
"src/tsconfig.spec.json"
|
||||
],
|
||||
"exclude": [
|
||||
"**/node_modules/**"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"karusic-e2e": {
|
||||
"root": "e2e",
|
||||
"sourceRoot": "e2e",
|
||||
"projectType": "application",
|
||||
"architect": {
|
||||
"e2e": {
|
||||
"builder": "@angular-devkit/build-angular:protractor",
|
||||
"options": {
|
||||
"protractorConfig": "./protractor.conf.js",
|
||||
"devServerTarget": "karusic:serve"
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"builder": "@angular-devkit/build-angular:tslint",
|
||||
"options": {
|
||||
"tsConfig": [
|
||||
"e2e/tsconfig.e2e.json"
|
||||
],
|
||||
"exclude": [
|
||||
"**/node_modules/**"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"schematics": {
|
||||
"@schematics/angular:component": {
|
||||
"prefix": "app",
|
||||
"style": "less"
|
||||
},
|
||||
"@schematics/angular:directive": {
|
||||
"prefix": "app"
|
||||
}
|
||||
}
|
||||
}
|
10637
front/config sample.yaml
Normal file
10637
front/config sample.yaml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,11 +0,0 @@
|
||||
version: '3'
|
||||
services:
|
||||
karideo_service:
|
||||
build: .
|
||||
restart: always
|
||||
image: yui.heero/karideo
|
||||
container_name: karideo
|
||||
ports:
|
||||
#- 15081:4200
|
||||
- 15081:80
|
||||
|
@@ -1,14 +0,0 @@
|
||||
import { AppPage } from './app.po';
|
||||
|
||||
describe('karusic App', () => {
|
||||
let page: AppPage;
|
||||
|
||||
beforeEach(() => {
|
||||
page = new AppPage();
|
||||
});
|
||||
|
||||
it('should display welcome message', () => {
|
||||
page.navigateTo();
|
||||
expect(page.getParagraphText()).toEqual('Welcome to app!');
|
||||
});
|
||||
});
|
@@ -1,11 +0,0 @@
|
||||
import { browser, by, element } from 'protractor';
|
||||
|
||||
export class AppPage {
|
||||
navigateTo() {
|
||||
return browser.get('/');
|
||||
}
|
||||
|
||||
getParagraphText() {
|
||||
return element(by.css('app-root h1')).getText();
|
||||
}
|
||||
}
|
@@ -1,14 +0,0 @@
|
||||
{
|
||||
"extends": "../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../out-tsc/e2e",
|
||||
"baseUrl": "./",
|
||||
"module": "commonjs",
|
||||
"target": "es5",
|
||||
"types": [
|
||||
"jasmine",
|
||||
"jasminewd2",
|
||||
"node"
|
||||
]
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user