chore: init monorepo

This commit is contained in:
2025-06-21 12:42:09 +03:00
commit 1874ae3ac1
103 changed files with 23946 additions and 0 deletions
+69
View File
@@ -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
+15
View File
@@ -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
+9
View File
@@ -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
+11
View 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) с полным объяснением, что и для чего и как это всё запустить
+1
View File
@@ -0,0 +1 @@
go build --tags=fts5 -ldflags="-s -w" .
+49
View File
@@ -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.
+21
View File
@@ -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)
View File
+192
View File
@@ -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:Нераспознано
+109
View File
@@ -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 - Прочее домоводство
+186
View File
@@ -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
+63
View File
@@ -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
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 207 KiB

+51
View File
@@ -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
}
+151
View File
@@ -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
}
+168
View File
@@ -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
}