From 5d002b255e8a27e5225bdb535378c216dd5b53e4 Mon Sep 17 00:00:00 2001 From: NDZHER <156980843+LexaFrontDev@users.noreply.github.com> Date: Tue, 16 Sep 2025 13:21:18 +0500 Subject: [PATCH] feat(resource-sync): add system for loading translations and other resources into database refactor(docs): update README.md and README.ru.md --- README.md | 2 +- README.ru.md | 2 +- .../Dto/ResourceDto/BenefitsDto.php | 20 ++ src/Aplication/Dto/ResourceDto/FaqDto.php | 12 + .../Dto/ResourceDto/HabitsTemplatesDto.php | 14 ++ .../Dto/ResourceDto/LanguageDto.php | 12 + .../Dto/ResourceDto/PremiumPlansDto.php | 18 ++ .../CommandResourceUseCase.php | 36 +++ .../v1_resourses/DatabaseResources.php} | 221 ++++++++++++------ .../ResourceService/ResourceSyncInterface.php | 42 ++++ .../Command/SyncResourcesCommand.php | 36 +++ .../V1Fixtures/BenefitsFixtures.php | 57 ----- .../DataFixtures/V1Fixtures/FAQFixtures.php | 42 ---- .../V1Fixtures/HabitsTemplatesFixtures.php | 59 ----- .../V1Fixtures/LanguageFixture.php | 39 ---- .../V1Fixtures/PremiumPlanFixtures.php | 58 ----- .../ResourceService/ResourceSyncService.php | 198 ++++++++++++++++ 17 files changed, 539 insertions(+), 329 deletions(-) create mode 100644 src/Aplication/Dto/ResourceDto/BenefitsDto.php create mode 100644 src/Aplication/Dto/ResourceDto/FaqDto.php create mode 100644 src/Aplication/Dto/ResourceDto/HabitsTemplatesDto.php create mode 100644 src/Aplication/Dto/ResourceDto/LanguageDto.php create mode 100644 src/Aplication/Dto/ResourceDto/PremiumPlansDto.php create mode 100644 src/Aplication/UseCase/ResourceUseCase/CommandResourceUseCase.php rename src/{Infrastructure/DataFixtures/V1Fixtures/LanguagePageTranslationFixture.php => Domain/Resource/v1_resourses/DatabaseResources.php} (83%) create mode 100644 src/Domain/Service/ResourceService/ResourceSyncInterface.php create mode 100644 src/Infrastructure/Command/SyncResourcesCommand.php delete mode 100644 src/Infrastructure/DataFixtures/V1Fixtures/BenefitsFixtures.php delete mode 100644 src/Infrastructure/DataFixtures/V1Fixtures/FAQFixtures.php delete mode 100644 src/Infrastructure/DataFixtures/V1Fixtures/HabitsTemplatesFixtures.php delete mode 100644 src/Infrastructure/DataFixtures/V1Fixtures/LanguageFixture.php delete mode 100644 src/Infrastructure/DataFixtures/V1Fixtures/PremiumPlanFixtures.php create mode 100644 src/Infrastructure/Service/ResourceService/ResourceSyncService.php diff --git a/README.md b/README.md index 0d6e3f0..95a37ef 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ php bin/console doctrine:migrations:migrate -n ### 5. Load fixtures ```bash -php bin/console doctrine:fixtures:load +php bin/console app:resources:sync exit ``` diff --git a/README.ru.md b/README.ru.md index bcac0ef..2d21972 100644 --- a/README.ru.md +++ b/README.ru.md @@ -58,7 +58,7 @@ php bin/console doctrine:migrations:migrate -n ### 5. Загрузка фикстур ```bash -php bin/console doctrine:fixtures:load +php bin/console app:resources:sync exit ``` diff --git a/src/Aplication/Dto/ResourceDto/BenefitsDto.php b/src/Aplication/Dto/ResourceDto/BenefitsDto.php new file mode 100644 index 0000000..98c5a2e --- /dev/null +++ b/src/Aplication/Dto/ResourceDto/BenefitsDto.php @@ -0,0 +1,20 @@ +sync('языки', [$this->databaseResources, 'getLanguages'], [$this->resourceSync, 'setLanguage']); + $this->sync('переводы', [$this->databaseResources, 'getTranslates'], [$this->resourceSync, 'setTranslation']); + $this->sync('планы', [$this->databaseResources, 'getPremiumPlans'], [$this->resourceSync, 'setPremiumPlans']); + $this->sync('шаблоны привычек', [$this->databaseResources, 'getHabitsTemplates'], [$this->resourceSync, 'setHabitsTemplates']); + $this->sync('FAQ', [$this->databaseResources, 'getFaq'], [$this->resourceSync, 'setFaq']); + $this->sync('бенефиты', [$this->databaseResources, 'getBenefits'], [$this->resourceSync, 'setBenefits']); + } + + private function sync(string $name, callable $getData, callable $setData): void + { + $data = $getData(); + $result = $setData($data); + + if (empty($result)) { + throw new MessageException("Не удалось сохранить $name, результат: ".json_encode($result)); + } + } +} diff --git a/src/Infrastructure/DataFixtures/V1Fixtures/LanguagePageTranslationFixture.php b/src/Domain/Resource/v1_resourses/DatabaseResources.php similarity index 83% rename from src/Infrastructure/DataFixtures/V1Fixtures/LanguagePageTranslationFixture.php rename to src/Domain/Resource/v1_resourses/DatabaseResources.php index eadf955..f07df16 100644 --- a/src/Infrastructure/DataFixtures/V1Fixtures/LanguagePageTranslationFixture.php +++ b/src/Domain/Resource/v1_resourses/DatabaseResources.php @@ -1,29 +1,38 @@ $manager->getRepository(Language::class)->findOneBy(['prefix' => 'ru']), - 'en' => $manager->getRepository(Language::class)->findOneBy(['prefix' => 'en']), - 'kz' => $manager->getRepository(Language::class)->findOneBy(['prefix' => 'kz']), - 'de' => $manager->getRepository(Language::class)->findOneBy(['prefix' => 'de']), - 'kg' => $manager->getRepository(Language::class)->findOneBy(['prefix' => 'kg']), - 'uz' => $manager->getRepository(Language::class)->findOneBy(['prefix' => 'uz']), - 'ko' => $manager->getRepository(Language::class)->findOneBy(['prefix' => 'ko']), - 'ja' => $manager->getRepository(Language::class)->findOneBy(['prefix' => 'ja']), + return [ + new LanguageDto(name: 'Русский', prefix: 'ru'), + new LanguageDto(name: 'English', prefix: 'en'), + new LanguageDto(name: 'Қазақ тілі', prefix: 'kz'), + new LanguageDto(name: 'Deutsch', prefix: 'de'), + new LanguageDto(name: 'Кыргыз тили', prefix: 'kg'), + new LanguageDto(name: 'O‘zbek tili', prefix: 'uz'), + new LanguageDto(name: '한국어', prefix: 'ko'), + new LanguageDto(name: '日本語', prefix: 'ja'), ]; + } - $v1_translate_site = [ + /** + * @return array>> + */ + public function getTranslates(): array + { + return [ 'landing' => [ 'loginButtonText' => [ 'ru' => 'Войти', 'en' => 'Login', 'kz' => 'Кіру', @@ -751,72 +760,140 @@ public function load(ObjectManager $manager): void ], ]; + } - - - $this->createTranslation('v1_translate_site', $v1_translate_site, $languages, $manager); - $manager->flush(); + /** + * @return PremiumPlansDto[] + */ + public function getPremiumPlans(): array + { + return [ + new PremiumPlansDto( + name: 'Free', + desc: 'Базовые функции для старта', + price: '0₸ / мес', + features: ['20 задач в день', '5 привычек', 'Матрица Эйзенхауэра', 'Помодоро', 'Базовый Кастомный фон'], + highlight: true, + ), + new PremiumPlansDto( + name: 'Pro', + desc: 'Для продуктивной работы', + price: '999₸ / мес', + features: [ + '50 задач в день', + '50 привычек', + 'Кастомный фон', + 'ИИ-помощник', + 'канбан', + 'Больше звуков для помодора', + 'полный Кастомный фон и возможность добавлять свой фоны', + ], + highlight: true, + ), + new PremiumPlansDto( + name: 'Pro Год', + desc: 'Экономия и приоритет', + price: '9 999₸ / год', + features: ['Всё из Pro', 'Приоритетная поддержка'], + highlight: true, + ), + ]; } /** - * @param array>> $translations - * @param array $languages + * @return HabitsTemplatesDto[] */ - private function createTranslation( - string $pageName, - array $translations, - array $languages, - ObjectManager $manager, - ): void { - foreach ($languages as $prefix => $language) { - if (!$language) { - continue; - } - - $pageTranslate = $this->extractTranslationsForLanguage($translations, $prefix); - $existing = $manager->getRepository(LanguagePageTranslation::class) - ->findOneBy(['pageName' => $pageName]); - - if ($existing) { - continue; - } - - $translation = new LanguagePageTranslation(); - $translation->setPageName($pageName); - $translation->setPageTranslate($pageTranslate); - $translation->setLanguage($language); - - $manager->persist($translation); - } + public function getHabitsTemplates(): array + { + return [ + new HabitsTemplatesDto( + title: 'Ранний подъем', + quote: 'Кто рано встает, тому Бог дает!', + notification: '06:30', + datesType: 'daily', + ), + new HabitsTemplatesDto( + title: 'Утренняя пробежка', + quote: 'Бег - это жизнь!', + notification: '10:30', + datesType: 'daily', + ), + new HabitsTemplatesDto( + title: 'Чтение книги', + quote: 'Книги - корабли мысли', + notification: '16:30', + datesType: 'daily', + ), + new HabitsTemplatesDto( + title: 'Медитация', + quote: 'Тишина - великий учитель', + notification: '14:30', + datesType: 'daily', + ), + ]; } /** - * @param array $translations - * - * @return array + * @return FaqDto[] */ - private function extractTranslationsForLanguage(array $translations, string $languageCode): array + public function getFaq(): array { - $result = []; - - foreach ($translations as $key => $value) { - if (is_array($value)) { - if (isset($value[$languageCode]) && is_string($value[$languageCode])) { - $result[$key] = $value[$languageCode]; - } else { - $nested = $this->extractTranslationsForLanguage($value, $languageCode); - foreach ($nested as $nestedKey => $nestedValue) { - $result[$key.'.'.$nestedKey] = $nestedValue; - } - } - } - } - - return $result; + return [ + new FaqDto( + question: 'Можно ли вернуть деньги после покупки?', + answer: 'Да, вы можете оформить возврат в течение 14 дней после оплаты. Просто отправьте нам запрос через раздел "Обратная связь" в приложении. Если вы оформили подписку через App Store или Google Play, отмену и возврат необходимо оформить через соответствующую платформу.', + ), + new FaqDto( + question: 'Что будет с моими данными, если я не продлю подписку?', + answer: 'Мы не удалим ваши привычки, задачи и статистику. Всё останется сохранено. Если количество привычек превышает лимит бесплатной версии, привычки с низким приоритетом будут автоматически перемещены в архив. Доступ к премиум-функциям будет временно ограничен до продления подписки.', + ), + new FaqDto( + question: 'Как отменить подписку?', + answer: 'Если вы оформили подписку через Google Play или App Store — откройте соответствующее приложение, перейдите в раздел "Подписки" и отмените TaskFlow PremiumUseCases. Если подписка оформлена напрямую, просто напишите нам через "Обратная связь".', + ), + new FaqDto( + question: 'Что делать, если остались вопросы?', + answer: 'Напишите нам в поддержку через приложение или на почту support@taskflow.app. Мы всегда готовы помочь!', + ), + ]; } - public function getDependencies(): array + /** + * @return BenefitsDto[] + */ + public function getBenefits(): array { - return [LanguageFixture::class]; + return [ + new BenefitsDto( + title: 'ИИ помогает достигать целей', + desc: 'Интеллектуальный помощник подсказывает приоритеты и экономит время', + icon: '/icons/ai.svg', + ), + new BenefitsDto( + title: '50 привычек и задач в день', + desc: 'Достаточно, чтобы охватить все сферы жизни', + icon: '/icons/checklist.svg', + ), + new BenefitsDto( + title: 'Кастомный календарь', + desc: 'Гибкий инструмент под твоё расписание и стиль', + icon: '/icons/calendar.svg', + ), + new BenefitsDto( + title: 'Система рейтингов', + desc: 'Соревнуйся с собой и другими', + icon: '/icons/rating.svg', + ), + new BenefitsDto( + title: 'Темы и настройка', + desc: 'Темная/светлая тема, фоны, звуки и многое другое', + icon: '/icons/theme.svg', + ), + new BenefitsDto( + title: 'Уведомления и напоминания', + desc: 'Никогда не пропусти важную задачу', + icon: '/icons/bell.svg', + ), + ]; } } diff --git a/src/Domain/Service/ResourceService/ResourceSyncInterface.php b/src/Domain/Service/ResourceService/ResourceSyncInterface.php new file mode 100644 index 0000000..cc47d19 --- /dev/null +++ b/src/Domain/Service/ResourceService/ResourceSyncInterface.php @@ -0,0 +1,42 @@ +>> $translations + */ + public function setTranslation(array $translations): bool; + + /** + * @param PremiumPlansDto[] $plans + */ + public function setPremiumPlans(array $plans): bool; + + /** + * @param HabitsTemplatesDto[] $templates + */ + public function setHabitsTemplates(array $templates): bool; + + /** + * @param FaqDto[] $faqs + */ + public function setFaq(array $faqs): bool; + + /** + * @param BenefitsDto[] $benefits + */ + public function setBenefits(array $benefits): bool; +} diff --git a/src/Infrastructure/Command/SyncResourcesCommand.php b/src/Infrastructure/Command/SyncResourcesCommand.php new file mode 100644 index 0000000..7acdee5 --- /dev/null +++ b/src/Infrastructure/Command/SyncResourcesCommand.php @@ -0,0 +1,36 @@ +resourceUseCase->saveResources(); + $output->writeln('Ресурсы успешно синхронизированы.'); + + return Command::SUCCESS; + } catch (\Throwable $e) { + $output->writeln('Ошибка: '.$e->getMessage().''); + + return Command::FAILURE; + } + } +} diff --git a/src/Infrastructure/DataFixtures/V1Fixtures/BenefitsFixtures.php b/src/Infrastructure/DataFixtures/V1Fixtures/BenefitsFixtures.php deleted file mode 100644 index dc2b7da..0000000 --- a/src/Infrastructure/DataFixtures/V1Fixtures/BenefitsFixtures.php +++ /dev/null @@ -1,57 +0,0 @@ - 'ИИ помогает достигать целей', - 'desc' => 'Интеллектуальный помощник подсказывает приоритеты и экономит время', - 'icon' => '/icons/ai.svg', - ], - [ - 'title' => '50 привычек и задач в день', - 'desc' => 'Достаточно, чтобы охватить все сферы жизни', - 'icon' => '/icons/checklist.svg', - ], - [ - 'title' => 'Кастомный календарь', - 'desc' => 'Гибкий инструмент под твоё расписание и стиль', - 'icon' => '/icons/calendar.svg', - ], - [ - 'title' => 'Система рейтингов', - 'desc' => 'Соревнуйся с собой и другими', - 'icon' => '/icons/rating.svg', - ], - [ - 'title' => 'Темы и настройка', - 'desc' => 'Темная/светлая тема, фоны, звуки и многое другое', - 'icon' => '/icons/theme.svg', - ], - [ - 'title' => 'Уведомления и напоминания', - 'desc' => 'Никогда не пропусти важную задачу', - 'icon' => '/icons/bell.svg', - ], - ]; - - foreach ($features as $feature) { - $plan = new Benefits(); - $plan->setTitle($feature['title']); - $plan->setDesc($feature['desc']); - $plan->setIconPath($feature['icon']); - - $manager->persist($plan); - } - - $manager->flush(); - } -} diff --git a/src/Infrastructure/DataFixtures/V1Fixtures/FAQFixtures.php b/src/Infrastructure/DataFixtures/V1Fixtures/FAQFixtures.php deleted file mode 100644 index c172e15..0000000 --- a/src/Infrastructure/DataFixtures/V1Fixtures/FAQFixtures.php +++ /dev/null @@ -1,42 +0,0 @@ - 'Можно ли вернуть деньги после покупки?', - 'answer' => 'Да, вы можете оформить возврат в течение 14 дней после оплаты. Просто отправьте нам запрос через раздел "Обратная связь" в приложении. Если вы оформили подписку через App Store или Google Play, отмену и возврат необходимо оформить через соответствующую платформу.', - ], - [ - 'question' => 'Что будет с моими данными, если я не продлю подписку?', - 'answer' => 'Мы не удалим ваши привычки, задачи и статистику. Всё останется сохранено. Если количество привычек превышает лимит бесплатной версии, привычки с низким приоритетом будут автоматически перемещены в архив. Доступ к премиум-функциям будет временно ограничен до продления подписки.', - ], - [ - 'question' => 'Как отменить подписку?', - 'answer' => 'Если вы оформили подписку через Google Play или App Store — откройте соответствующее приложение, перейдите в раздел "Подписки" и отмените TaskFlow PremiumUseCases. Если подписка оформлена напрямую, просто напишите нам через "Обратную связь".', - ], - [ - 'question' => 'Что делать, если остались вопросы?', - 'answer' => 'Напишите нам в поддержку через приложение или на почту support@taskflow.app. Мы всегда готовы помочь!', - ], - ]; - - foreach ($faqs as $data) { - $faq = new Faqs(); - $faq->setQuestion($data['question']); - $faq->setAnswer($data['answer']); - - $manager->persist($faq); - } - - $manager->flush(); - } -} diff --git a/src/Infrastructure/DataFixtures/V1Fixtures/HabitsTemplatesFixtures.php b/src/Infrastructure/DataFixtures/V1Fixtures/HabitsTemplatesFixtures.php deleted file mode 100644 index c2be456..0000000 --- a/src/Infrastructure/DataFixtures/V1Fixtures/HabitsTemplatesFixtures.php +++ /dev/null @@ -1,59 +0,0 @@ - 'Ранний подъем', - 'quote' => 'Кто рано встает, тому Бог дает!', - 'notification' => '06:30', - 'datesType' => 'daily', - ], - [ - 'title' => 'Утренняя пробежка', - 'quote' => 'Бег - это жизнь!', - 'notification' => '10:30', - 'datesType' => 'daily', - ], - [ - 'title' => 'Чтение книги', - 'quote' => 'Книги - корабли мысли', - 'notification' => '16:30', - 'datesType' => 'daily', - ], - [ - 'title' => 'Медитация', - 'quote' => 'Тишина - великий учитель', - 'notification' => '14:30', - 'datesType' => 'daily', - ], - ]; - - foreach ($habitTemplates as $data) { - $existing = $manager->getRepository(HabitsTemplates::class) - ->findOneBy(['title_template' => $data['title']]); - - if ($existing) { - continue; - } - $habit = new HabitsTemplates(); - $habit->setTitleTemplate($data['title']); - $habit->setQuoteTemplate($data['quote']); - $habit->setNotificationTemplate($data['notification']); - $habit->setDatesTypeTemplate($data['datesType']); - $manager->persist($habit); - } - - $manager->flush(); - } -} diff --git a/src/Infrastructure/DataFixtures/V1Fixtures/LanguageFixture.php b/src/Infrastructure/DataFixtures/V1Fixtures/LanguageFixture.php deleted file mode 100644 index 9b66394..0000000 --- a/src/Infrastructure/DataFixtures/V1Fixtures/LanguageFixture.php +++ /dev/null @@ -1,39 +0,0 @@ - 'Русский', 'prefix' => 'ru'], - ['name' => 'English', 'prefix' => 'en'], - ['name' => 'Қазақ тілі', 'prefix' => 'kz'], - ['name' => 'Deutsch', 'prefix' => 'de'], - ['name' => 'Кыргыз тили', 'prefix' => 'kg'], - ['name' => 'O‘zbek tili', 'prefix' => 'uz'], - ['name' => '한국어', 'prefix' => 'ko'], - ['name' => '日本語', 'prefix' => 'ja'], - ]; - - foreach ($languages as $langData) { - $existing = $manager->getRepository(Language::class) - ->findOneBy(['name' => $langData['name']]); - - if ($existing) { - continue; - } - $language = new Language(); - $language->setName($langData['name']); - $language->setPrefix($langData['prefix']); - $manager->persist($language); - } - - $manager->flush(); - } -} diff --git a/src/Infrastructure/DataFixtures/V1Fixtures/PremiumPlanFixtures.php b/src/Infrastructure/DataFixtures/V1Fixtures/PremiumPlanFixtures.php deleted file mode 100644 index 0c6ad98..0000000 --- a/src/Infrastructure/DataFixtures/V1Fixtures/PremiumPlanFixtures.php +++ /dev/null @@ -1,58 +0,0 @@ - 'Free', - 'desc' => 'Базовые функции для старта', - 'price' => '0₸ / мес', - 'features' => ['20 задач в день', '5 привычек', 'Матрица Эйзенхауэра', 'Помодоро', 'Базовый Кастомный фон'], - 'highlight' => true, - ], - [ - 'name' => 'Pro', - 'desc' => 'Для продуктивной работы', - 'price' => '999₸ / мес', - 'features' => [ - '50 задач в день', - '50 привычек', - 'Кастомный фон', - 'ИИ-помощник', - 'канбан', - 'Больше звуков для помодора', - 'полный Кастомный фон и возможность добавлять свой фоны', - ], - 'highlight' => true, - ], - [ - 'name' => 'Pro Год', - 'desc' => 'Экономия и приоритет', - 'price' => '9 999₸ / год', - 'features' => ['Всё из Pro', 'Приоритетная поддержка'], - 'highlight' => true, - ], - ]; - - foreach ($plans as $data) { - $plan = new PremiumPlans(); - $plan->setName($data['name']); - $plan->setDesc($data['desc']); - $plan->setPrice($data['price']); - $plan->setFeatures($data['features']); - $plan->setHighlight($data['highlight']); - - $manager->persist($plan); - } - - $manager->flush(); - } -} diff --git a/src/Infrastructure/Service/ResourceService/ResourceSyncService.php b/src/Infrastructure/Service/ResourceService/ResourceSyncService.php new file mode 100644 index 0000000..08e1488 --- /dev/null +++ b/src/Infrastructure/Service/ResourceService/ResourceSyncService.php @@ -0,0 +1,198 @@ +manager->getRepository(Language::class) + ->findOneBy(['prefix' => $langData->prefix]); + + if ($existing) { + continue; + } + + $language = new Language(); + $language->setName($langData->name); + $language->setPrefix($langData->prefix); + $this->manager->persist($language); + } + + $this->manager->flush(); + + return true; + } + + /** + * @param array>> $translations + */ + public function setTranslation(array $translations): bool + { + $languages = $this->manager->getRepository(Language::class)->findAll(); + $languagesByPrefix = []; + foreach ($languages as $lang) { + $languagesByPrefix[$lang->getPrefix()] = $lang; + } + foreach ($translations as $pageName => $pageTranslations) { + foreach ($languagesByPrefix as $prefix => $language) { + if (!$language) { + continue; + } + + $pageTranslate = $this->extractTranslationsForLanguage($pageTranslations, $prefix); + + $existing = $this->manager->getRepository(LanguagePageTranslation::class) + ->findOneBy([ + 'pageName' => $pageName, + 'language' => $language, + ]); + + if ($existing) { + $existing->setPageTranslate($pageTranslate); + } else { + $translation = new LanguagePageTranslation(); + $translation->setPageName($pageName); + $translation->setPageTranslate($pageTranslate); + $translation->setLanguage($language); + + $this->manager->persist($translation); + } + } + } + + $this->manager->flush(); + + return true; + } + + /** + * @param array $translations + * + * @return array + */ + private function extractTranslationsForLanguage(array $translations, string $languageCode): array + { + $result = []; + + foreach ($translations as $key => $value) { + if (is_array($value)) { + if (isset($value[$languageCode]) && is_string($value[$languageCode])) { + $result[$key] = $value[$languageCode]; + } else { + $nested = $this->extractTranslationsForLanguage($value, $languageCode); + foreach ($nested as $nestedKey => $nestedValue) { + $result[$key.'.'.$nestedKey] = $nestedValue; + } + } + } + } + + return $result; + } + + /** + * @param PremiumPlansDto[] $plans + */ + public function setPremiumPlans(array $plans): bool + { + foreach ($plans as $data) { + $plan = new PremiumPlans(); + $plan->setName($data->name); + $plan->setDesc($data->desc); + $plan->setPrice($data->price); + $plan->setFeatures($data->features); + $plan->setHighlight($data->highlight); + $this->manager->persist($plan); + } + + $this->manager->flush(); + + return true; + } + + /** + * @param HabitsTemplatesDto[] $templates + */ + public function setHabitsTemplates(array $templates): bool + { + foreach ($templates as $data) { + $existing = $this->manager->getRepository(HabitsTemplates::class) + ->findOneBy(['title_template' => $data->title]); + + if ($existing) { + continue; + } + $habit = new HabitsTemplates(); + $habit->setTitleTemplate($data->title); + $habit->setQuoteTemplate($data->quote); + $habit->setNotificationTemplate($data->notification); + $habit->setDatesTypeTemplate($data->datesType); + $this->manager->persist($habit); + } + + $this->manager->flush(); + + return true; + } + + /** + * @param FaqDto[] $faqs + */ + public function setFaq(array $faqs): bool + { + foreach ($faqs as $data) { + $faq = new Faqs(); + $faq->setQuestion($data->question); + $faq->setAnswer($data->answer); + + $this->manager->persist($faq); + } + + $this->manager->flush(); + + return true; + } + + /** + * @param BenefitsDto[] $benefits + */ + public function setBenefits(array $benefits): bool + { + foreach ($benefits as $feature) { + $plan = new Benefits(); + $plan->setTitle($feature->title); + $plan->setDesc($feature->desc); + $plan->setIconPath($feature->icon); + + $this->manager->persist($plan); + } + + $this->manager->flush(); + + return true; + } +}