Add ability to load genres associations from file

This commit is contained in:
Dmitry Isaenko 2024-01-20 16:29:53 +03:00
parent d4f7d860f7
commit 223fe0c4fb
6 changed files with 659 additions and 6 deletions

574
genres_to_upload.txt Normal file
View file

@ -0,0 +1,574 @@
about_musicians:::О музыкантах и композиторах
accounting:::Бухучет и аудит
addition:::Дополнительные материалы к книге
adv_all:::Приключения
adv_animal:::Природа и животные
adv_geo:::Путешествия и география
adv_history:::Исторические приключения
adv_indian:::Приключения про индейцев
adv_maritime:::Морские приключения
adv_military:::Военные приключения
adv_modern:::Приключения в современном мире
adv_rus:::Русская приключенческая литература
adv_story:::Авантюрный роман
adv_su:::Советская приключенческая литература
adv_western:::Вестерн
adventure:::Приключения
adventure_fantasy:::Приключенческое фэнтези
age_all:::Литература по возрасту
age_elementary:::Для начальной школы 6+
age_high:::Для старшего школьного возраста 16+
ages_all:::Литература по эпохам
ant_all:::Старинное
antique:::Старинная литература
antique_ant:::Античная литература
antique_east:::Древневосточная литература
antique_european:::Древнеевропейская литература
antique_myths:::Мифы. Легенды. Эпос
antique_russian:::Древнерусская литература
aphorisms:::Афоризмы и цитаты
architecture_book:::Архитектура и скульптура
art_all:::Культура и искусство
art_criticism:::Искусствоведение
art_dance:::Танцы и хореография
art_history:::История искусства
art_world_culture:::Мировая художественная культура
article:::Статья
astrology:::Астрология
atheism:::Атеизм
audiobook:::Аудиокнига
auto_business:::Автостроение, автодело, тракторная техника
auto_regulations:::Авто-, мото- и велотранспорт, ПДД
autor_collection:::Авторские сборники, собрания сочинений
banking:::Банковское дело
banking_all:::Деловая литература
beginning_authors:::Начинающие авторы
bestseller:::Бестселлеры
biolog_all:::Науки о живой природе
cats:::Кошки
child_adv:::Детские приключения
child_all:::Детская литература
child_baby:::Для самых маленьких 0+
child_classical:::Классическая детская литература
child_det:::Детские остросюжетные
child_education:::Детская образовательная литература
child_fantasy:::Детское фэнтези
child_folklore:::Детский фольклор
child_horror:::Детские ужастики
child_prose:::Детская проза
child_rus:::Русская детская литература
child_sf:::Детская фантастика
child_su:::Советская детская литература
child_tale:::Сказки для детей
child_tale_rus:::Русские сказки для детей
child_verse:::Детские стихи
children:::Детская литература: прочее
cine:::Кино
collection:::Сборники, альманахи, антологии
coloring:::Раскраски, прописи
comedy:::Комедия
comics:::Комикс, Манга
comp_all:::Компьютеры и Интернет
comp_cobol:::Cobol
comp_db:::Базы данных
comp_db_exp:::Базы знаний и экспертные системы
comp_design:::Графика. Дизайн. Мультимедиа
comp_dsp:::Цифровая обработка сигналов
comp_dv_ai:::Искусственный интеллект
comp_game:::Игровые приставки и автоматы
comp_hacking:::Хакерство
comp_hard:::Аппаратное обеспечение, компьютерное железо
comp_history:::История информатики и вычислительной техники
comp_os:::Прочие ОС
comp_os_admin:::ОС: администрирование, мониторинг, диагностика
comp_os_android:::Android
comp_os_linux:::Linux
comp_os_macos:::MacOS
comp_os_msdos:::MS-DOS, FreeDOS
comp_os_os2:::OS/2
comp_os_theory:::ОС: теоретические вопросы
comp_os_unix:::Unix
comp_os_windows:::Windows
comp_osnet:::Сети
comp_prog_ada:::Ada
comp_prog_assembler:::Assembler
comp_prog_basic:::Basic, Visual Basic, VB Script, VBA и т.п.
comp_prog_c:::C, C++, C#
comp_prog_dotnet:::.NET Framework
comp_prog_forth:::Forth
comp_prog_fortran:::Fortran
comp_prog_golang:::Go (golang)
comp_prog_java:::Java, Java Script
comp_prog_lisp:::Lisp, Scheme
comp_prog_mfc:::MFC
comp_prog_oberon:::Modula-2, Modula-3, Oberon, Oberon-2, Component Pascal
comp_prog_pascal:::Pascal, Delphi, Lazarus и т.п.
comp_prog_perl:::Perl
comp_prog_php:::PHP
comp_prog_prolog:::Prolog
comp_prog_python:::Python
comp_prog_qt:::Qt
comp_prog_ror:::Ruby
comp_prog_rust:::Rust
comp_prog_scratch:::Scratch, Snap!, Slash, Panther и т.п.
comp_prog_winapi:::Windows API
comp_programming:::Другие языки и системы программирования
comp_security:::Компьютерная безопасность
comp_soft:::Программы
comp_soft_cad:::САПР
comp_soft_dev:::Программирование: прочее
comp_soft_dev_alg:::Алгоритмы и структуры данных
comp_soft_dev_craking:::Крэкинг и реверсинжиниринг
comp_soft_dev_debug:::Отладка, тестирование и оптимизация ПО
comp_soft_dev_games:::Программирование игр
comp_soft_dev_graphic:::Программирование графики
comp_soft_dev_man:::Менеджмент ПО
comp_soft_dev_oop:::Объектно-ориентированное программирование
comp_soft_dev_parallel:::Параллельное и распределенное программирование
comp_soft_dev_system:::Системное программирование
comp_soft_office:::Офисные приложения
comp_www:::Интернет
comp_www_design:::Web-дизайн
compilation:::Компиляции
computers:::Околокомпьютерная литература
crossover:::Кроссовер
design:::Искусство и Дизайн
det_action:::Боевик
det_all:::Детективы и Триллеры
det_classic:::Классический детектив
det_cozy:::Дамский детективный роман
det_crime:::Криминальный детектив
det_espionage:::Шпионский детектив
det_hard:::Крутой детектив
det_history:::Исторический детектив
det_irony:::Иронический детектив
det_maniac:::Маньяки
det_police:::Полицейский детектив
det_political:::Политический детектив
det_rus:::Российский детектив
det_su:::Советский детектив
detective:::Детектив
diafilm:::Диафильм
diaries:::Записки, дневники
dissident:::Антисоветская литература
dogs:::Собаки
dragon_fantasy:::О драконах
drama:::Драма
drama_all:::Драматургия
drama_antique:::Античная драма
dramaturgy:::Драматургия
dramaturgy_for_classic:::Зарубежная классическая драматургия
dramaturgy_rus:::Русская современная драматургия
dramaturgy_rus_classic:::Русская классическая драматургия
dramaturgy_su:::Советская драматургия
dystopian:::Антиутопия
economics_ref:::Справочная деловая литература
epic:::Былины
epic_all:::Фольклор
epic_poetry:::Эпическая поэзия
epistolary_fiction:::Эпистолярная проза
equ_history:::История техники
erotic_fantasy:::Эротическое фэнтези
essay:::Эссе, очерк, этюд, набросок
ex_su_publication:::Современные издания стран бывшего СССР
experimental_poetry:::Экспериментальная поэзия
extravaganza:::Феерия
fable:::Басни
fairy_fantasy:::Сказочная фантастика
family:::Семейные отношения
fan_translation:::Любительские переводы
fanfiction:::Фанфик
fantasy_all:::Фэнтези
fantasy_dark:::Темное фэнтези
fantasy_epic:::Эпическое фэнтези
fantasy_fight:::Боевое фэнтези
fantasy_heroic:::Героическое фэнтези
fantasy_rus:::Российское фэнтези
fantasy_wuxia:::Уся
fashion_style:::Мода и стиль
folk_songs:::Народные песни
folk_tale:::Народные сказки
folk_traditions:::Народные приметы, обряды, традиции
folklore:::Фольклор: прочее
folklore_rus:::Русский фольклор
foreign_adventure:::Зарубежная приключенческая литература
foreign_antique:::Литература V-XIII веков (эпоха Средневековья)
foreign_children:::Зарубежная литература для детей
foreign_contemporary:::Зарубежная современная проза
foreign_detective:::Зарубежный детектив
foreign_dramaturgy:::Зарубежная современная драматургия
foreign_fantasy:::Зарубежное фэнтези
foreign_language:::Иностранные языки
foreign_love:::Зарубежная литература о любви
foreign_prose:::Зарубежная классическая проза
foreign_publication:::Современные зарубежные издания
foreign_sf:::Зарубежная фантастика
foreign_su_publication:::Зарубежные издания советского периода
formp_all:::Формы произведений
fragment:::Отрывок, ознакомительный фрагмент
geo_guides:::Путеводители
global_economy:::Внешняя торговля
gothic_novel:::Готический роман
great_story:::Повесть
historical_fantasy:::Историческое фэнтези
history_africa:::История Африки
history_all:::История и археология
history_america:::История Америки
history_asia:::История Азии
history_australia:::История Австралии и Океании
history_europe:::История Европы
history_russia:::История России и СССР
history_world:::Мировая история
hobbies_all:::Хобби и ремесла
home:::Дом и семья: прочее
home_all:::Домоводство (Дом и семья)
home_aquarium:::Аквариумистика
home_beauty:::Красота
home_beekeeping:::Пчеловодство
home_bookmaking:::Книгоделие
home_building:::Индивидуальное строительство и ремонт
home_child:::Дети. Книги для родителей
home_collecting:::Коллекционирование
home_cooking:::Кулинария
home_crafts:::Хобби и ремесла: прочее
home_diy:::Сделай сам
home_entertain:::Игры и развлечения
home_fishing:::Рыболовство и рыбоводство
home_floriculture:::Цветоводство и комнатное садоводство
home_furniture:::Изготовление и ремонт мебели
home_garden:::Сад и огород
home_handiwork:::Рукоделие
home_health:::Здоровье
home_housekeeping:::Домоводство
home_hunt:::Охота и охотоведение
home_inventory:::Инвентарь, инструменты
home_livestock:::Животноводство и птицеводство
home_marine:::Морское дело, парусный спорт
home_metalwork:::Работа по металлу
home_modelling:::Моделизм и диорамостроение
home_mountain:::Альпинизм и скалолазание
home_mushrooms:::Сбор и выращивание грибов
home_pets:::Домашние животные
home_sex:::Эротика, Секс
home_speedreading:::Скорочтение
home_sport:::Физкультура и спорт
home_survival:::Выживание и личная безопасность
home_tourism:::Туризм
home_winemaking:::Виноделие, спиртные напитки
home_woodwork:::Работа по дереву
home_writing_art:::Писательское искусство
hronoopera:::Хроноопера
humor:::Юмор: прочее
humor_all:::Юмор
humor_anecdote:::Анекдоты
humor_fantasy:::Юмористическое фэнтези
humor_parody:::Пародии, шаржи, эпиграммы, карикатуры
humor_prose:::Юмористическая проза
humor_satire:::Сатира
humor_tales:::Байки
humor_verse:::Юмористические стихи
in_prose:::В прозе
in_reduction:::В сокращении
in_retelling:::В пересказе, в лит. обработке
in_verse:::в стихах
industries:::Отраслевые издания
interview:::Беседы и интервью
invalid:::Для людей с ограниченными возможностями
job_hunting:::Поиск работы, карьера
letters:::Письма, переписки
limerick:::Частушки, прибаутки, потешки
literary_fairy_tale:::Литературные сказки
literature_16:::Литература XIV-XVI веков (эпоха Возрождения)
literature_18:::Литература XVII-XVIII веков (эпоха Просвещения)
literature_19:::Литература ХIX века (эпоха Промышленной революции)
literature_20:::Литература ХX века (эпоха Социальных революций)
literature_21:::Литература ХXI века (эпоха Глобализации экономики)
literature_4:::Литература IV века и ранее (эпоха Древнего мира)
local_lore_study:::Краеведение
love:::О любви
love_all:::Любовные романы
love_contemporary:::Современные любовные романы
love_detective:::Остросюжетные любовные романы
love_erotica:::Эротика
love_fantasy:::Любовное фэнтези
love_history:::Исторические любовные романы
love_rus:::Русская литература о любви
love_sf:::Любовная фантастика
love_short:::Короткие любовные романы
love_su:::Советская литература о любви
lyrics:::Лирика
magician_book:::Магическое фэнтези
management:::Управление, подбор персонала
marketing:::Маркетинг, PR, реклама
military:::Военное дело
military_all:::Военное дело
military_arts:::Боевые искусства
military_history:::Военная история
military_memoirs:::Военные мемуары
military_special:::Спецслужбы
military_weapon:::Военная техника и вооружение
modern_tale:::Современная сказка
music:::Музыкальная литература: прочее
music_all:::Музыкальное искусство
music_conducting:::Дирижирование
music_history:::История музыки
music_instrumental:::Инструментальное искусство
music_theory:::Теория музыки
music_vocal:::Вокальное и хоровое искусство
musicology:::Музыковедение и этномузыковедение
mystery:::Мистерия
naturalist_notes:::Заметки натуралиста
network_literature:::Самиздат, сетевая литература
nonf_all:::Документальная литература
nonf_biography:::Биографии и Мемуары
nonf_criticism:::Критика
nonf_military:::Военная документалистика и аналитика
nonf_publicism:::Публицистика
nonfiction:::Документальная литература
notes:::Нотная литература: прочее
notes_accordion:::Для баяна и аккордеона
notes_all:::Музыка: нотная литература
notes_brass:::Для духовых инструментов
notes_clavier:::Для клавира
notes_ensemble:::Для инструментальных ансамблей
notes_handbook:::Музыкальные справочники, пособия, самоучители, школы игры
notes_harmonica:::Для гармоник
notes_keyboard:::Для клавишных инструментов
notes_orchestra:::Партитуры для оркестра
notes_percussion:::Для ударных инструментов, перкуссии, идиофонов
notes_religious:::Религиозная музыка и песнопения
notes_songbook:::Песенники
notes_string_bowed:::Для струнно-смычковых инструментов
notes_string_plucked:::Для струнно-щипковых инструментов
notes_vocal:::Вокальная, оперная и хоровая музыка
novelization:::Новеллизации
nsf:::Ненаучная фантастика
old_foreign_publication:::Дореволюционные зарубежные издания
old_rus_publication:::Дореволюционные российские издания
org_behavior:::Корпоративная культура
os_all:::Компьютеры: Операционные системы
other:::Неотсортированное
other_all:::Прочее
outdated:::Устаревшие материалы
painting:::Живопись, альбомы, иллюстрированные каталоги
palindromes:::Палиндромы
palmistry:::Хиромантия
paper_work:::Делопроизводство
periodic:::Газеты и журналы
personal_finance:::Личные финансы
poem:::Поэма
poetry:::Поэзия
poetry_all:::Поэзия
poetry_classical:::Классическая поэзия
poetry_east:::Поэзия Востока
poetry_for_classical:::Классическая зарубежная поэзия
poetry_for_modern:::Современная зарубежная поэзия
poetry_military:::Стихи о войне
poetry_modern:::Современная поэзия
poetry_rus_classical:::Классическая русская поэзия
poetry_rus_modern:::Современная русская поэзия
poetry_su:::Советская поэзия
popadanec:::Попаданцы
popular_business:::О бизнесе популярно
postcards:::Наборы открыток, календари
presentation:::Презентация
prog_lang_all:::Компьютеры: Языки и системы программирования
programming_all:::Компьютеры: Разработка ПО
prose:::Проза
prose_abs:::Фантасмагория, абсурдистская проза
prose_all:::Проза
prose_classic:::Классическая проза
prose_contemporary:::Современная проза
prose_counter:::Контркультура
prose_epic:::Эпопея
prose_game:::Книга-игра
prose_history:::Историческая проза
prose_magic:::Магический реализм
prose_military:::Военная проза
prose_neformatny:::Экспериментальная, неформатная проза
prose_rus_classic:::Русская классическая проза
prose_sentimental:::Сентиментальная проза
prose_su_classics:::Советская проза
proverbs:::Пословицы, поговорки
psy_childs:::Детская психология
psy_sex_and_family:::Секс и семейная психология
psy_theraphy:::Психотерапия и консультирование
psycho_all:::Психология и психиатрия
pub_all:::Литература по изданиям
publishing:::Библиотечное и редакционно-издательское дело
radio_tv:::Радио и телевидение
rarity:::Раритетные издания
real_estate:::Недвижимость
ref_all:::Справочная литература
ref_dict:::Словари
ref_encyc:::Энциклопедии
ref_guide:::Руководства
ref_ref:::Справочники
ref_self_tutor:::Самоучители
reference:::Справочная литература: прочее
rel_all:::Религия и духовность
religion:::Религия и духовность: прочее
religion_budda:::Буддизм
religion_catholicism:::Католицизм
religion_christianity:::Христианство
religion_esoterics:::Эзотерика, мистицизм, оккультизм
religion_hinduism:::Индуизм
religion_islam:::Ислам
religion_judaism:::Иудаизм
religion_orthodoxy:::Православие
religion_paganism:::Язычество
religion_protestantism:::Протестантизм
religion_rel:::Религия
religion_self:::Самосовершенствование
riddles:::Загадки
roman:::Роман
rus_publication:::Современные российские издания
russian_contemporary:::Русская современная проза
russian_fantasy:::Славянское фэнтези
sagas:::Семейный роман/Семейная сага
scenarios:::Сценарии
sci_abstract:::Статьи и рефераты
sci_aerodynamics:::Аэро-, газо- и гидродинамика
sci_all:::Наука, Образование: прочее
sci_archeology:::Археология
sci_biochem:::Биохимия
sci_biology:::Биология
sci_biophys:::Биофизика
sci_botany:::Ботаника
sci_build:::Строительство и монтажные работы
sci_business:::Деловая литература: прочее
sci_chem:::Химия
sci_cosmos:::Астрономия и Космос
sci_crib:::Шпаргалки
sci_culture:::Культурология
sci_ecology:::Экология и защита природы
sci_economy:::Экономика
sci_electronics:::Электроника, микроэлектроника, схемотехника
sci_energy:::Энергетика, электротехника
sci_engineering:::Конструирование, изобретательство, рационализаторство
sci_evolutionism:::Эволюционизм
sci_ex_all:::Науки естественные
sci_fleet:::Судостроение, флот
sci_geo:::Геологические науки и горное дело
sci_geography:::География и другие науки о Земле
sci_history:::История: прочее
sci_history_0:::История первобытного общества
sci_history_15:::История Средних веков
sci_history_18:::История Нового времени
sci_history_20:::Новейшая история
sci_history_21:::Современная история
sci_history_4:::История Древнего мира
sci_hu_all:::Науки общественные и гуманитарные
sci_hypnosis:::Гипноз, НЛП, внушение и самовнушение
sci_instrumentation:::Приборостроение
sci_juris:::Юриспруденция
sci_linguistic:::Языкознание
sci_math:::Математика
sci_medicine:::Медицина
sci_medicine_alternative:::Альтернативная медицина
sci_metal:::Металлургия
sci_oriental:::Востоковедение
sci_paleontology:::Палеонтология
sci_pedagogy:::Педагогика
sci_philology:::Литературоведение
sci_philosophy:::Философия
sci_phys:::Физика
sci_politics:::Политика и дипломатия
sci_popular:::Научно-популярная и научно-художественная литература
sci_psychiatry:::Психиатрия и наркология
sci_psychology:::Психология
sci_radio:::Радиоэлектроника, радиотехника, связь
sci_religion:::Религиоведение
sci_social_studies:::Социология
sci_state:::Государство и право
sci_tech:::Технические науки
sci_tech_assembling:::Сборка, неразъемное соединение
sci_tech_chem:::Химическая и нефтехимическая промышленности
sci_tech_drawing:::Начертательная геометрия, инженерная графика, черчение
sci_tech_ergonomics:::Психология труда, инженерная психология и эргономика
sci_tech_hydraulics:::Гидравлика, пневматика
sci_tech_machine_parts:::Детали машин
sci_tech_machinery:::Машиностроение и металлообработка
sci_tech_materials:::Материаловедение, конструкционные и прочие материалы
sci_tech_mech:::Механика
sci_tech_metrology:::Метрология, стандартизация и сертификация
sci_tech_nano:::Наноматериалы и нанотехнологии
sci_tech_oil:::Нефтегазовая и угольная промышленности
sci_tech_print:::Полиграфическое и упаковочное производство
sci_tech_protection:::Безопасность жизнедеятельности и охрана труда
sci_tech_reliability:::Диагностика, неразрушающий контроль и надежность
sci_tech_robot:::Автоматизация, робототехника, мехатроника
sci_tech_rockets:::Авиация, ракетная и космическая техника
sci_tech_sopromat:::Строительная механика и сопромат
sci_tech_standards:::Нормативно-техническая документация
sci_tech_theormech:::Теория механизмов и машин
sci_textbook:::Учебники и пособия: прочее
sci_textbook_su:::Советские учебники и пособия
sci_theories:::Паранаука, псевдонаука, альтернативные теории
sci_thermodynamics:::Термодинамика, теплопередача, теплотехника
sci_thesis:::Диссертации, дипломные, курсовые и прочие работы
sci_transport:::Транспорт и спецтехника
sci_veterinary:::Ветеринария
sci_zoo:::Зоология
science:::Научная литература
science_history:::История науки
screenplays:::Киносценарии
sf:::Научная Фантастика
sf_action:::Боевая фантастика
sf_all:::Фантастика
sf_cyberpunk:::Киберпанк
sf_detective:::Детективная фантастика
sf_epic:::Эпическая фантастика
sf_etc:::Фантастика: прочее
sf_fantasy:::Фэнтези: прочее
sf_fantasy_city:::Городское фэнтези
sf_fantasy_irony:::Ироническое фэнтези
sf_heroic:::Героическая фантастика
sf_history:::Альтернативная история
sf_horror:::Ужасы
sf_humor:::Юмористическая фантастика
sf_irony:::Ироническая фантастика
sf_litrpg:::ЛитРПГ
sf_mystic:::Мистика
sf_paleontological:::Палеонтологическая фантастика
sf_postapocalyptic:::Постапокалипсис
sf_realrpg:::РеалРПГ
sf_rus:::Российская фантастика
sf_social:::Социально-философская фантастика
sf_space:::Космическая фантастика
sf_space_opera:::Космоопера
sf_stimpank:::Стимпанк
sf_su:::Советская фантастика
sf_technofantasy:::Технофэнтези
short_story:::Рассказ
small_business:::Малый бизнес
song_poetry:::Песенная поэзия
sound_engineering:::Звукорежиссура
speech:::Речи, выступления, доклады
stock:::Ценные бумаги, инвестиции
story:::Новелла
su_publication:::Советские издания
tale_chivalry:::Рыцарский роман
tbg_all:::Учебники и пособия
tbg_computers:::Учебники и самоучители по компьютеру
tbg_higher:::Учебники и пособия ВУЗов
tbg_school:::Школьные учебники и пособия
tbg_secondary:::Учебники и пособия для среднего и специального образования
tech_all:::Техника
theatre:::Театр
thriller:::Триллер
thriller_archaeological:::Археологический триллер
thriller_legal:::Юридический триллер
thriller_medical:::Медицинский триллер
thriller_psychology:::Психологический триллер
thriller_techno:::Техно триллер
trade:::Торговля
tragedy:::Трагедия
travel_notes:::Записки путешественника
unfinished:::Недописанное
vampire_book:::О вампирах
vaudeville:::Водевиль, буффонада
vers_libre:::Верлибры
visual_arts:::Изобразительное искусство, фотография
visual_poetry:::Визуальная поэзия
ya:::Для среднего школьного возраста (Подростковая литература) 12

View file

@ -3,11 +3,13 @@ package ru.redrise.marinesco.library;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.Id; import jakarta.persistence.Id;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@Data @Data
@Entity @Entity
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true) @NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
public class Genre { public class Genre {
@Id @Id

View file

@ -1,20 +1,28 @@
package ru.redrise.marinesco.library.settings; package ru.redrise.marinesco.library.settings;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping; 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.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import ru.redrise.marinesco.data.GenreRepository; import ru.redrise.marinesco.data.GenreRepository;
import ru.redrise.marinesco.library.Genre; import ru.redrise.marinesco.library.Genre;
import org.springframework.web.bind.annotation.RequestBody;
@Slf4j @Slf4j
@Controller @Controller
@ -58,4 +66,16 @@ public class GenreSettingsController {
private class GenresHolder { private class GenresHolder {
private List<Genre> genres; private List<Genre> genres;
} }
@PostMapping("/upload")
public String postMethodName(@RequestParam("file") MultipartFile file,
RedirectAttributes redirectAttributes) {
final String message = GenresUpload.upload(file.getResource(), file.getSize(), genreRepository);
redirectAttributes.addFlashAttribute("message", message);
return "redirect:/settings/genres";
}
} }

View file

@ -0,0 +1,42 @@
package ru.redrise.marinesco.library.settings;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.springframework.core.io.Resource;
import lombok.extern.slf4j.Slf4j;
import ru.redrise.marinesco.data.GenreRepository;
import ru.redrise.marinesco.library.Genre;
@Slf4j
public class GenresUpload {
public static String upload(Resource resouce, long fileSize, GenreRepository repository) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(resouce.getInputStream()))){
if (fileSize == 0)
throw new Exception("empty file");
String line;
List<Genre> genres = new ArrayList<>();
while ((line = reader.readLine()) != null) {
String arr[] = line.split(":::");
if (arr.length != 2)
throw new Exception("Malformed file");
genres.add(new Genre(arr[0], arr[1]));
}
repository.saveAll(genres);
} catch (Exception e) {
log.debug("{}", e);
return "Upload failed: " + e.getMessage();
}
return "Successfully uploaded: " + resouce.getFilename();
}
}

View file

@ -1,4 +1,4 @@
package ru.redrise.marinesco.library; package ru.redrise.marinesco.library.web;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@ -52,4 +52,4 @@ public class DownloadController {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Book not found [" + e.getMessage() + "]"); throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Book not found [" + e.getMessage() + "]");
} }
} }
} }

View file

@ -10,13 +10,28 @@
<body> <body>
<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">
<div class="wrapper_centred" th:if="${message != null}">
<em><span th:text="${message}"></span></em>
</div>
<form method="POST" th:action="@{/settings/genres/upload}" enctype="multipart/form-data">
<div class="wrapper_centred">
<span class="item0">Pick from file: </span>
<input class="item1" name="file" type="file" accept="text/plain" />
</div>
<div class="wrapper_centred"><button class="sign" type="submit">Apply</button></div>
</form>
<hr>
<form method="POST" th:action="@{/settings/genres}" th:object="${genresHolder}"> <form method="POST" th:action="@{/settings/genres}" th:object="${genresHolder}">
<div class="wrapper_centred" th:each="genre, itemStat : ${genresHolder.genres}"> <div class="wrapper_centred" th:each="genre, itemStat : ${genresHolder.genres}">
<label for="displayname" th:text="${genre.genreId}" class="item0"></label> <span th:text="${genre.genreId}" class="item0"></span>
<input type="hidden" th:value="${genre.genreId}" th:field="*{genres[__${itemStat.index}__].genreId}" /> <input type="hidden" th:value="${genre.genreId}"
<input class="item1" type="text" th:field="*{genres[__${itemStat.index}__].humanReadableDescription}" th:field="*{genres[__${itemStat.index}__].genreId}" />
<input class="item1" type="text"
th:field="*{genres[__${itemStat.index}__].humanReadableDescription}"
th:value="${genre.humanReadableDescription}" size="25%" /> th:value="${genre.humanReadableDescription}" size="25%" />
</div> </div>
<div class="wrapper_centred"><button class="sign" type="submit">Save Changes</button></div> <div class="wrapper_centred"><button class="sign" type="submit">Save Changes</button></div>