chore: init monorepo
This commit is contained in:
+69
@@ -0,0 +1,69 @@
|
||||
# This workflow will build a golang project
|
||||
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go
|
||||
|
||||
name: Go
|
||||
|
||||
on:
|
||||
release:
|
||||
types: created
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build-ubuntu:
|
||||
permissions:
|
||||
contents: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Checkout web repo
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: yetanotherbooklibrary/web
|
||||
path: ./web
|
||||
ssh-key: ${{ secrets.WEB_SSH_KEY }}
|
||||
- name: Set up Go
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: '1.21.6'
|
||||
- name: Setup NodeJS 21.6.2
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: '21.6.2'
|
||||
- name: Build web
|
||||
working-directory: ./web
|
||||
run: |
|
||||
npm ci
|
||||
npm run build
|
||||
- name: Build server for linux
|
||||
run: GOOS=linux go build -v -o ./server-linux .
|
||||
- name: Build server for darwin
|
||||
run: GOOS=darwin go build -v -o ./server-darwin .
|
||||
- name: Build server for windows
|
||||
run: GOOS=windows go build -v -o ./server-windows.exe .
|
||||
- name: upload linux artifact
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: ./server-linux
|
||||
asset_name: server-linux
|
||||
asset_content_type: application/octet-stream
|
||||
- name: upload darwin artifact
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: ./server-darwin
|
||||
asset_name: server-darwin
|
||||
asset_content_type: application/octet-stream
|
||||
- name: upload windows artifact
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: ./server-windows.exe
|
||||
asset_name: server-windows.exe
|
||||
asset_content_type: application/octet-stream
|
||||
@@ -0,0 +1,15 @@
|
||||
*.fb2
|
||||
bench
|
||||
__pycache__
|
||||
*.zip
|
||||
.DS_Store
|
||||
mycl
|
||||
web.code-workspace
|
||||
web
|
||||
.env
|
||||
whitelist_books.txt
|
||||
server
|
||||
keys
|
||||
files
|
||||
*.db
|
||||
yabl-api
|
||||
@@ -0,0 +1,9 @@
|
||||
## .env
|
||||
```
|
||||
POSTGRESQL_SRV=postgres://user:pass@server:5432/YaBL?sslmode=disable
|
||||
BASE_PATH=/path/to/lib
|
||||
BIND_ADDR=0.0.0.0:8080
|
||||
WHITELIST_FILE=whitelist_books.txt
|
||||
```
|
||||
## whitelist
|
||||
run with arg `--authors-whitelist whitelist_authors_file.txt` to generate whitelist file
|
||||
@@ -0,0 +1,11 @@
|
||||
- [ ] добавить поддержку DjVy и epub. возможно pdf, но не первостепенно
|
||||
- [ ] улучшить импортёр книг, возможно сделать динамическую загрузку через web
|
||||
- [ ] экспорт и импорт базы данных
|
||||
- [x] fallback при отсутствии файлов физически (режим ro)
|
||||
|
||||
- [ ] перенести все настройки в .env файл (и в целом использовать env'ы)
|
||||
- [x] убрать этих глупых cleaner'ов (кому это вообще надо было)
|
||||
- [x] настроить github actions на сборки под все платформы
|
||||
- [ ] сделать возможность инкрементальных обновлений
|
||||
- [ ] books smasher
|
||||
- [ ] Написать [README.md](README.md) с полным объяснением, что и для чего и как это всё запустить
|
||||
Executable
+1
@@ -0,0 +1 @@
|
||||
go build --tags=fts5 -ldflags="-s -w" .
|
||||
@@ -0,0 +1,49 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"io"
|
||||
"mi6e4ka/yabl-api/schemas"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func GetAllowIds() []string {
|
||||
white, _ := os.ReadFile(os.Getenv("WHITELIST_FILE"))
|
||||
whitelist := strings.Split(string(white), "\n")
|
||||
return whitelist
|
||||
}
|
||||
|
||||
func BookCensor(bookId string) bool {
|
||||
return true
|
||||
//return slices.Contains(GetAllowIds(), bookId)
|
||||
}
|
||||
|
||||
func GenWhitelist(db *gorm.DB, authorsFilePath string) {
|
||||
os.Remove(os.Getenv("WHITELIST_FILE"))
|
||||
authorsFile, _ := os.Open(authorsFilePath)
|
||||
authorsWLR, _ := io.ReadAll(authorsFile)
|
||||
authorsWL := strings.Split(string(authorsWLR), "\n")
|
||||
whitelist, _ := os.OpenFile(os.Getenv("WHITELIST_FILE"), os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777)
|
||||
for _, allowAuthor := range authorsWL {
|
||||
var author schemas.Author
|
||||
var books []schemas.Book
|
||||
authorId, _ := strconv.ParseInt(allowAuthor, 10, 64)
|
||||
db.Where("id = ?", authorId).First(&author)
|
||||
db.Model(&author).Preload("Language").Preload("Authors").Association("Books").Find(&books)
|
||||
firstLine := true
|
||||
for _, book := range books {
|
||||
if len(book.Authors) != 1 || book.Language.Code != "ru" || book.Isbn == nil {
|
||||
continue
|
||||
}
|
||||
if firstLine {
|
||||
whitelist.WriteString(strconv.FormatUint(book.ID, 10))
|
||||
firstLine = false
|
||||
} else {
|
||||
whitelist.WriteString("\n" + strconv.FormatUint(book.ID, 10))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
raw = []
|
||||
ru = []
|
||||
|
||||
with open("genres_tags.txt", "r") as rawF:
|
||||
raw = rawF.read().split("\n")
|
||||
with open("genres_ru.txt", "r") as ruF:
|
||||
for ruTag in ruF.readlines():
|
||||
tag = ruTag.split(" - ")
|
||||
ru.append({
|
||||
"tag": tag[0],
|
||||
"name": tag[1].replace("\n", "")
|
||||
})
|
||||
with open("genres_coll.txt", "a") as newF:
|
||||
for tag in ru:
|
||||
if tag["tag"] in raw:
|
||||
raw.remove(tag["tag"])
|
||||
newF.write(tag["tag"] + ":" + tag["name"]+ "\n")
|
||||
for tag in raw:
|
||||
newF.write(tag + ":\n")
|
||||
|
||||
# print(raw)
|
||||
@@ -0,0 +1,192 @@
|
||||
sf_history:Альтернативная история
|
||||
sf_action:Боевая фантастика
|
||||
sf_epic:Эпическая фантастика
|
||||
sf_heroic:Героическая фантастика
|
||||
sf_detective:Детективная фантастика
|
||||
sf_cyberpunk:Киберпанк
|
||||
sf_space:Космическая фантастика
|
||||
sf_social:Социально-психологическая фантастика
|
||||
sf_horror:Ужасы и Мистика
|
||||
sf_humor:Юмористическая фантастика
|
||||
sf_fantasy:Фэнтези
|
||||
sf:Научная Фантастика
|
||||
det_classic:Классический детектив
|
||||
det_police:Полицейский детектив
|
||||
det_action:Боевик
|
||||
det_irony:Иронический детектив
|
||||
det_history:Исторический детектив
|
||||
det_espionage:Шпионский детектив
|
||||
det_crime:Криминальный детектив
|
||||
det_political:Политический детектив
|
||||
det_maniac:Маньяки
|
||||
det_hard:Крутой детектив
|
||||
thriller:Триллер
|
||||
detective:Детектив
|
||||
prose_classic:Классическая проза
|
||||
prose_history:Историческая проза
|
||||
prose_contemporary:Современная проза
|
||||
prose_counter:Контркультура
|
||||
prose_rus_classic:Русская классическая проза
|
||||
prose_su_classics:Советская классическая проза
|
||||
love_contemporary:Современные любовные романы
|
||||
love_history:Исторические любовные романы
|
||||
love_detective:Остросюжетные любовные романы
|
||||
love_short:Короткие любовные романы
|
||||
love_erotica:Эротика
|
||||
adv_western:Вестерн
|
||||
adv_history:Исторические приключения
|
||||
adv_indian:Приключения про индейцев
|
||||
adv_maritime:Морские приключения
|
||||
adv_geo:Путешествия и география
|
||||
adv_animal:Природа и животные
|
||||
adventure:Прочие приключения
|
||||
child_tale:Сказка
|
||||
child_verse:Детские стихи
|
||||
child_prose:Детская проза
|
||||
child_sf:Детская фантастика
|
||||
child_det:Детские остросюжетные
|
||||
child_adv:Детские приключения
|
||||
child_education:Детская образовательная литература
|
||||
children:Прочая детская литература
|
||||
poetry:Поэзия
|
||||
dramaturgy:Драматургия
|
||||
antique_ant:Античная литература
|
||||
antique_european:Европейская старинная литература
|
||||
antique_russian:Древнерусская литература
|
||||
antique_east:Древневосточная литература
|
||||
antique_myths:Мифы. Легенды. Эпос
|
||||
antique:Прочая старинная литература
|
||||
sci_history:История
|
||||
sci_psychology:Психология
|
||||
sci_culture:Культурология
|
||||
sci_religion:Религиоведение
|
||||
sci_philosophy:Философия
|
||||
sci_politics:Политика
|
||||
sci_business:Деловая литература
|
||||
sci_juris:Юриспруденция
|
||||
sci_linguistic:Языкознание
|
||||
sci_medicine:Медицина
|
||||
sci_phys:Физика
|
||||
sci_math:Математика
|
||||
sci_chem:Химия
|
||||
sci_biology:Биология
|
||||
sci_tech:Технические науки
|
||||
science:Прочая научная литература
|
||||
comp_www:Интернет
|
||||
comp_programming:Программирование
|
||||
comp_hard:Компьютерное железо
|
||||
comp_soft:Программы
|
||||
comp_db:Базы данных
|
||||
comp_osnet:ОС и Сети
|
||||
computers:Прочая околокомпьютерная литература
|
||||
ref_encyc:Энциклопедии
|
||||
ref_dict:Словари
|
||||
ref_ref:Справочники
|
||||
ref_guide:Руководства
|
||||
reference:Прочая справочная литература
|
||||
nonf_biography:Биографии и Мемуары
|
||||
nonf_publicism:Публицистика
|
||||
nonf_criticism:Критика
|
||||
design:Искусство и Дизайн
|
||||
nonfiction:Прочая документальная литература
|
||||
religion_rel:Религия
|
||||
religion_esoterics:Эзотерика
|
||||
religion_self:Самосовершенствование
|
||||
religion:Прочая религиозная литература
|
||||
humor_anecdote:Анекдоты
|
||||
humor_prose:Юмористическая проза
|
||||
humor_verse:Юмористические стихи
|
||||
humor:Прочий юмор
|
||||
home_cooking:Кулинария
|
||||
home_pets:Домашние животные
|
||||
home_crafts:Хобби и ремесла
|
||||
home_entertain:Развлечения
|
||||
home_health:Здоровье
|
||||
home_garden:Сад и огород
|
||||
home_diy:Сделай сам
|
||||
home_sport:Спорт
|
||||
home_sex:Эротика
|
||||
home:Прочее домоводство
|
||||
accounting:Бухгалтерия
|
||||
aphorism_quote:Афоризмы
|
||||
architecture_book:Архитектура
|
||||
auto_regulations:ПДД
|
||||
banking:Банки
|
||||
beginning_authors:Начинающие авторы
|
||||
cinema_theatre:Кинотеатр
|
||||
city_fantasy:Фэнтези город
|
||||
dragon_fantasy:Фэнтези драконы
|
||||
economics:Экономика
|
||||
essays:Сочинение
|
||||
fantasy_fight:Фэнтези бои
|
||||
foreign_action:Зарубежный боевик
|
||||
foreign_adventure:Зарубежное приключение
|
||||
foreign_antique:Зарубежное античность
|
||||
foreign_business:Зарубежное бизнес
|
||||
foreign_children:Зарубежное детское
|
||||
foreign_comp:Зарубежное компьютерное
|
||||
foreign_contemporary:Зарубежное современное
|
||||
foreign_contemporary_lit:Зарубежное современное
|
||||
foreign_desc:Зарубежное
|
||||
foreign_detective:Зарубежный детектив
|
||||
foreign_dramaturgy:Зарубежная драматургия
|
||||
foreign_edu:Зарубежное образовательное
|
||||
foreign_fantasy:Зарубежное фэнтези
|
||||
foreign_home:Зарубежное домоводство
|
||||
foreign_humor:Зарубежный юмор
|
||||
foreign_language:Иностранные языки
|
||||
foreign_love:Зарубежное о любви
|
||||
foreign_novel:Зарубежная новелла
|
||||
foreign_other:Прочее зарубежное
|
||||
foreign_poetry:Зарубежная поэзия
|
||||
foreign_prose:Зарубежная проза
|
||||
foreign_psychology:Зарубежная психология
|
||||
foreign_publicism:Зарубежная публицистика
|
||||
foreign_religion:Зарубежная религия
|
||||
foreign_sf:Зарубежная фантастика
|
||||
geo_guides:Гео гиды
|
||||
geography_book:Географическая книга
|
||||
global_economy:Глобальная экономика
|
||||
historical_fantasy:Историческое фэнтези
|
||||
humor_fantasy:Юмор фэнтези
|
||||
industries:Промышленность
|
||||
job_hunting:Поиск работы
|
||||
literature_18:Литература 18 века
|
||||
literature_19:Литература 19 века
|
||||
literature_20:Литература 20 века
|
||||
love_fantasy:Любовь фэнтези
|
||||
love_sf:Любовь фантастика
|
||||
magician_book:Волшебная книга
|
||||
management:Менеджмент
|
||||
marketing:Маркетинг
|
||||
military_special:Спецслужбы
|
||||
music_dancing:Музыкальные танцы
|
||||
narrative:Повествование
|
||||
newspapers:Газеты
|
||||
org_behavior:Корпоративная литература
|
||||
paper_work:Делопроизводство
|
||||
pedagogy_book:Педагогика
|
||||
periodic:Журналы, газеты
|
||||
personal_finance:Личные финансы
|
||||
popadanec:Попаданец
|
||||
popular_business:О бизнесе популярно
|
||||
prose_military:Книги о войне
|
||||
psy_alassic:Классики психологии
|
||||
psy_childs:Детская психология
|
||||
psy_generic:Общая психология
|
||||
psy_personal:Личностный рост
|
||||
psy_sex_and_family:Секс и семейная психология
|
||||
psy_social:Социальная психология
|
||||
psy_theraphy:Психотерапия и консультирование
|
||||
real_estate:Недвижимость
|
||||
russian_contemporary:Русское современное
|
||||
russian_fantasy:Русское фэнтези
|
||||
short_story:Короткий рассказ
|
||||
sketch:Очерки
|
||||
small_business:Малый бизнес
|
||||
sociology_book:Книга по социологии
|
||||
stock:Ценные бумаги, инвестиции
|
||||
upbringing_book:Воспитание детей
|
||||
vampire_book:Книги про вампиров
|
||||
visual_arts:Визуальное искусство
|
||||
unrecognised:Нераспознано
|
||||
@@ -0,0 +1,109 @@
|
||||
sf_history - Альтернативная история
|
||||
sf_action - Боевая фантастика
|
||||
sf_epic - Эпическая фантастика
|
||||
sf_heroic - Героическая фантастика
|
||||
sf_detective - Детективная фантастика
|
||||
sf_cyberpunk - Киберпанк
|
||||
sf_space - Космическая фантастика
|
||||
sf_social - Социально-психологическая фантастика
|
||||
sf_horror - Ужасы и Мистика
|
||||
sf_humor - Юмористическая фантастика
|
||||
sf_fantasy - Фэнтези
|
||||
sf - Научная Фантастика
|
||||
det_classic - Классический детектив
|
||||
det_police - Полицейский детектив
|
||||
det_action - Боевик
|
||||
det_irony - Иронический детектив
|
||||
det_history - Исторический детектив
|
||||
det_espionage - Шпионский детектив
|
||||
det_crime - Криминальный детектив
|
||||
det_political - Политический детектив
|
||||
det_maniac - Маньяки
|
||||
det_hard - Крутой детектив
|
||||
thriller - Триллер
|
||||
detective - Детектив
|
||||
prose_classic - Классическая проза
|
||||
prose_history - Историческая проза
|
||||
prose_contemporary - Современная проза
|
||||
prose_counter - Контркультура
|
||||
prose_rus_classic - Русская классическая проза
|
||||
prose_su_classics - Советская классическая проза
|
||||
love_contemporary - Современные любовные романы
|
||||
love_history - Исторические любовные романы
|
||||
love_detective - Остросюжетные любовные романы
|
||||
love_short - Короткие любовные романы
|
||||
love_erotica - Эротика
|
||||
adv_western - Вестерн
|
||||
adv_history - Исторические приключения
|
||||
adv_indian - Приключения про индейцев
|
||||
adv_maritime - Морские приключения
|
||||
adv_geo - Путешествия и география
|
||||
adv_animal - Природа и животные
|
||||
adventure - Прочие приключения
|
||||
child_tale - Сказка
|
||||
child_verse - Детские стихи
|
||||
child_prose - Детская проза
|
||||
child_sf - Детская фантастика
|
||||
child_det - Детские остросюжетные
|
||||
child_adv - Детские приключения
|
||||
child_education - Детская образовательная литература
|
||||
children - Прочая детская литература
|
||||
poetry - Поэзия
|
||||
dramaturgy - Драматургия
|
||||
antique_ant - Античная литература
|
||||
antique_european - Европейская старинная литература
|
||||
antique_russian - Древнерусская литература
|
||||
antique_east - Древневосточная литература
|
||||
antique_myths - Мифы. Легенды. Эпос
|
||||
antique - Прочая старинная литература
|
||||
sci_history - История
|
||||
sci_psychology - Психология
|
||||
sci_culture - Культурология
|
||||
sci_religion - Религиоведение
|
||||
sci_philosophy - Философия
|
||||
sci_politics - Политика
|
||||
sci_business - Деловая литература
|
||||
sci_juris - Юриспруденция
|
||||
sci_linguistic - Языкознание
|
||||
sci_medicine - Медицина
|
||||
sci_phys - Физика
|
||||
sci_math - Математика
|
||||
sci_chem - Химия
|
||||
sci_biology - Биология
|
||||
sci_tech - Технические науки
|
||||
science - Прочая научная литература
|
||||
comp_www - Интернет
|
||||
comp_programming - Программирование
|
||||
comp_hard - Компьютерное железо
|
||||
comp_soft - Программы
|
||||
comp_db - Базы данных
|
||||
comp_osnet - ОС и Сети
|
||||
computers - Прочая околокомпьютерная литература
|
||||
ref_encyc - Энциклопедии
|
||||
ref_dict - Словари
|
||||
ref_ref - Справочники
|
||||
ref_guide - Руководства
|
||||
reference - Прочая справочная литература
|
||||
nonf_biography - Биографии и Мемуары
|
||||
nonf_publicism - Публицистика
|
||||
nonf_criticism - Критика
|
||||
design - Искусство и Дизайн
|
||||
nonfiction - Прочая документальная литература
|
||||
religion_rel - Религия
|
||||
religion_esoterics - Эзотерика
|
||||
religion_self - Самосовершенствование
|
||||
religion - Прочая религиозная литература
|
||||
humor_anecdote - Анекдоты
|
||||
humor_prose - Юмористическая проза
|
||||
humor_verse - Юмористические стихи
|
||||
humor - Прочий юмор
|
||||
home_cooking - Кулинария
|
||||
home_pets - Домашние животные
|
||||
home_crafts - Хобби и ремесла
|
||||
home_entertain - Развлечения
|
||||
home_health - Здоровье
|
||||
home_garden - Сад и огород
|
||||
home_diy - Сделай сам
|
||||
home_sport - Спорт
|
||||
home_sex - Эротика, Секс
|
||||
home - Прочее домоводство
|
||||
@@ -0,0 +1,186 @@
|
||||
accounting
|
||||
adv_animal
|
||||
adv_geo
|
||||
adv_history
|
||||
adv_maritime
|
||||
adv_western
|
||||
adventure
|
||||
antique
|
||||
antique_ant
|
||||
antique_east
|
||||
antique_european
|
||||
antique_myths
|
||||
antique_russian
|
||||
aphorism_quote
|
||||
architecture_book
|
||||
auto_regulations
|
||||
banking
|
||||
beginning_authors
|
||||
child_adv
|
||||
child_det
|
||||
child_education
|
||||
child_prose
|
||||
child_sf
|
||||
child_tale
|
||||
child_verse
|
||||
children
|
||||
cinema_theatre
|
||||
city_fantasy
|
||||
comp_db
|
||||
comp_hard
|
||||
comp_osnet
|
||||
comp_programming
|
||||
comp_soft
|
||||
comp_www
|
||||
computers
|
||||
design
|
||||
det_action
|
||||
det_classic
|
||||
det_crime
|
||||
det_espionage
|
||||
det_hard
|
||||
det_history
|
||||
det_irony
|
||||
det_police
|
||||
det_political
|
||||
detective
|
||||
dragon_fantasy
|
||||
dramaturgy
|
||||
economics
|
||||
essays
|
||||
fantasy_fight
|
||||
foreign_action
|
||||
foreign_adventure
|
||||
foreign_antique
|
||||
foreign_business
|
||||
foreign_children
|
||||
foreign_comp
|
||||
foreign_contemporary
|
||||
foreign_contemporary_lit
|
||||
foreign_desc
|
||||
foreign_detective
|
||||
foreign_dramaturgy
|
||||
foreign_edu
|
||||
foreign_fantasy
|
||||
foreign_home
|
||||
foreign_humor
|
||||
foreign_language
|
||||
foreign_love
|
||||
foreign_novel
|
||||
foreign_other
|
||||
foreign_poetry
|
||||
foreign_prose
|
||||
foreign_psychology
|
||||
foreign_publicism
|
||||
foreign_religion
|
||||
foreign_sf
|
||||
geo_guides
|
||||
geography_book
|
||||
global_economy
|
||||
historical_fantasy
|
||||
home
|
||||
home_cooking
|
||||
home_crafts
|
||||
home_diy
|
||||
home_entertain
|
||||
home_garden
|
||||
home_health
|
||||
home_pets
|
||||
home_sex
|
||||
home_sport
|
||||
humor
|
||||
humor_anecdote
|
||||
humor_fantasy
|
||||
humor_prose
|
||||
humor_verse
|
||||
industries
|
||||
job_hunting
|
||||
literature_18
|
||||
literature_19
|
||||
literature_20
|
||||
love_contemporary
|
||||
love_detective
|
||||
love_erotica
|
||||
love_fantasy
|
||||
love_history
|
||||
love_sf
|
||||
love_short
|
||||
magician_book
|
||||
management
|
||||
marketing
|
||||
military_special
|
||||
music_dancing
|
||||
narrative
|
||||
newspapers
|
||||
nonf_biography
|
||||
nonf_criticism
|
||||
nonf_publicism
|
||||
nonfiction
|
||||
org_behavior
|
||||
paper_work
|
||||
pedagogy_book
|
||||
periodic
|
||||
personal_finance
|
||||
poetry
|
||||
popadanec
|
||||
popular_business
|
||||
prose_classic
|
||||
prose_counter
|
||||
prose_history
|
||||
prose_military
|
||||
prose_rus_classic
|
||||
prose_su_classics
|
||||
psy_alassic
|
||||
psy_childs
|
||||
psy_generic
|
||||
psy_personal
|
||||
psy_sex_and_family
|
||||
psy_social
|
||||
psy_theraphy
|
||||
real_estate
|
||||
ref_dict
|
||||
ref_encyc
|
||||
ref_guide
|
||||
ref_ref
|
||||
reference
|
||||
religion
|
||||
religion_esoterics
|
||||
religion_rel
|
||||
religion_self
|
||||
russian_contemporary
|
||||
russian_fantasy
|
||||
sci_biology
|
||||
sci_chem
|
||||
sci_culture
|
||||
sci_history
|
||||
sci_juris
|
||||
sci_linguistic
|
||||
sci_math
|
||||
sci_medicine
|
||||
sci_philosophy
|
||||
sci_phys
|
||||
sci_politics
|
||||
sci_religion
|
||||
sci_tech
|
||||
science
|
||||
sf
|
||||
sf_action
|
||||
sf_cyberpunk
|
||||
sf_detective
|
||||
sf_fantasy
|
||||
sf_heroic
|
||||
sf_history
|
||||
sf_horror
|
||||
sf_humor
|
||||
sf_social
|
||||
sf_space
|
||||
short_story
|
||||
sketch
|
||||
small_business
|
||||
sociology_book
|
||||
stock
|
||||
thriller
|
||||
upbringing_book
|
||||
vampire_book
|
||||
visual_arts
|
||||
unrecognised
|
||||
@@ -0,0 +1,63 @@
|
||||
module mi6e4ka/yabl-api
|
||||
|
||||
go 1.23.0
|
||||
|
||||
toolchain go1.24.2
|
||||
|
||||
require (
|
||||
github.com/gen2brain/go-fitz v1.24.14
|
||||
github.com/gin-contrib/cors v1.7.5
|
||||
github.com/gin-gonic/gin v1.10.0
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
|
||||
github.com/google/uuid v1.6.0
|
||||
github.com/joho/godotenv v1.5.1
|
||||
golang.org/x/crypto v0.36.0
|
||||
golang.org/x/image v0.23.0
|
||||
golang.org/x/net v0.38.0
|
||||
gorm.io/driver/postgres v1.5.11
|
||||
gorm.io/gorm v1.25.12
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/bytedance/sonic/loader v0.2.4 // indirect
|
||||
github.com/chai2010/webp v1.4.0 // indirect
|
||||
github.com/cloudwego/base64x v0.1.5 // indirect
|
||||
github.com/ebitengine/purego v0.8.0 // indirect
|
||||
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
||||
github.com/jupiterrider/ffi v0.2.0 // indirect
|
||||
github.com/mattn/go-sqlite3 v1.14.24 // indirect
|
||||
golang.org/x/sync v0.12.0 // indirect
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/bytedance/sonic v1.13.2 // indirect
|
||||
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
|
||||
github.com/gin-contrib/sse v1.0.0 // indirect
|
||||
github.com/go-playground/locales v0.14.1 // indirect
|
||||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||
github.com/go-playground/validator/v10 v10.26.0 // indirect
|
||||
github.com/goccy/go-json v0.10.5 // indirect
|
||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
||||
github.com/jackc/pgx/v5 v5.7.2 // indirect
|
||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||
github.com/jinzhu/now v1.1.5 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
|
||||
github.com/kr/text v0.2.0 // indirect
|
||||
github.com/leodido/go-urn v1.4.0 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
|
||||
github.com/rogpeppe/go-internal v1.12.0 // indirect
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||
github.com/ugorji/go/codec v1.2.12 // indirect
|
||||
golang.org/x/arch v0.15.0 // indirect
|
||||
golang.org/x/sys v0.31.0 // indirect
|
||||
golang.org/x/text v0.23.0 // indirect
|
||||
google.golang.org/protobuf v1.36.6 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
gorm.io/driver/sqlite v1.5.7
|
||||
)
|
||||
+136
@@ -0,0 +1,136 @@
|
||||
github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ=
|
||||
github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=
|
||||
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
|
||||
github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=
|
||||
github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
|
||||
github.com/chai2010/webp v1.4.0 h1:6DA2pkkRUPnbOHvvsmGI3He1hBKf/bkRlniAiSGuEko=
|
||||
github.com/chai2010/webp v1.4.0/go.mod h1:0XVwvZWdjjdxpUEIf7b9g9VkHFnInUSYujwqTLEuldU=
|
||||
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
|
||||
github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
|
||||
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/ebitengine/purego v0.8.0 h1:JbqvnEzRvPpxhCJzJJ2y0RbiZ8nyjccVUrSM3q+GvvE=
|
||||
github.com/ebitengine/purego v0.8.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
|
||||
github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
|
||||
github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
|
||||
github.com/gen2brain/go-fitz v1.24.14 h1:09weRkjVtLYNGo7l0J7DyOwBExbwi8SJ9h8YPhw9WEo=
|
||||
github.com/gen2brain/go-fitz v1.24.14/go.mod h1:0KaZeQgASc20Yp5R/pFzyy7SmP01XcoHKNF842U2/S4=
|
||||
github.com/gin-contrib/cors v1.7.5 h1:cXC9SmofOrRg0w9PigwGlHG3ztswH6bqq4vJVXnvYMk=
|
||||
github.com/gin-contrib/cors v1.7.5/go.mod h1:4q3yi7xBEDDWKapjT2o1V7mScKDDr8k+jZ0fSquGoy0=
|
||||
github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E=
|
||||
github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0=
|
||||
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
|
||||
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
|
||||
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
|
||||
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
|
||||
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
|
||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||
github.com/go-playground/validator/v10 v10.26.0 h1:SP05Nqhjcvz81uJaRfEV0YBSSSGMc/iMaVtFbr3Sw2k=
|
||||
github.com/go-playground/validator/v10 v10.26.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
|
||||
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
|
||||
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
|
||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
|
||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
||||
github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI=
|
||||
github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ=
|
||||
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
|
||||
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
|
||||
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/jupiterrider/ffi v0.2.0 h1:tMM70PexgYNmV+WyaYhJgCvQAvtTCs3wXeILPutihnA=
|
||||
github.com/jupiterrider/ffi v0.2.0/go.mod h1:yqYqX5DdEccAsHeMn+6owkoI2llBLySVAF8dwCDZPVs=
|
||||
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
|
||||
github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
|
||||
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
|
||||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
||||
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
|
||||
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
|
||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
|
||||
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
|
||||
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
|
||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
|
||||
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
|
||||
github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
|
||||
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
|
||||
golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw=
|
||||
golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE=
|
||||
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
|
||||
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
|
||||
golang.org/x/image v0.23.0 h1:HseQ7c2OpPKTPVzNjG5fwJsOTCiiwS4QdsYi5XU6H68=
|
||||
golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY=
|
||||
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
|
||||
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
||||
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
|
||||
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
|
||||
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
|
||||
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
||||
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gorm.io/driver/postgres v1.5.11 h1:ubBVAfbKEUld/twyKZ0IYn9rSQh448EdelLYk9Mv314=
|
||||
gorm.io/driver/postgres v1.5.11/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI=
|
||||
gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I=
|
||||
gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4=
|
||||
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
|
||||
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
|
||||
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
|
||||
+2519
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 207 KiB |
@@ -0,0 +1,51 @@
|
||||
package reaper
|
||||
|
||||
type Person struct {
|
||||
FirstName string `xml:"first-name"`
|
||||
MiddleName *string `xml:"middle-name"`
|
||||
LastName *string `xml:"last-name"`
|
||||
}
|
||||
|
||||
type Sequences struct {
|
||||
Name *string `xml:"name,attr"`
|
||||
Number *int `xml:"number,attr"`
|
||||
}
|
||||
|
||||
type FB2Read struct {
|
||||
Title string `xml:"title-info>book-title"`
|
||||
Genres []string `xml:"title-info>genre"`
|
||||
Authors []Person `xml:"title-info>author"`
|
||||
Lang string `xml:"title-info>lang"`
|
||||
SrcLang *string `xml:"title-info>src-lang"`
|
||||
Translators *[]Person `xml:"title-info>translator"`
|
||||
Sequence Sequences `xml:"title-info>sequence"`
|
||||
Year *int `xml:"publish-info>year"`
|
||||
ISBN *string `xml:"publish-info>isbn"`
|
||||
Publisher *string `xml:"publish-info>publisher"`
|
||||
Cover struct {
|
||||
Id *string `xml:"href,attr"`
|
||||
} `xml:"title-info>coverpage>image"`
|
||||
Annotation struct {
|
||||
Html string `xml:",innerxml"`
|
||||
} `xml:"title-info>annotation"`
|
||||
}
|
||||
|
||||
type FB2 struct {
|
||||
SrcFile string
|
||||
Bookcase *string
|
||||
Title string
|
||||
Genres []string
|
||||
Authors []Person
|
||||
HasCover bool
|
||||
Lang string
|
||||
SrcLang *string
|
||||
Translators *[]Person
|
||||
Sequence Sequences
|
||||
Year *int
|
||||
ISBN *string
|
||||
Publisher *string
|
||||
Annotation *string
|
||||
SymbolsCount int
|
||||
Size uint64
|
||||
Hash *string
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
package reaper
|
||||
|
||||
import (
|
||||
"encoding/xml"
|
||||
"io"
|
||||
"mi6e4ka/yabl-api/schemas"
|
||||
|
||||
"golang.org/x/net/html/charset"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func Parse(filereader io.Reader) *FB2Read {
|
||||
// legacy, but normal algo
|
||||
bookXML := new(FB2Read)
|
||||
decoder := xml.NewDecoder(filereader)
|
||||
decoder.CharsetReader = charset.NewReaderLabel
|
||||
|
||||
for t, _ := decoder.Token(); t != nil; t, _ = decoder.Token() {
|
||||
if se, ok := t.(xml.StartElement); ok {
|
||||
if se.Name.Local == "description" {
|
||||
decoder.DecodeElement(&bookXML, &se)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if bookXML.Title == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
return bookXML
|
||||
}
|
||||
|
||||
func RawToFB2(
|
||||
reaped FB2Read,
|
||||
filename string,
|
||||
bookcase *string,
|
||||
size uint64,
|
||||
hash *string,
|
||||
) FB2 {
|
||||
return FB2{
|
||||
SrcFile: filename,
|
||||
Bookcase: bookcase,
|
||||
Title: reaped.Title,
|
||||
Genres: reaped.Genres,
|
||||
Authors: reaped.Authors,
|
||||
HasCover: reaped.Cover.Id != nil,
|
||||
Lang: reaped.Lang,
|
||||
SrcLang: reaped.SrcLang,
|
||||
Translators: reaped.Translators,
|
||||
Sequence: reaped.Sequence,
|
||||
Year: reaped.Year,
|
||||
ISBN: reaped.ISBN,
|
||||
Publisher: reaped.Publisher,
|
||||
Annotation: &reaped.Annotation.Html,
|
||||
SymbolsCount: 0,
|
||||
Size: size,
|
||||
Hash: hash,
|
||||
}
|
||||
}
|
||||
|
||||
// omg legacy here ->
|
||||
func nilCheck(nilString *string) string {
|
||||
if nilString == nil {
|
||||
return ""
|
||||
}
|
||||
return *nilString
|
||||
}
|
||||
|
||||
func FB2toDB(tx *gorm.DB, book FB2) uint64 {
|
||||
var genres *[]schemas.Genre
|
||||
//book.Genres = nil
|
||||
if book.Genres != nil {
|
||||
var genresNN []schemas.Genre
|
||||
for _, genre := range book.Genres {
|
||||
genresNN = append(genresNN, schemas.Genre{
|
||||
RawTag: genre,
|
||||
})
|
||||
}
|
||||
genres = &genresNN
|
||||
}
|
||||
var authors []schemas.Author
|
||||
for _, author := range book.Authors {
|
||||
var dbAuthor schemas.Author
|
||||
tx.FirstOrCreate(&dbAuthor, schemas.Author{
|
||||
Key: author.FirstName + nilCheck(author.MiddleName) + nilCheck(author.LastName),
|
||||
FirstName: author.FirstName,
|
||||
MiddleName: author.MiddleName,
|
||||
LastName: author.LastName,
|
||||
})
|
||||
authors = append(authors, dbAuthor)
|
||||
}
|
||||
var translators []schemas.Translator
|
||||
if book.Translators != nil {
|
||||
for _, translator := range *book.Translators {
|
||||
var dbTranslator schemas.Translator
|
||||
tx.FirstOrCreate(&dbTranslator, schemas.Translator{
|
||||
Key: translator.FirstName + nilCheck(translator.MiddleName) + nilCheck(translator.LastName),
|
||||
FirstName: translator.FirstName,
|
||||
MiddleName: translator.MiddleName,
|
||||
LastName: translator.LastName,
|
||||
})
|
||||
translators = append(translators, dbTranslator)
|
||||
}
|
||||
}
|
||||
var sequence *schemas.Sequence
|
||||
if book.Sequence.Name != nil {
|
||||
sequence = &schemas.Sequence{
|
||||
Name: *book.Sequence.Name,
|
||||
}
|
||||
}
|
||||
var publisher *schemas.Publisher
|
||||
if book.Publisher != nil {
|
||||
publisher = &schemas.Publisher{
|
||||
Name: *book.Publisher,
|
||||
}
|
||||
}
|
||||
// var filetype schemas.Filetype
|
||||
// tx.FirstOrCreate(&filetype, schemas.Filetype{
|
||||
// Filetype: "fb2",
|
||||
// Name: "FB2",
|
||||
// })
|
||||
//fmt.Println(book.Lang)
|
||||
dbBook := schemas.Book{
|
||||
Title: book.Title,
|
||||
Authors: authors,
|
||||
Language: schemas.Language{
|
||||
Code: book.Lang,
|
||||
},
|
||||
Genre: genres,
|
||||
Description: book.Annotation,
|
||||
HasCover: book.HasCover,
|
||||
SequenceID: sequence,
|
||||
SequenceBook: book.Sequence.Number,
|
||||
IsTranslated: book.Translators != nil,
|
||||
Translators: &translators,
|
||||
SrcLanguage: schemas.Language{
|
||||
Code: book.Lang,
|
||||
},
|
||||
Year: book.Year,
|
||||
Isbn: book.ISBN,
|
||||
PublisherID: publisher,
|
||||
SymbolsCount: &book.SymbolsCount,
|
||||
Size: int(book.Size),
|
||||
Hash: book.Hash,
|
||||
Bookcase: book.Bookcase,
|
||||
Filename: book.SrcFile,
|
||||
Filetype: "fb2",
|
||||
}
|
||||
tx.Create(&dbBook)
|
||||
return dbBook.ID
|
||||
}
|
||||
@@ -0,0 +1,168 @@
|
||||
package schemas
|
||||
|
||||
import "time"
|
||||
|
||||
type Language struct {
|
||||
ID uint `gorm:",unique;autoIncrement:true"`
|
||||
Code string `gorm:"primaryKey;index:,unique"`
|
||||
ISO *string
|
||||
}
|
||||
|
||||
type Genre struct {
|
||||
ID uint `gorm:",unique;autoIncrement:true"`
|
||||
RawTag string `gorm:"index:,unique"`
|
||||
Tag *string
|
||||
Name *string
|
||||
}
|
||||
|
||||
type Author struct {
|
||||
ID uint `gorm:"primaryKey;index:,unique;autoIncrement:true"`
|
||||
Key string `gorm:",unique"`
|
||||
FirstName string
|
||||
MiddleName *string
|
||||
LastName *string
|
||||
IsBanned *bool
|
||||
BanReason *string
|
||||
Books []Book `gorm:"many2many:BookAuthor"`
|
||||
}
|
||||
|
||||
type User struct {
|
||||
ID uint `gorm:"primaryKey"`
|
||||
Username string `gorm:"autoIncrement:false;index:,unique"`
|
||||
Avatar *string
|
||||
Name *string
|
||||
Admin bool
|
||||
Lang *string
|
||||
Language *Language `gorm:"foreignKey:Lang"`
|
||||
LastSeen time.Time
|
||||
Created time.Time
|
||||
Password string
|
||||
OTPToken *string
|
||||
//Favorites []Book `gorm:"many2many:FavoriteBook;ForeignKey:username"`
|
||||
BookShelf []ReaderBook
|
||||
}
|
||||
|
||||
type Translator struct {
|
||||
ID uint `gorm:"primaryKey;index:,unique;autoIncrement:true"`
|
||||
Key string `gorm:",unique"`
|
||||
FirstName string
|
||||
MiddleName *string
|
||||
LastName *string
|
||||
}
|
||||
|
||||
type Sequence struct {
|
||||
ID uint `gorm:",unique;autoIncrement:true"`
|
||||
Name string `gorm:"primaryKey;index:,unique"`
|
||||
}
|
||||
|
||||
type Publisher struct {
|
||||
ID uint `gorm:",unique;autoIncrement:true"`
|
||||
Name string `gorm:"primaryKey;index:,unique"`
|
||||
}
|
||||
|
||||
type Book struct {
|
||||
ID uint64 `gorm:"primaryKey"`
|
||||
Title string
|
||||
Authors []Author `gorm:"many2many:BookAuthor;References:ID"`
|
||||
Lang *string
|
||||
Language Language `gorm:"foreignKey:Lang"`
|
||||
Genre *[]Genre `gorm:"many2many:BookGenre;References:RawTag"`
|
||||
Description *string `gorm:"type:text"`
|
||||
HasCover bool
|
||||
IsTranslated bool
|
||||
Translators *[]Translator `gorm:"many2many:BookTranslator;References:ID"`
|
||||
SrcLang *string
|
||||
SrcLanguage Language `gorm:"foreignKey:SrcLang"`
|
||||
Sequence *string
|
||||
SequenceID *Sequence `gorm:"foreignKey:Sequence"`
|
||||
SequenceBook *int
|
||||
Year *int
|
||||
Publisher *string
|
||||
PublisherID *Publisher `gorm:"foreignKey:Publisher"`
|
||||
Isbn *string
|
||||
Downloads int `gorm:"default:0"`
|
||||
Views int `gorm:"default:0"`
|
||||
SymbolsCount *int
|
||||
PagesCount *int // pdf
|
||||
Size int
|
||||
Hash *string
|
||||
Bookcase *string
|
||||
Filename string
|
||||
// FiletypeID uint
|
||||
Filetype string
|
||||
UploadedByID *uint
|
||||
UploadedBy *User
|
||||
UploadedAt *time.Time
|
||||
Collections []Collection `gorm:"many2many:CollectionBook;"`
|
||||
ExternalCover *string
|
||||
}
|
||||
|
||||
// type Filetype struct {
|
||||
// ID uint `gorm:"primaryKey"`
|
||||
// Filetype string `gorm:"uniqueIndex"`
|
||||
// Name string
|
||||
// }
|
||||
type ReaderBook struct {
|
||||
ID uint `gorm:"primaryKey"`
|
||||
UserID uint
|
||||
BookID uint
|
||||
Book Book `gorm:"foreignKey:BookID"`
|
||||
Progress float64
|
||||
LastRead time.Time
|
||||
}
|
||||
type Collection struct {
|
||||
ID uint `gorm:"primaryKey"`
|
||||
Link string `gorm:"uniqueIndex"`
|
||||
Name string
|
||||
UserID uint
|
||||
Creator User `gorm:"foreignKey:UserID"`
|
||||
Books []Book `gorm:"many2many:CollectionBook;"`
|
||||
Created time.Time
|
||||
Modified time.Time
|
||||
}
|
||||
|
||||
type Share struct {
|
||||
ID uint `gorm:"primaryKey"`
|
||||
Token string `gorm:"uniqueIndex"`
|
||||
CreatedAt time.Time
|
||||
ExpiredAt *time.Time
|
||||
BookID *uint
|
||||
Book *Book
|
||||
UserID uint
|
||||
User User
|
||||
}
|
||||
type Permission struct {
|
||||
ID uint `gorm:"primaryKey"`
|
||||
User User `gorm:"foreignKey:ID"`
|
||||
EditBooks []Book `gorm:"many2many:EditableBook;"`
|
||||
BooksWhitelist *[]Book `gorm:"many2many:WhitelistedBook;"`
|
||||
EditCollections []Collection `gorm:"many2many:EditCollection;"`
|
||||
ViewCollections []Collection `gorm:"many2many:ViewCollection;"`
|
||||
CanShare bool
|
||||
CanSearch bool
|
||||
CanUpload bool
|
||||
CanCreateCollections bool
|
||||
}
|
||||
type Settings struct {
|
||||
LibPath string
|
||||
ReadOnly bool
|
||||
MultiUsers bool
|
||||
}
|
||||
|
||||
// таблицы индексы FTS5
|
||||
type BooksIndex struct {
|
||||
RowId uint64 `gorm:"column:rowid"`
|
||||
Title string
|
||||
}
|
||||
type AuthorsIndex struct {
|
||||
RowId uint64 `gorm:"column:rowid"`
|
||||
Key string
|
||||
}
|
||||
type TagsIndex struct {
|
||||
RowId uint64 `gorm:"column:rowid"`
|
||||
Name string
|
||||
}
|
||||
type SequencesIndex struct {
|
||||
RowId uint64 `gorm:"column:rowid"`
|
||||
Name string
|
||||
}
|
||||
Reference in New Issue
Block a user