Compare commits
	
		
			No commits in common. "218fa6553e3c0e167484f27487438e4309acd638" and "8f2828ea6323520e15e6822b22a8ed43076cebab" have entirely different histories.
		
	
	
		
			218fa6553e
			...
			8f2828ea63
		
	
		
					 16 changed files with 42 additions and 104 deletions
				
			
		
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,5 +1,3 @@
 | 
				
			||||||
docker/deloyment-example/files/library/*
 | 
					postgres/docker-compose.yml
 | 
				
			||||||
docker/deloyment-example/files/postgresql/*
 | 
					 | 
				
			||||||
docker/deloyment-example/files/root/*
 | 
					 | 
				
			||||||
target/
 | 
					target/
 | 
				
			||||||
lib/
 | 
					lib/
 | 
				
			||||||
							
								
								
									
										12
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							| 
						 | 
					@ -2,23 +2,13 @@
 | 
				
			||||||
    "configurations": [
 | 
					    "configurations": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            "type": "java",
 | 
					            "type": "java",
 | 
				
			||||||
            "name": "Marinesco DEV",
 | 
					            "name": "Spring Boot-MarinescoApplication<marinesco>",
 | 
				
			||||||
            "request": "launch",
 | 
					            "request": "launch",
 | 
				
			||||||
            "cwd": "${workspaceFolder}",
 | 
					            "cwd": "${workspaceFolder}",
 | 
				
			||||||
            "mainClass": "ru.redrise.marinesco.MarinescoApplication",
 | 
					            "mainClass": "ru.redrise.marinesco.MarinescoApplication",
 | 
				
			||||||
            "projectName": "marinesco",
 | 
					            "projectName": "marinesco",
 | 
				
			||||||
            "args": "",
 | 
					            "args": "",
 | 
				
			||||||
            "envFile": "${workspaceFolder}/.env"
 | 
					            "envFile": "${workspaceFolder}/.env"
 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            "type": "java",
 | 
					 | 
				
			||||||
            "name": "Marinesco PROD",
 | 
					 | 
				
			||||||
            "request": "launch",
 | 
					 | 
				
			||||||
            "cwd": "${workspaceFolder}",
 | 
					 | 
				
			||||||
            "mainClass": "ru.redrise.marinesco.MarinescoApplication",
 | 
					 | 
				
			||||||
            "projectName": "marinesco",
 | 
					 | 
				
			||||||
            "args": "--spring.profiles.active=prod",
 | 
					 | 
				
			||||||
            "envFile": "${workspaceFolder}/.env"
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,5 +0,0 @@
 | 
				
			||||||
### How to
 | 
					 | 
				
			||||||
1. Place `marinesco.jar` to `files/root/`. Rename artifact if needed.
 | 
					 | 
				
			||||||
2. Extract `inpx`-file-containing folder into `files/library/`
 | 
					 | 
				
			||||||
3. Optionally remove `pgadmin` section from `docker-compose.yml` file
 | 
					 | 
				
			||||||
4. Run via `docker compose up`
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,9 +0,0 @@
 | 
				
			||||||
FROM openjdk:21-jdk-slim
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ENV TZ=Europe/Moscow
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
WORKDIR /root
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CMD java -jar marinesco.jar
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,34 +0,0 @@
 | 
				
			||||||
version: '3.1'
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
services:
 | 
					 | 
				
			||||||
    marinesco:
 | 
					 | 
				
			||||||
        build: ./build
 | 
					 | 
				
			||||||
        image: loper:marinesco
 | 
					 | 
				
			||||||
        links:
 | 
					 | 
				
			||||||
            - postgres
 | 
					 | 
				
			||||||
        ports:
 | 
					 | 
				
			||||||
            - 80:8080
 | 
					 | 
				
			||||||
        volumes:
 | 
					 | 
				
			||||||
            - ./files/root:/root
 | 
					 | 
				
			||||||
            - ./files/library:/library
 | 
					 | 
				
			||||||
        environment:
 | 
					 | 
				
			||||||
            - SPRING_PROFILES_ACTIVE=prod
 | 
					 | 
				
			||||||
        logging:
 | 
					 | 
				
			||||||
            driver: syslog
 | 
					 | 
				
			||||||
    postgres:
 | 
					 | 
				
			||||||
        image: postgres
 | 
					 | 
				
			||||||
        volumes:
 | 
					 | 
				
			||||||
            - ./files/postgresql:/var/lib/postgresql
 | 
					 | 
				
			||||||
        environment:
 | 
					 | 
				
			||||||
            - POSTGRES_USER=mari
 | 
					 | 
				
			||||||
            - POSTGRES_PASSWORD=example
 | 
					 | 
				
			||||||
            - POSTGRES_DB=marinesco
 | 
					 | 
				
			||||||
    pgadmin:
 | 
					 | 
				
			||||||
        image: dpage/pgadmin4
 | 
					 | 
				
			||||||
        links:
 | 
					 | 
				
			||||||
            - postgres
 | 
					 | 
				
			||||||
        ports:
 | 
					 | 
				
			||||||
            - 3334:80
 | 
					 | 
				
			||||||
        environment:
 | 
					 | 
				
			||||||
            - PGADMIN_DEFAULT_EMAIL=root@srv.lan
 | 
					 | 
				
			||||||
            - PGADMIN_DEFAULT_PASSWORD=example
 | 
					 | 
				
			||||||
							
								
								
									
										6
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								pom.xml
									
									
									
									
									
								
							| 
						 | 
					@ -80,12 +80,6 @@
 | 
				
			||||||
			<optional>true</optional>
 | 
								<optional>true</optional>
 | 
				
			||||||
		</dependency>
 | 
							</dependency>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
		<dependency>
 | 
					 | 
				
			||||||
			<groupId>org.postgresql</groupId>
 | 
					 | 
				
			||||||
			<artifactId>postgresql</artifactId>
 | 
					 | 
				
			||||||
			<scope>runtime</scope>
 | 
					 | 
				
			||||||
		</dependency>
 | 
					 | 
				
			||||||
	</dependencies>
 | 
						</dependencies>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	<build>
 | 
						<build>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
package ru.redrise.marinesco.library;
 | 
					package ru.redrise.marinesco;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import ru.redrise.marinesco.data.AuthorRepository;
 | 
					import ru.redrise.marinesco.data.AuthorRepository;
 | 
				
			||||||
import ru.redrise.marinesco.data.BookRepository;
 | 
					import ru.redrise.marinesco.data.BookRepository;
 | 
				
			||||||
 | 
					import ru.redrise.marinesco.library.Author;
 | 
				
			||||||
 | 
					import ru.redrise.marinesco.library.Book;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Controller
 | 
					@Controller
 | 
				
			||||||
@RequestMapping("/author")
 | 
					@RequestMapping("/author")
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
package ru.redrise.marinesco.library;
 | 
					package ru.redrise.marinesco;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.springframework.stereotype.Controller;
 | 
					import org.springframework.stereotype.Controller;
 | 
				
			||||||
import org.springframework.ui.Model;
 | 
					import org.springframework.ui.Model;
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.PathVariable;
 | 
				
			||||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
					import org.springframework.web.bind.annotation.RequestMapping;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import ru.redrise.marinesco.data.BookRepository;
 | 
					import ru.redrise.marinesco.data.BookRepository;
 | 
				
			||||||
 | 
					import ru.redrise.marinesco.library.Book;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Controller
 | 
					@Controller
 | 
				
			||||||
@RequestMapping("/book")
 | 
					@RequestMapping("/book")
 | 
				
			||||||
| 
						 | 
					@ -5,12 +5,17 @@ import org.springframework.web.bind.annotation.GetMapping;
 | 
				
			||||||
import org.springframework.web.bind.annotation.ModelAttribute;
 | 
					import org.springframework.web.bind.annotation.ModelAttribute;
 | 
				
			||||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
					import org.springframework.web.bind.annotation.RequestMapping;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Slf4j
 | 
				
			||||||
@Controller
 | 
					@Controller
 | 
				
			||||||
@RequestMapping("/")
 | 
					@RequestMapping("/")
 | 
				
			||||||
public class RootController {
 | 
					public class RootController {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @GetMapping
 | 
					    @GetMapping
 | 
				
			||||||
    public String getPage(@ModelAttribute("search") String text) {
 | 
					    public String getPage(@ModelAttribute("search") String text) {
 | 
				
			||||||
 | 
					        // TODO: SEARCH PAGE + CONTROLLER
 | 
				
			||||||
 | 
					        log.info(text);
 | 
				
			||||||
        return "root";
 | 
					        return "root";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -134,23 +134,22 @@ public class InpxScanner implements Runnable {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void parseInp(File inpxFile) throws Exception {
 | 
					    private void parseInp(File inpxFile) throws Exception {
 | 
				
			||||||
        /*
 | 
					 | 
				
			||||||
        log.warn("REMOVE TEMPORARY SOLUTION - BREAKER");
 | 
					        log.warn("REMOVE TEMPORARY SOLUTION - BREAKER");
 | 
				
			||||||
        log.warn("REMOVE TEMPORARY SOLUTION - BREAKER");
 | 
					        log.warn("REMOVE TEMPORARY SOLUTION - BREAKER");
 | 
				
			||||||
        log.warn("REMOVE TEMPORARY SOLUTION - BREAKER");
 | 
					        log.warn("REMOVE TEMPORARY SOLUTION - BREAKER");
 | 
				
			||||||
        boolean breaker = false;
 | 
					        boolean breaker = false;
 | 
				
			||||||
        */
 | 
					
 | 
				
			||||||
        try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(inpxFile))) {
 | 
					        try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(inpxFile))) {
 | 
				
			||||||
            ZipEntry zipEntry = zipInputStream.getNextEntry();
 | 
					            ZipEntry zipEntry = zipInputStream.getNextEntry();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            while (zipEntry != null) {
 | 
					            while (zipEntry != null) {
 | 
				
			||||||
                if (zipEntry.getName().toLowerCase().endsWith(".inp")) {
 | 
					                if (zipEntry.getName().toLowerCase().endsWith(".inp")) {
 | 
				
			||||||
                    /*
 | 
					                    // *
 | 
				
			||||||
                    if (breaker) {
 | 
					                    if (breaker) {
 | 
				
			||||||
                        zipEntry = zipInputStream.getNextEntry();
 | 
					                        zipEntry = zipInputStream.getNextEntry();
 | 
				
			||||||
                        continue;
 | 
					                        continue;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    breaker = true;
 | 
					                    breaker = true;//
 | 
				
			||||||
                    // */
 | 
					                    // */
 | 
				
			||||||
                    byte[] content = inpToByteArray(zipInputStream, zipEntry.getSize());
 | 
					                    byte[] content = inpToByteArray(zipInputStream, zipEntry.getSize());
 | 
				
			||||||
                    parseInpContent(content, zipEntry.getName());
 | 
					                    parseInpContent(content, zipEntry.getName());
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,21 +0,0 @@
 | 
				
			||||||
spring:
 | 
					 | 
				
			||||||
    thymeleaf:
 | 
					 | 
				
			||||||
        cache: true
 | 
					 | 
				
			||||||
    datasource:
 | 
					 | 
				
			||||||
        driver-class-name: org.postgresql.Driver  
 | 
					 | 
				
			||||||
        url: jdbc:postgresql://postgres:5432/marinesco
 | 
					 | 
				
			||||||
        username: mari
 | 
					 | 
				
			||||||
        password: example
 | 
					 | 
				
			||||||
    jpa:
 | 
					 | 
				
			||||||
        properties:
 | 
					 | 
				
			||||||
            hibernate:
 | 
					 | 
				
			||||||
                database-platform: org.hibernate.dialect.PostgreSQL94Dialect
 | 
					 | 
				
			||||||
        hibernate: 
 | 
					 | 
				
			||||||
            ddl-auto: update
 | 
					 | 
				
			||||||
logging:
 | 
					 | 
				
			||||||
    level:
 | 
					 | 
				
			||||||
        org:
 | 
					 | 
				
			||||||
            springframework: INFO
 | 
					 | 
				
			||||||
marinesco:
 | 
					 | 
				
			||||||
    library:
 | 
					 | 
				
			||||||
        filesLocation: "/library"
 | 
					 | 
				
			||||||
| 
						 | 
					@ -156,11 +156,12 @@ header {
 | 
				
			||||||
	color: #74bfbd;
 | 
						color: #74bfbd;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.header_entry_link:link,
 | 
					.header_entry_link:link {
 | 
				
			||||||
 | 
						color: #74bfbd;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
.header_entry_link:visited {
 | 
					.header_entry_link:visited {
 | 
				
			||||||
	color: #74bfbd;
 | 
						color: #74bfbd;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
.header_entry_link:hover {
 | 
					.header_entry_link:hover {
 | 
				
			||||||
	color: #b6a795;
 | 
						color: #b6a795;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -174,6 +175,10 @@ header {
 | 
				
			||||||
	margin-right: 10px;
 | 
						margin-right: 10px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					a.entry {
 | 
				
			||||||
 | 
						text-decoration: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.header_title {
 | 
					.header_title {
 | 
				
			||||||
	font-size: 1.5em;
 | 
						font-size: 1.5em;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -257,6 +262,9 @@ button:hover {
 | 
				
			||||||
	text-shadow: -1px -1px 0 #1e1e1e, 1px -1px 0 #1e1e1e, -1px 1px 0 #1e1e1e, 1px 1px 0 #1e1e1e;
 | 
						text-shadow: -1px -1px 0 #1e1e1e, 1px -1px 0 #1e1e1e, -1px 1px 0 #1e1e1e, 1px 1px 0 #1e1e1e;
 | 
				
			||||||
	color: #74bfbd;
 | 
						color: #74bfbd;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					.copy_link:hover {
 | 
				
			||||||
 | 
						color: #b6a795;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* error */
 | 
					/* error */
 | 
				
			||||||
.error {
 | 
					.error {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,7 +21,7 @@
 | 
				
			||||||
                    <a th:href="${'/author/' + author.id}" th:text="${author.authorName}"></a>
 | 
					                    <a th:href="${'/author/' + author.id}" th:text="${author.authorName}"></a>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
                <br />
 | 
					                <br />
 | 
				
			||||||
                <span th:each="genre : ${book.genres}" th:text="${((genre.humanReadableDescription == null || genre.humanReadableDescription == '') ? genre.genreId : genre.humanReadableDescription) + '  '}"></span>
 | 
					                <span th:each="genre : ${book.genres}" th:text="${(genre.humanReadableDescription == '' ? genre.genreId : genre.humanReadableDescription) + '  '}"></span>
 | 
				
			||||||
                <p>
 | 
					                <p>
 | 
				
			||||||
                    <a th:href="${'/download/?container=' + book.container + '&file=' + book.fsFileName}" 
 | 
					                    <a th:href="${'/download/?container=' + book.container + '&file=' + book.fsFileName}" 
 | 
				
			||||||
                        th:text="${'Download ' + book.fileExtension + ' (' + book.fileSizeForHumans + ')'}"></a>
 | 
					                        th:text="${'Download ' + book.fileExtension + ' (' + book.fileSizeForHumans + ')'}"></a>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,8 +7,10 @@
 | 
				
			||||||
<body>
 | 
					<body>
 | 
				
			||||||
  <div class="footer" th:fragment="footer">
 | 
					  <div class="footer" th:fragment="footer">
 | 
				
			||||||
    <div class="container">
 | 
					    <div class="container">
 | 
				
			||||||
      <footer class="inner_footer copy_link">
 | 
					      <footer class="inner_footer">
 | 
				
			||||||
        <a class="header_entry_link" href="https://redrise.ru">© 2023-2024 Dmitry Isaenko</a>
 | 
					        <a class="entry" href="https://redrise.ru">
 | 
				
			||||||
 | 
					          <div class="copy_link">© 2023-2024 Dmitry Isaenko</div>
 | 
				
			||||||
 | 
					        </a>
 | 
				
			||||||
      </footer>
 | 
					      </footer>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,9 @@
 | 
				
			||||||
          <div class="block_inner">
 | 
					          <div class="block_inner">
 | 
				
			||||||
            <ul class="ul_right_block">
 | 
					            <ul class="ul_right_block">
 | 
				
			||||||
              <li class="li_header_block">
 | 
					              <li class="li_header_block">
 | 
				
			||||||
                <a class="header_entry header_entry_link" href="/login" th:href="@{/login}">Sign in</a>
 | 
					                <a class="entry" href="/login" th:href="@{/login}">
 | 
				
			||||||
 | 
					                  <span class="header_entry header_entry_link">Sign in</span>
 | 
				
			||||||
 | 
					                </a>
 | 
				
			||||||
              </li>
 | 
					              </li>
 | 
				
			||||||
            </ul>
 | 
					            </ul>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
| 
						 | 
					@ -51,7 +53,9 @@
 | 
				
			||||||
                <span class="header_entry">|</span>
 | 
					                <span class="header_entry">|</span>
 | 
				
			||||||
              </li>
 | 
					              </li>
 | 
				
			||||||
              <li class="li_header_block">
 | 
					              <li class="li_header_block">
 | 
				
			||||||
                <a class="header_entry header_entry_link" href="/logout">Logout</a>
 | 
					                <a class="entry" href="/logout">
 | 
				
			||||||
 | 
					                  <span class="header_entry header_entry_link">Logout</span>
 | 
				
			||||||
 | 
					                </a>
 | 
				
			||||||
                <form style="visibility: hidden" id="form" method="post" action="#" th:action="@{/logout}"></form>
 | 
					                <form style="visibility: hidden" id="form" method="post" action="#" th:action="@{/logout}"></form>
 | 
				
			||||||
              </li>
 | 
					              </li>
 | 
				
			||||||
            </ul>
 | 
					            </ul>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,11 @@
 | 
				
			||||||
    <div class="page">
 | 
					    <div class="page">
 | 
				
			||||||
        <div th:replace="~{fragments/header :: ${#authorization.expression('isAuthenticated()')} ? 'header-auth' : 'header-anon'}"></div>
 | 
					        <div th:replace="~{fragments/header :: ${#authorization.expression('isAuthenticated()')} ? 'header-auth' : 'header-anon'}"></div>
 | 
				
			||||||
        <div class="container base">
 | 
					        <div class="container base">
 | 
				
			||||||
            Welcome
 | 
					            <br /><a href="/book/59992766">/book/59992766</a>
 | 
				
			||||||
 | 
					            <br /><a href="/author/1">/author/1</a>
 | 
				
			||||||
 | 
					            <br /><a href="/h2">H2</a>
 | 
				
			||||||
 | 
					            <br />
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
    <div th:replace="~{fragments/footer :: 'footer'}"></div>
 | 
					    <div th:replace="~{fragments/footer :: 'footer'}"></div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue