diff --git a/backend/package.json b/backend/package.json index c1c3058..d657182 100644 --- a/backend/package.json +++ b/backend/package.json @@ -19,7 +19,8 @@ "test:e2e": "jest --config ./test/jest-e2e.json", "db:push": "prisma db push", "db:view": "prisma studio", - "db:generate": "prisma generate" + "db:generate": "prisma generate", + "db:seed": "ts-node src/core/prisma/prisma.seed.ts" }, "dependencies": { "@apollo/server": "^4.12.2", diff --git a/backend/src/core/prisma/data/categories.data.ts b/backend/src/core/prisma/data/categories.data.ts new file mode 100644 index 0000000..49ef6e9 --- /dev/null +++ b/backend/src/core/prisma/data/categories.data.ts @@ -0,0 +1,128 @@ +export const CATEGORIES = [ + { + title: 'Minecraft', + slug: 'minecraft', + description: + 'Погрузитесь в бескрайний мир творчества и приключений в Minecraft! Эта категория посвящена самой популярной песочнице, где вы можете строить, исследовать и выживать в уникальных мирах. Следите за стримами, вдохновляйтесь креативными постройками, участвуйте в совместных проектах и делитесь своими достижениями. Присоединяйтесь к сообществу, где фантазия не знает границ, и откройте для себя безумные возможности, которые предлагает Minecraft!', + thumbnailUrl: '/categories/minecraft.webp', + }, + { + title: 'Grand Theft Auto V', + slug: 'grand-theft-auto-v', + description: + 'Добро пожаловать в криминальный мир Лос-Сантоса! Эта категория посвящена одной из самых популярных игр в открытом мире, где вы можете свободно исследовать, выполнять миссии и наслаждаться безумными приключениями. Следите за стримами, участвуйте в захватывающих гонках и ограблениях, обсуждайте стратегии и делитесь своими уникальными моментами из игры. Присоединяйтесь к сообществу, где каждый найдет себе занятие — от уличных гонок до создания собственных историй в рамках GTA V!', + thumbnailUrl: '/categories/grand-theft-auto-v.webp', + }, + { + title: 'Rust', + slug: 'rust', + description: + 'Добро пожаловать в суровый и захватывающий мир Rust! Эта категория посвящена одной из самых популярных игр на выживание, где стратегии и навыки играют ключевую роль. Следите за стримами, наблюдайте за построением баз, захватывающими боями и захватами ресурсов. Делитесь своими тактиками, обсуждайте обновления и находите единомышленников, готовых бросить вызов этому жестокому миру. Присоединяйтесь к нам, чтобы научиться выживать и процветать в условиях жестокой конкуренции!', + thumbnailUrl: '/categories/rust.webp', + }, + { + title: 'Cyberpunk 2077', + slug: 'cyberpunk-2077', + description: + 'Добро пожаловать в мрачный и захватывающий мир Night City! Эта категория посвящена Cyberpunk 2077, где вы сможете погрузиться в атмосферу будущего, полного технологий, приключений и сложных выборов. Следите за стримами, обсуждайте квесты и сюжетные линии, а также делитесь своими тактиками и опытом в этой уникальной RPG. Присоединяйтесь к сообществу, где каждый может исследовать мир киберпанка и раскрывать его тайны, становясь частью этой невероятной истории!', + thumbnailUrl: '/categories/cyberpunk-2077.webp', + }, + { + title: 'Общение', + slug: 'just-chatting', + description: + 'Погружайтесь в мир живых дискуссий и общения! Эта категория предлагает вам уникальную возможность обмениваться мнениями, участвовать в увлекательных беседах и находить единомышленников. Делитесь своими мыслями, задавайте вопросы и получайте ответы в реальном времени. Присоединяйтесь к стримам, где каждый может высказать свое мнение и стать частью дружелюбного сообщества!', + thumbnailUrl: '/categories/just-chatting.webp', + }, + { + title: 'Red Dead Redemption 2', + slug: 'red-dead-redemption-2', + description: + 'Погрузитесь в атмосферу Дикого Запада с одним из самых захватывающих приключений в истории игр! Эта категория посвящена Red Dead Redemption 2, где вы сможете следить за эпическими историями, исследовать живописные ландшафты и участвовать в увлекательных стримах. Обсуждайте стратегии, делитесь моментами из игры и находите единомышленников, разделяющих вашу страсть к этому культовому произведению. Присоединяйтесь к нам и откройте для себя мир, полный приключений, свободы и духа ковбойской жизни!', + thumbnailUrl: '/categories/red-dead-redemption-2.webp', + }, + { + title: 'Обучение', + slug: 'learning', + description: + 'Расширьте свои знания и навыки в этой категории, посвященной обучению! Здесь вы найдете стримы и курсы по разнообразным темам — от искусства и музыки до языков и личной продуктивности. Участвуйте в интерактивных уроках, задавайте вопросы и получайте советы от опытных наставников. Обучение стало еще более доступным и увлекательным! Присоединяйтесь к сообществу стремящихся к самосовершенствованию и откройте новые горизонты для своего развития!', + thumbnailUrl: '/categories/learning.webp', + }, + { + title: 'Fortnite', + slug: 'fortnite', + description: + 'Погрузитесь в яркий и динамичный мир Fortnite! Эта категория посвящена культовой игре, где строительство, стратегия и сражения с противниками сочетаются в одном захватывающем процессе. Следите за стримами, наблюдайте за матчами с участием лучших игроков и учитесь у них уникальным тактикам. Делитесь своими достижениями, обсуждайте новые обновления и находите единомышленников для совместной игры. Присоединяйтесь к нашему сообществу и станьте частью эпических сражений на острове Fortnite!', + thumbnailUrl: '/categories/fortnite.webp', + }, + { + title: 'Counter-Strike', + slug: 'counter-strike', + description: + 'Добро пожаловать в мир напряженных сражений и стратегического геймплея! Эта категория посвящена популярной игре Counter-Strike, где вы сможете наблюдать захватывающие матчи, учиться у лучших игроков и делиться своими тактиками. Присоединяйтесь к стримам, обсуждайте последние обновления и соревнуйтесь с другими игроками. Будьте в курсе самых ярких моментов и станьте частью увлекательной киберспортивной культуры!', + thumbnailUrl: '/categories/counter-strike.webp', + }, + { + title: 'Программирование', + slug: 'programming', + description: + 'Откройте для себя увлекательный мир кода и технологий! Эта категория посвящена программированию, где вы можете учиться, делиться опытом и вдохновляться новыми идеями. Следите за стримами, посвященными различным языкам программирования, инструментам и разработке проектов. Участвуйте в обсуждениях, задавайте вопросы и получайте советы от опытных разработчиков. Присоединяйтесь к сообществу, где код становится искусством, и каждая строчка — шаг к вашему следующему достижению!', + thumbnailUrl: '/categories/programming.webp', + }, + { + title: 'Dota 2', + slug: 'dota-2', + description: + 'Погрузитесь в мир стратегических сражений и командной игры с Dota 2! Эта категория предназначена для всех поклонников культовой MOBA, где вы сможете следить за увлекательными матчами, изучать стратегии и делиться опытом с другими игроками. Присоединяйтесь к стримам, обсуждайте последние обновления и тактики, а также находите единомышленников для совместной игры. Откройте для себя захватывающий мир героев, навыков и командных сражений, где каждое решение может изменить ход битвы!', + thumbnailUrl: '/categories/dota-2.webp', + }, + { + title: 'Brawl Stars', + slug: 'brawl-stars', + description: + 'Погрузитесь в динамичные сражения и быструю тактику в мире Brawl Stars! Эта категория создана для всех фанатов увлекательных битв 3 на 3 и эпических боев в режиме "Королевская битва". Здесь вы сможете смотреть лучшие стримы, обсуждать стратегии и разрабатывать новые тактики для своих бойцов. Присоединяйтесь к сообществу игроков, следите за последними обновлениями, открывайте новых персонажей и прокачивайте их способности. Каждый бой — это новый вызов, где командная работа и мастерство определяют победителя!', + thumbnailUrl: '/categories/brawl-stars.webp', + }, + { + title: 'Clash Royale', + slug: 'clash-royale', + description: + 'Погрузитесь в захватывающий мир Clash Royale, где стратегия и мгновенные решения определяют исход сражений! Эта категория предназначена для всех поклонников карточных баталий, где вы сможете наблюдать за увлекательными турнирами, изучать успешные колоды и делиться опытом с другими игроками. Присоединяйтесь к стримам, обсуждайте последние обновления и тактики, открывайте новые карты и улучшайте свои любимые карты до максимума. Исследуйте бесконечные возможности для создания уникальных стратегий и сражайтесь с противниками, чтобы стать мастером арены!', + thumbnailUrl: '/categories/clash-royale.webp', + }, + { + title: 'Музыка', + slug: 'music', + description: + 'Погрузитесь в мир музыки, где каждый аккорд и ритм наполняют атмосферу вдохновением и эмоциями! Эта категория предназначена для всех меломанов и музыкантов, где вы сможете наслаждаться живыми выступлениями, открывать новые жанры и делиться своим опытом с единомышленниками. Присоединяйтесь к стримам, обсуждайте последние релизы и события музыкальной индустрии, а также делитесь своими творениями и играми. Откройте для себя удивительный мир звуков, где каждое выступление — это уникальная история, которая ждет своего слушателя!', + thumbnailUrl: '/categories/music.webp', + }, + { + title: 'Call of Duty', + slug: 'call-of-duty', + description: + 'Погрузитесь в мир захватывающих военных операций и командных сражений с Call of Duty! Эта категория создана для всех фанатов легендарной франшизы, где вы сможете наблюдать за напряжёнными матчами, изучать тактики и делиться своим опытом с другими игроками. Присоединяйтесь к стримам, обсуждайте последние обновления и новшества, а также находите союзников для совместной игры в различных режимах. Исследуйте динамичные карты, осваивайте уникальное оружие и тактики, где каждое ваше решение может стать ключом к победе в этом эпическом боевом мире!', + thumbnailUrl: '/categories/call-of-duty.webp', + }, + { + title: 'World of Tanks', + slug: 'world-of-tanks', + description: + 'Погрузитесь в мир бронированных сражений и стратегической тактики с World of Tanks! Эта категория предназначена для всех поклонников легендарной танковой битвы, где вы сможете наблюдать за захватывающими матчами, изучать особенности различных танков и делиться опытом с единомышленниками. Присоединяйтесь к стримам, обсуждайте последние обновления и балансировку, а также находите товарищей по команде для совместной игры в различных режимах. Откройте для себя увлекательные сражения на разнообразных картах, прокачивайте свою армию и развивайте стратегические навыки, где каждое ваше решение может изменить ход боя!', + thumbnailUrl: '/categories/world-of-tanks.webp', + }, + { + title: 'League of Legends', + slug: 'league-of-legends', + description: + 'Погрузитесь в мир эпических сражений и стратегического геймплея с League of Legends! Эта категория создана для всех поклонников культовой MOBA, где вы сможете следить за захватывающими матчами, изучать стратегии и делиться опытом с другими игроками. Присоединяйтесь к стримам, обсуждайте последние обновления и патчи, а также находите единомышленников для совместной игры. Откройте для себя множество уникальных чемпионов, исследуйте их способности и развивайте свои навыки, чтобы стать мастером поля боя. Каждая игра — это новый вызов, где командная работа и умение адаптироваться к ситуации определяют победу!', + thumbnailUrl: '/categories/league-of-legends.webp', + }, + { + title: 'Спорт', + slug: 'sport', + description: + 'Погрузитесь в захватывающий мир спорта, где страсть, соревнование и дух командной игры сливаются воедино! Эта категория предназначена для всех поклонников активного образа жизни и спортивных событий, где вы сможете следить за увлекательными матчами, обсуждать стратегии команд и делиться своим опытом с другими фанатами. Присоединяйтесь к стримам, следите за последними новостями и результатами, а также находите единомышленников для совместных тренировок и обсуждений. Откройте для себя удивительный мир спорта, где каждое соревнование — это возможность проявить свои силы и стремление к победе!', + thumbnailUrl: '/categories/sport.webp', + }, +] diff --git a/backend/src/core/prisma/data/streams.data.ts b/backend/src/core/prisma/data/streams.data.ts new file mode 100644 index 0000000..5009056 --- /dev/null +++ b/backend/src/core/prisma/data/streams.data.ts @@ -0,0 +1,218 @@ +export const STREAMS = { + 'minecraft': [ + 'Проходим Minecraft: выживание с нуля!', + 'Строим эпические постройки в Minecraft', + 'Тайны Майнкрафт: приключения начинаются!', + 'Создаем ферму в Minecraft', + 'Убиваем Дракона Края!', + 'Исследуем подземелья Minecraft', + 'Магические зелья и чары в Minecraft', + 'Автоматизируем добычу ресурсов в Minecraft', + 'Рыбалка и охота в Minecraft: собираем лут', + 'Крафтим уникальные предметы в Minecraft', + ], + 'grand-theft-auto-v': [ + 'Проходим GTA 5 на 100%', + 'Гонки и трюки в GTA Online', + 'Сюжетка GTA 5: снова в деле!', + 'Ограбления в GTA V: делаем дело', + 'Веселимся в Лос-Сантосе', + 'Открываем секретные локации в GTA 5', + 'Играем в миссии "Контракт" в GTA Online', + 'Миссии против полиции в GTA 5', + 'Обзор новых машин и тюнинга в GTA Online', + 'Создаем свой бизнес в Лос-Сантосе', + ], + 'rust': [ + 'Рейдим базы в Rust', + 'Выживание в пустоши: Rust', + 'Новые механики Rust: тестируем!', + 'От новичка до про в Rust', + 'ПвП битвы в мире Rust', + 'Готовим рейды в Rust: тактики и стратегии', + 'Ловушки и оборонительные сооружения в Rust', + 'Ищем редкие ресурсы в Rust', + 'Исследуем огромные карты Rust', + 'Выживаем в жестоких условиях Rust', + ], + 'cyberpunk-2077': [ + 'Исследуем Найт-Сити в Cyberpunk 2077', + 'Проходим сюжетные квесты Cyberpunk', + 'Моддинг и кастомизация в Cyberpunk', + 'Оружие и хаки: боевые тактики Cyberpunk', + 'Агентские миссии в мире будущего', + 'Киберимпланты: улучшаем персонажа', + 'Исследуем мир корпоративных заговоров', + 'Миссии с быстрыми сетевыми атаками', + 'Делаем побочные квесты Cyberpunk 2077', + 'Обзор обновлений и дополнений к игре', + ], + 'just-chatting': [ + 'Общаемся с подписчиками!', + 'Ответы на вопросы: задавайте любые!', + 'Чилл-стрим: болтаем обо всем', + 'Ваши истории, наши обсуждения', + 'Уютные разговоры и новости', + 'Обсуждаем последние фильмы и сериалы', + 'Музыкальные рекомендации от зрителей', + 'Ваши вопросы, наши ответы!', + 'Рассуждаем о будущем технологий', + 'Тренды в игровой индустрии: обсуждаем', + ], + 'red-dead-redemption-2': [ + 'Приключения в мире Red Dead Redemption 2', + 'Проходим сюжет RDR2: Дикий Запад зовет', + 'Охота и выживание в RDR2', + 'Исследуем дикие земли RDR2', + 'Лучшие миссии в Red Dead Redemption 2', + 'Рейдим бандитские укрытия в RDR2', + 'Путешествуем по миру Дикого Запада', + 'Торговля и добыча ресурсов в RDR2', + 'Становимся охотниками за головами в RDR2', + 'Обзор легендарных зверей и трофеев', + ], + 'learning': [ + 'Изучаем основы фотографии', + 'Как стать мастером ораторского искусства', + 'Погружаемся в искусство рисования', + 'Как правильно учить иностранные языки', + 'Тайм-менеджмент для продуктивной жизни', + 'Разбираемся в психологии общения', + 'Основы игры на гитаре для начинающих', + 'Техники быстрого чтения и запоминания', + 'Изучаем основы кулинарии: готовим вместе', + 'Учим основы финансовой грамотности', + ], + 'fortnite': [ + 'Стрим по Fortnite: королевская битва!', + 'Секреты строительства в Fortnite', + 'Лучшие тактики для победы в Fortnite', + 'Сезонные события в Fortnite: участвуем!', + 'Играем в дуо и сквады в Fortnite', + 'Открываем новые скины в Fortnite', + 'Как получить победу в Fortnite', + 'Челленджи Fortnite: выполняем!', + 'Обзор нового боевого пропуска Fortnite', + 'Тренируемся в строительстве и стрельбе', + ], + 'counter-strike': [ + 'Герои Counter-Strike: стратегия и тактика', + 'Лучшие моменты в CS:GO', + 'Участвуем в турнирах по CS:GO', + 'Обзор карт в Counter-Strike', + 'ПвП бои в Counter-Strike', + 'Оружие и амуниция в CS: выбираем лучшее', + 'Тактики для победы в матчах CS:GO', + 'Соревновательные игры: учимся побеждать', + 'Киберспортивные команды: следим за матчами', + 'Участвуем в тренировочных матчах CS:GO', + ], + 'programming': [ + 'Программируем на JavaScript: от простого к сложному', + 'Разработка игр на Python: шаг за шагом', + 'Создание веб-приложений с React: практическое руководство', + 'Учимся разрабатывать мобильные приложения', + 'Разбираем алгоритмы и структуры данных', + 'Работа с API в современных приложениях', + 'Тестирование кода: что нужно знать', + 'Автоматизация процессов разработки', + 'Секреты эффективного дебага', + 'Обзор современных фреймворков для веба', + ], + 'dota-2': [ + 'Проходим Dota 2: секреты победы', + 'Обзор героев Dota 2: выбираем свою стратегию', + 'Готовимся к турниру по Dota 2', + 'Анализ лучших матчей Dota 2', + 'Советы по улучшению игры в Dota 2', + 'Герои поддержки: как правильно играть?', + 'Секреты макроигры в Dota 2', + 'Контроль карты и роуминг в Dota 2', + 'Играем за керри: выигрываем матчи', + 'Секреты победы в командных боях', + ], + 'brawl-stars': [ + 'Стримим Brawl Stars: лучшие бравлеры!', + 'Советы по игре в Brawl Stars', + 'Участвуем в событиях Brawl Stars', + 'Новые режимы в Brawl Stars: тестируем!', + 'Обсуждаем стратегии для Brawl Stars', + 'Как выбрать лучшего бравлера для каждого режима', + 'Играем дуо и командами в Brawl Stars', + 'Проходим сезонные события в Brawl Stars', + 'Открываем новые скины и награды', + 'Секреты прокачки бравлеров', + ], + 'clash-royale': [ + 'Битвы в Clash Royale: стратегии и тактики', + 'Проходим турниры Clash Royale', + 'Обзор карт в Clash Royale', + 'Достигаем новых высот в Clash Royale', + 'Секреты успешной игры в Clash Royale', + 'Создаем колоды для побед в Clash Royale', + 'Обзор новых карт и механик Clash Royale', + 'Лучшие моменты турниров по Clash Royale', + 'Стримим клановые битвы в Clash Royale', + 'Побеждаем в дуэлях и соревнованиях', + ], + 'music': [ + 'Музыкальные новинки: обсуждаем хиты!', + 'Слушаем и обсуждаем любимые альбомы', + 'Обсуждаем музыкальные жанры: что слушать?', + 'Создаем музыку вместе!', + 'Музыкальные челленджи: участвуйте!', + 'Обзор музыкальных инструментов: выбираем свой', + 'Изучаем музыкальные тренды 2024 года', + 'Музыкальные реакции: слушаем вместе', + 'Чилл-аут стрим: слушаем расслабляющую музыку', + 'Интерактивный плейлист: выбирайте треки', + ], + 'call-of-duty': [ + 'Готовимся к битве в Call of Duty', + 'Сюжетные миссии Call of Duty: проходим вместе', + 'Лучшие моменты из Call of Duty', + 'Обзор новых карт в Call of Duty', + 'Мультиплеер в Call of Duty: советы и тактики', + 'Создаем кланы и участвуем в битвах в Call of Duty', + 'Настраиваем оружие для максимальной эффективности', + 'Секреты игры в Call of Duty: как быть лидером', + 'Проходим режим зомби в Call of Duty', + 'Обзор нового боевого пропуска Call of Duty', + ], + 'world-of-tanks': [ + 'Битвы в World of Tanks: тактики и стратегии', + 'Лучшие танки в World of Tanks', + 'Проходим квесты в World of Tanks', + 'Обзор обновлений в World of Tanks', + 'Стримим бои в World of Tanks', + 'ПвП сражения: учимся побеждать', + 'Создаем свою команду для турниров WoT', + 'Настройки танков для лучшей игры', + 'Открываем редкие танки и достижения', + 'Секреты захвата ключевых точек в боях', + ], + 'league-of-legends': [ + 'Герои League of Legends: изучаем стратегии', + 'Обзор новых обновлений в LoL', + 'Соревнуемся в League of Legends', + 'Советы по игре в League of Legends', + 'Турниры и чемпионаты League of Legends', + 'Играем за поддержку: как быть лучшим?', + 'Секреты макроигры в League of Legends', + 'Лучшая тактика для командной игры в LoL', + 'Проходим ранговые игры в League of Legends', + 'Обзор новых скинов и событий в League of Legends', + ], + 'sport': [ + 'Обсуждаем спортивные события: последние новости!', + 'Спортивные тренировки: секреты успеха', + 'Лучшие моменты в мире спорта', + 'Спортивные челленджи: участвуйте!', + 'Обзор спортивных игр и событий', + 'Поддерживаем себя в форме: советы и лайфхаки', + 'Секреты успешных спортсменов: что важно знать?', + 'Обсуждаем тактики и стратегии для командных видов спорта', + 'Реакции на последние спортивные трансляции', + 'Участвуем в спортивных турнирах и соревнованиях', + ], +} diff --git a/backend/src/core/prisma/data/users.data.ts b/backend/src/core/prisma/data/users.data.ts new file mode 100644 index 0000000..84d6d66 --- /dev/null +++ b/backend/src/core/prisma/data/users.data.ts @@ -0,0 +1,104 @@ +export const USERNAMES = [ + 'teacoder', + 'stintik', + 'alex', + 'bella', + 'carter', + 'dylan', + 'ethan', + 'fiona', + 'grace', + 'henry', + 'isabella', + 'jackson', + 'kate', + 'liam', + 'mia', + 'noah', + 'oliver', + 'paige', + 'quinn', + 'ryan', + 'sophia', + 'thomas', + 'ursula', + 'victor', + 'willow', + 'xander', + 'yara', + 'zoe', + 'adrian', + 'bella', + 'caroline', + 'daniel', + 'elena', + 'felix', + 'gabriel', + 'hannah', + 'ian', + 'julia', + 'kevin', + 'lily', + 'michael', + 'nina', + 'oscar', + 'peter', + 'quincy', + 'rachel', + 'samuel', + 'taylor', + 'ulysses', + 'vanessa', + 'wyatt', + 'xenia', + 'yuri', + 'zoey', + 'amelia', + 'benjamin', + 'charlotte', + 'david', + 'emma', + 'frederick', + 'georgia', + 'harper', + 'isaac', + 'joseph', + 'katie', + 'lucas', + 'madison', + 'nathan', + 'olivia', + 'patrick', + 'quincy', + 'rebecca', + 'sebastian', + 'tiffany', + 'ulyana', + 'victoria', + 'wesley', + 'xavier', + 'yasmin', + 'zoella', + 'aaron', + 'brianna', + 'claire', + 'diego', + 'ella', + 'frank', + 'george', + 'holly', + 'ivan', + 'jessica', + 'kyle', + 'logan', + 'mason', + 'nicolas', + 'olga', + 'paul', + 'quinn', + 'ryder', + 'scarlett', + 'tristan', + 'ulysses', + 'violet', +] diff --git a/backend/src/core/prisma/prisma.seed.ts b/backend/src/core/prisma/prisma.seed.ts new file mode 100644 index 0000000..f24e3bb --- /dev/null +++ b/backend/src/core/prisma/prisma.seed.ts @@ -0,0 +1,110 @@ +import { BadRequestException, Logger } from '@nestjs/common' +import { hash } from 'argon2' +import { Prisma, PrismaClient } from '../../../prisma/generated' + +import { CATEGORIES } from './data/categories.data' +import { USERNAMES } from './data/users.data' +import { STREAMS } from './data/streams.data' + +const prisma = new PrismaClient({ + transactionOptions: { + maxWait: 5000, + timeout: 10000, + isolationLevel: Prisma.TransactionIsolationLevel.Serializable, + }, +}) +async function main() { + try { + Logger.log('Начало заполнения базы данных') + + await prisma.$transaction([ + prisma.user.deleteMany({}), + prisma.socialLink.deleteMany({}), + prisma.stream.deleteMany({}), + prisma.category.deleteMany({}), + ]) + + await prisma.category.createMany({ data: CATEGORIES }) + Logger.log('Категории успешно созданы') + const categories = await prisma.category.findMany() + + const categoriesBySlug = Object.fromEntries( + categories.map(category => [category.slug, category]), + ) + + await prisma.$transaction(async (tx) => { + for (const name of USERNAMES) { + const randomCategory = categoriesBySlug[ + Object.keys(categoriesBySlug)[ + Math.floor(Math.random() * Object.keys(categoriesBySlug).length) + ] + ] + + const userExists = await tx.user.findUnique({ where: { name } }) + if (!userExists) { + const createdUser = await tx.user.create({ + data: { + email: `${name}@teastream.ru`, + password: await hash('12345678'), + name, + displayName: name, + avatar: `/channels/${name}.webp`, + isEmailVerified: true, + socialLink: { + createMany: { + data: [ + { + title: 'Telegram', + url: `https://t.me/${name}`, + position: 1, + }, + { + title: 'YouTube', + url: `https://youtube.com/@${name}`, + position: 2, + }, + ], + }, + }, + // notificationSettings: { + // create: {}, + // }, + }, + }) + + const randomTitles = STREAMS[randomCategory.slug] as string + const randomTitle = randomTitles[Math.floor(Math.random() * randomTitles.length)] + + await tx.stream.create({ + data: { + title: randomTitle, + thumbnailUrl: `/streams/${createdUser.name}.webp`, + user: { + connect: { + id: createdUser.id, + }, + }, + category: { + connect: { + id: randomCategory.id, + }, + }, + }, + }) + Logger.log(`Пользователь "${createdUser.name}" и его стрим успешно созданы`) + } + } + }) + } + catch (e) { + Logger.error(e) + throw new BadRequestException('Ошибка при заполнении базы данных') + } + finally { + Logger.log('Закрытие соединения с базой данных') + await prisma.$disconnect() + Logger.log('Соединение с базой данныз успешно закрыто') + } +} + +main()