├── - ├── .DS_Store ├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── .scribe ├── .filehashes ├── auth.md ├── endpoints.cache │ └── 00.yaml ├── endpoints │ ├── 00.yaml │ └── custom.0.yaml └── intro.md ├── API_REFRENCE.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTORS_GUIDE.md ├── Dockerfile ├── LICENSE ├── README.md ├── app ├── Console │ └── Kernel.php ├── Enums │ └── PlanType.php ├── Events │ └── NotificationCreated.php ├── Exceptions │ └── Handler.php ├── Exports │ └── UsersExport.php ├── Helpers │ └── ResponseHelper.php ├── Http │ ├── Controllers │ │ ├── Api │ │ │ └── V1 │ │ │ │ ├── Admin │ │ │ │ ├── AdminController.php │ │ │ │ ├── AdminDashboardController.php │ │ │ │ ├── BlogController.php │ │ │ │ ├── CustomerController.php │ │ │ │ ├── EmailTemplateController.php │ │ │ │ ├── FaqController.php │ │ │ │ ├── Plan │ │ │ │ │ ├── FeatureController.php │ │ │ │ │ └── SubscriptionController.php │ │ │ │ ├── SendEmailController.php │ │ │ │ └── SettingsController.php │ │ │ │ ├── ApiStatusCheckerController.php │ │ │ │ ├── ArticleController.php │ │ │ │ ├── Auth │ │ │ │ ├── AuthController.php │ │ │ │ ├── AuthController1.php │ │ │ │ ├── ForgetPasswordRequestController.php │ │ │ │ ├── ForgotResetPasswordController.php │ │ │ │ ├── LoginController.php │ │ │ │ ├── LoginController1.php │ │ │ │ ├── MagicLinkController.php │ │ │ │ ├── ResetUserPasswordController.php │ │ │ │ ├── SocialAuthController.php │ │ │ │ └── VerificationController.php │ │ │ │ ├── BlogSearchController.php │ │ │ │ ├── CategoryController.php │ │ │ │ ├── CommentController.php │ │ │ │ ├── ContactController.php │ │ │ │ ├── CookiePreferencesController.php │ │ │ │ ├── HelpArticleController.php │ │ │ │ ├── JobController.php │ │ │ │ ├── JobSearchController.php │ │ │ │ ├── LanguageController.php │ │ │ │ ├── NewsletterSubscriptionController.php │ │ │ │ ├── NotificationPreferenceController.php │ │ │ │ ├── Organisation │ │ │ │ ├── OrganisationController.php │ │ │ │ └── OrganisationMemberController.php │ │ │ │ ├── PaymentController.php │ │ │ │ ├── PreferenceController.php │ │ │ │ ├── ProductController.php │ │ │ │ ├── ProductController1.php │ │ │ │ ├── RoleController.php │ │ │ │ ├── SqueezeController.php │ │ │ │ ├── SqueezePageController.php │ │ │ │ ├── Testimonial │ │ │ │ └── TestimonialController.php │ │ │ │ ├── TimezoneController.php │ │ │ │ ├── User │ │ │ │ ├── AccountController.php │ │ │ │ ├── DashboardController.php │ │ │ │ ├── ExportUserController.php │ │ │ │ ├── ProfileController.php │ │ │ │ ├── SubscriptionController.php │ │ │ │ └── UserController.php │ │ │ │ ├── WaitListController.php │ │ │ │ └── apiupdate.php │ │ ├── BillingPlanController.php │ │ ├── Controller.php │ │ ├── InvitationAcceptanceController.php │ │ ├── NotificationSettingController.php │ │ ├── Prometheus │ │ │ └── MetricsController.php │ │ ├── SqueezePageUserController.php │ │ └── UserNotificationController.php │ ├── Kernel.php │ ├── Middleware │ │ ├── AdminMiddleware.php │ │ ├── AlwaysAcceptJson.php │ │ ├── Authenticate.php │ │ ├── EncryptCookies.php │ │ ├── EnsureEmailIsVerified.php │ │ ├── JwtMiddleware.php │ │ ├── LoginAttempts.php │ │ ├── PreventRequestsDuringMaintenance.php │ │ ├── Prometheus │ │ │ ├── AllowLocalhostOnly.php │ │ │ └── PrometheusMetricsMiddleware.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── SuperAdminMiddleware.php │ │ ├── TrimStrings.php │ │ ├── TrustHosts.php │ │ ├── TrustProxies.php │ │ ├── ValidateSignature.php │ │ └── VerifyCsrfToken.php │ ├── Requests │ │ ├── CreateNotificationRequest.php │ │ ├── CreateProductRequest.php │ │ ├── CustomerRequest.php │ │ ├── DeleteSqueezeRequest.php │ │ ├── FilterSqueezeRequest.php │ │ ├── Plan │ │ │ ├── FeatureRequest.php │ │ │ └── SubscriptionRequest.php │ │ ├── Preference │ │ │ ├── DeletePreferenceRequest.php │ │ │ ├── SavePreferencesRequest.php │ │ │ ├── StorePreferenceRequest.php │ │ │ └── UpdatePreferenceRequest.php │ │ ├── StoreApiStatusDataRequest.php │ │ ├── StoreOrganisationRequest.php │ │ ├── StoreQuestMessageRequest.php │ │ ├── StoreRoleRequest.php │ │ ├── StoreTestimonialRequest.php │ │ ├── StoreUserRequest.php │ │ ├── UpdateFaqRequest.php │ │ ├── UpdateJobRequest.php │ │ ├── UpdateProductRequest.php │ │ ├── UpdateQuestMessageRequest.php │ │ └── UpdateRoleRequest.php │ └── Resources │ │ ├── FeatureResource.php │ │ ├── FeatureResourceCollection.php │ │ ├── OrganisationResource.php │ │ ├── OrganisationResourceCollection.php │ │ ├── ProductResource.php │ │ ├── SubscriptionResource.php │ │ └── UserResource.php ├── Jobs │ ├── SendEmailRequestsJob.php │ └── SendSqueezeEmail.php ├── Mail │ ├── AccountDeactivatedMail.php │ ├── ContactInquiryMail.php │ ├── EmailRequestMailable.php │ ├── MagicLinkEmail.php │ ├── NewsletterSubcriptionMail.php │ ├── SqueezeTemplateMail.php │ └── WaitlistConfirmation.php ├── Models │ ├── ApiStatus.php │ ├── Article.php │ ├── BillingPlan.php │ ├── Blog.php │ ├── BlogTag.php │ ├── Category.php │ ├── CategoryProduct.php │ ├── Comment.php │ ├── CookiePreference.php │ ├── EmailRequest.php │ ├── EmailTemplate.php │ ├── Faq.php │ ├── Feature.php │ ├── Gateway.php │ ├── HelpArticle.php │ ├── Inquiry.php │ ├── Invitation.php │ ├── Job.php │ ├── JobApplication.php │ ├── JobUser.php │ ├── Language.php │ ├── NewsletterSubscription.php │ ├── Notification.php │ ├── NotificationPreference.php │ ├── NotificationSetting.php │ ├── Order.php │ ├── Organisation.php │ ├── OrganisationBillingPlan.php │ ├── OrganisationUser.php │ ├── Payment.php │ ├── Permission.php │ ├── Preference.php │ ├── Product.php │ ├── ProductVariant.php │ ├── ProductVariantSize.php │ ├── Profile.php │ ├── Quest.php │ ├── QuestMessage.php │ ├── Region.php │ ├── Role.php │ ├── RolePermission.php │ ├── Size.php │ ├── Squeeze.php │ ├── SqueezeList.php │ ├── SqueezePage.php │ ├── SqueezePageUser.php │ ├── SubscriptionPlan.php │ ├── Testimonial.php │ ├── Timezone.php │ ├── User.php │ ├── UserNotification.php │ ├── UserSubscription.php │ ├── Validators │ │ └── AuthValidator.php │ └── WaitList.php ├── Notifications │ ├── ResetPasswordNotification.php │ └── ResetPasswordToken.php ├── Policies │ └── OrganisationPolicy.php ├── Providers │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── BroadcastServiceProvider.php │ ├── EventServiceProvider.php │ ├── PrometheusServiceProvider.php │ ├── RouteServiceProvider.php │ └── SwaggerUiServiceProvider.php ├── Rules │ └── ValidatePlanType.php ├── Services │ ├── OrganisationService.php │ └── PaymentService.php └── Traits │ └── HttpResponses.php ├── artisan ├── bootstrap ├── app.php └── cache │ └── .gitignore ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── broadcasting.php ├── cache.php ├── cors.php ├── database.php ├── excel.php ├── filesystems.php ├── hashing.php ├── jwt.php ├── logging.php ├── mail.php ├── queue.php ├── sanctum.php ├── scribe.php ├── scribe.php.bak ├── services.php ├── session.php ├── swagger-ui.php └── view.php ├── custom_endpoints.yaml ├── database ├── .gitignore ├── factories │ ├── ArticleFactory.php │ ├── BillingPlanFactory.php │ ├── BlogCategoryFactory.php │ ├── BlogFactory.php │ ├── CategoryFactory.php │ ├── CommentFactory.php │ ├── CookiePreferenceFactory.php │ ├── EmailRequestFactory.php │ ├── EmailTemplateFactory.php │ ├── FaqFactory.php │ ├── FeatureFactory.php │ ├── InvitationFactory.php │ ├── JobApplicationFactory.php │ ├── JobFactory.php │ ├── NotificationFactory.php │ ├── NotificationPreferenceFactory.php │ ├── NotificationSettingFactory.php │ ├── OrderFactory.php │ ├── OrganisationBillingPlanFactory.php │ ├── OrganisationFactory.php │ ├── PaymentFactory.php │ ├── PermissionFactory.php │ ├── PreferenceFactory.php │ ├── ProductFactory.php │ ├── ProductVariantFactory.php │ ├── ProductVariantSizeFactory.php │ ├── ProfileFactory.php │ ├── RegionFactory.php │ ├── RoleFactory.php │ ├── SMSRequestFactory.php │ ├── SMSTemplateFactory.php │ ├── SizeFactory.php │ ├── SqueezeListFactory.php │ ├── SqueezePageFactory.php │ ├── SqueezePageUserFactory.php │ ├── SubscriptionPlanFactory.php │ ├── TestimonialFactory.php │ ├── TimezoneFactory.php │ ├── UserFactory.php │ ├── UserNotificationFactory.php │ ├── UserSubscriptionFactory.php │ └── WaitListFactory.php ├── migrations │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2014_10_12_100000_create_password_reset_tokens_table.php │ ├── 2014_10_21_145617_create_testimonials_table.php │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ ├── 2019_12_14_000001_create_personal_access_tokens_table.php │ ├── 2024_07_18_200658_create_profiles_table.php │ ├── 2024_07_18_200734_create_organisations_table.php │ ├── 2024_07_18_200840_create_products_table.php │ ├── 2024_07_18_202000_create_organisation_users_table.php │ ├── 2024_07_20_121051_create_articles_table.php │ ├── 2024_07_20_131306_create_subscription_plans_table.php │ ├── 2024_07_20_141031_create_features_table.php │ ├── 2024_07_20_142941_features_subscription_plans_table.php │ ├── 2024_07_20_220105_create_categories_table.php │ ├── 2024_07_21_034529_create_jobs_table.php │ ├── 2024_07_21_042346_create_blogs_table.php │ ├── 2024_07_21_045055_create_squeezes_table.php │ ├── 2024_07_21_100956_add_columns_to_blogs_table.php │ ├── 2024_07_21_115606_modify_content_length_in_blogs_table.php │ ├── 2024_07_21_121534_create_permissions_table.php │ ├── 2024_07_21_121543_create_roles_table.php │ ├── 2024_07_21_121928_create_roles_permissions_table.php │ ├── 2024_07_21_123053_create_users_permissions_table.php │ ├── 2024_07_21_123058_create_users_roles_table.php │ ├── 2024_07_21_164302_create_job_users_table.php │ ├── 2024_07_21_201715_add_soft_delete_to_blogs_table.php │ ├── 2024_07_23_091923_create_invitations_table.php │ ├── 2024_07_23_100558_create_notification_preferences_table.php │ ├── 2024_07_23_150138_alter_products_table.php │ ├── 2024_07_23_151221_add_to_jobs_table.php │ ├── 2024_07_23_171710_create_preferences_table.php │ ├── 2024_07_23_172637_create_user_subscriptions_table.php │ ├── 2024_07_24_011913_remove_column_from_blogs.php │ ├── 2024_07_24_012000_add_blog_tags_table.php │ ├── 2024_07_24_014449_create_blog_images_table.php │ ├── 2024_07_24_113926_create_category_products_table.php │ ├── 2024_07_24_114934_alter_organisations_table.php │ ├── 2024_07_24_115628_create_blog_categories_table.php │ ├── 2024_07_24_121551_create_billing_plans_table.php │ ├── 2024_07_24_122951_create_organisation_billing_plans_table.php │ ├── 2024_07_24_125615_create_comments_table.php │ ├── 2024_07_24_143448_add_indexes_to_blogs_table.php │ ├── 2024_07_28_111524_create_cookie_preferences_table.php │ ├── 2024_07_28_112025_create_job_applications_table.php │ ├── 2024_07_28_130448_create_wait_lists_table.php │ ├── 2024_07_28_130545_create_squeeze_lists_table.php │ ├── 2024_07_28_130753_create_squeeze_pages_table.php │ ├── 2024_07_28_131220_create_payments_table.php │ ├── 2024_07_28_170337_create_email_templates_table.php │ ├── 2024_07_28_170700_create_notifications_table.php │ ├── 2024_07_28_170956_create_user_notifications_table.php │ ├── 2024_07_29_142639_alter_and_add_more_column_to_products.php │ ├── 2024_07_29_142853_create_size_table.php │ ├── 2024_07_29_143212_create_product_variants.php │ ├── 2024_07_29_212420_create_product_variant_sizes.php │ ├── 2024_07_30_105146_alter_product_add_orgid.php │ ├── 2024_07_30_114205_create_faqs_table.php │ ├── 2024_07_31_215939_create_inquiries_table.php │ ├── 2024_08_01_043354_add_paystack_and_flutter_plan_codes_to_subscription_plans_table.php │ ├── 2024_08_01_051659_update_payments_table_add_transaction_id.php │ ├── 2024_08_01_085815_create_email_requests_table.php │ ├── 2024_08_01_094152_modify_columns_on_blogs_table.php │ ├── 2024_08_01_143905_alter_columns_on_squeezes_table.php │ ├── 2024_08_01_152937_create_notification_settings_table.php │ ├── 2024_08_02_114218_add_soft_delete_to_users_table.php │ ├── 2024_08_02_142433_create_timezones_table.php │ ├── 2024_08_02_142500_create_regions_table.php │ ├── 2024_08_02_142513_create_languages_table.php │ ├── 2024_08_02_142606_alter_preference_table_add_columns.php │ ├── 2024_08_06_085955_add_org_id_to_user_subscriptions.php │ ├── 2024_08_06_182021_create_orders_table.php │ ├── 2024_08_06_184118_create_quests_table.php │ ├── 2024_08_06_184558_create_quest_messages_table.php │ ├── 2024_08_07_063753_add_columns_to_squeeze_pages_table.php │ ├── 2024_08_07_131402_alter_timezones_table_rename_and_add_columns.php │ ├── 2024_08_07_213218_alter_languages_table.php │ ├── 2024_08_08_083933_update_faqs_table.php │ ├── 2024_08_08_115517_create_newsletter_subscriptions_table.php │ ├── 2024_08_08_155430_create_squeeze_pages_user_table.php │ ├── 2024_08_24_074917_create_api_statuses_table.php │ └── 2025_03_01_052032_add_magic_link_columns_to_users_table.php └── seeders │ ├── AdminSeeder.php │ ├── ArticlesTableSeeder.php │ ├── BillingPlanSeeder.php │ ├── BlogSeeder.php │ ├── CategoriesTableSeeder.php │ ├── CommentSeeder.php │ ├── CookiePreferenceSeeder.php │ ├── DatabaseSeeder.php │ ├── EmailRequestSeeder.php │ ├── EmailTemplateSeeder.php │ ├── FaqSeeder.php │ ├── InvitationSeeder.php │ ├── JobApplicationSeeder.php │ ├── LanguagesTableSeeder.php │ ├── NotificationPreferenceSeeder.php │ ├── NotificationSeeder.php │ ├── NotificationSettingSeeder.php │ ├── OrderSeeder.php │ ├── OrganisationBillingPlanSeeder.php │ ├── OrganisationSeeder.php │ ├── PaymentSeeder.php │ ├── PermissionSeeder.php │ ├── PreferenceSeeder.php │ ├── ProductSeeder.php │ ├── ProductVariantSeeder.php │ ├── ProductVariantSizeSeeder.php │ ├── ProfileSeeder.php │ ├── QuestMessageSeeder.php │ ├── QuestSeeder.php │ ├── RegionSeeder.php │ ├── RoleSeeder.php │ ├── SizeSeeder.php │ ├── SqueezeListSeeder.php │ ├── SqueezePageSeeder.php │ ├── SqueezePageUserSeeder.php │ ├── SubscriptionPlanSeeder.php │ ├── TimezoneSeeder.php │ ├── UserJobSeeder.php │ ├── UserNotificationSeeder.php │ └── WaitListSeeder.php ├── docker-compose.prod.ymll ├── docker-compose.staging.yml ├── docker-compose.yml ├── package-lock.json ├── package.json ├── phpunit.xml ├── postman-api-tests.json ├── public ├── .htaccess ├── favicon.ico ├── index.php ├── robots.txt ├── uploads │ ├── 1722977096.jpg │ ├── 1722977574.jpg │ ├── 1722978653.jpg │ ├── 1722978978.jpg │ ├── 1722984249.jpg │ ├── 1722986116.jpg │ ├── 1722986951.jpg │ ├── 1722987043.jpg │ ├── 1722989699.jpg │ ├── 1722989897.jpg │ ├── 1722990809.jpg │ ├── 1723005492.jpg │ ├── 1723005641.jpg │ ├── 1723005793.jpg │ ├── 1723006364.jpg │ ├── 1723006536.jpg │ ├── 1723006580.jpg │ ├── 1723007660.jpg │ ├── 1723037656.jpg │ ├── 1723038561.jpg │ ├── 1723041952.jpg │ ├── 1723050163.jpg │ ├── 1723050675.jpg │ ├── 1723051293.jpg │ ├── 1723052951.jpg │ ├── 1723053078.jpg │ ├── 1723053336.jpg │ ├── 1723063093.jpg │ ├── 1723065375.jpg │ ├── 1723065604.jpg │ ├── 1723066655.jpg │ ├── 1723066919.jpg │ ├── 1723068692.jpg │ ├── 1723076130.jpg │ ├── 1723077805.jpg │ ├── 1723099428.jpg │ ├── 1723107462.jpg │ ├── 1723108399.jpg │ ├── 1723108979.jpg │ ├── 1723109232.jpg │ ├── 1723122054.jpg │ ├── 1723124275.jpg │ ├── 1723126010.jpg │ ├── 1723128635.jpg │ ├── 1723134494.jpg │ ├── 1723135020.jpg │ ├── 1723135061.jpg │ ├── 1723135410.jpg │ ├── 1723137107.jpg │ ├── 1723144500.jpg │ ├── 1723194360.jpg │ ├── 1724158752.jpg │ ├── 1724159454.jpg │ ├── 1724219479.jpg │ ├── 1724226709.jpg │ ├── 1724228441.jpg │ └── product_images │ │ ├── 1724191282.jpg │ │ ├── 1724191434.jpg │ │ ├── 1724192878.png │ │ ├── 1724192919.png │ │ ├── 1724193022.png │ │ ├── 1724220452.jpg │ │ ├── 1724220476.jpg │ │ ├── 1724220589.jpg │ │ ├── 1724220628.jpg │ │ ├── 1724220685.jpg │ │ ├── 1724220790.jpg │ │ ├── 1724223912.png │ │ ├── 1724226700.jpg │ │ ├── 1724228045.jpg │ │ └── 1724228438.jpg └── vendor │ └── scribe │ ├── backup-copydocumentation.json │ ├── css │ ├── theme-default.print.css │ └── theme-default.style.css │ ├── doc.yaml │ ├── documentation copy.json │ ├── documentation.json │ ├── images │ └── navbar.png │ └── js │ ├── theme-default-4.37.1.js │ └── tryitout-4.37.1.js ├── resources ├── css │ └── app.css ├── docs │ ├── backup-copydocumentation.json │ ├── doc.yaml │ ├── docs tulbadex.json │ ├── docs.json │ ├── documentation copy.json │ └── documentation.json ├── js │ ├── app.js │ └── bootstrap.js └── views │ ├── emails │ ├── deactivated.blade.php │ ├── generic.blade.php │ ├── magic_link.blade.php │ ├── newsletter_subcription.blade.php │ ├── squeeze_template.blade.php │ └── waitlist_confirmation.blade.php │ ├── mail │ └── contact-inquiry-mail.blade.php │ ├── scribe │ └── index.blade.php │ └── welcome.blade.php ├── role ├── routes ├── api.php ├── channels.php ├── console.php └── web.php ├── send-postman-api-tests-results.php ├── storage ├── app │ ├── .gitignore │ └── public │ │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ ├── .gitignore │ │ └── data │ │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── test_api.py ├── tests ├── CreatesApplication.php ├── Feature │ ├── AdminDashboardTest.php │ ├── Api │ │ └── V1 │ │ │ └── Auth │ │ │ └── MagicLinkTest.php │ ├── ArticleTest.php │ ├── BillingPlanControllerTest.php │ ├── BlogControllerTest.php │ ├── BlogSearchTest.php │ ├── CommentControllerTest.php │ ├── ContactControllerTest.php │ ├── CookiePreferencesTest.php │ ├── CustomerControllerTest.php │ ├── DeactivateAccountTest.php │ ├── DeleteSqueezeTest.php │ ├── EmailTemplateControllerTest.php │ ├── EmailVerificationTest.php │ ├── FaqControllerTest.php │ ├── FeatureTest.php │ ├── ForgetPasswordRequestTest.php │ ├── GetAllRolesTest.php │ ├── InvitationTest.php │ ├── JobControllerTest.php │ ├── LanguageControllerTest.php │ ├── Notifications │ │ ├── CreateNotificationTest.php │ │ └── GetNotificationsTest.php │ ├── OrganisationDeletionTest.php │ ├── OrganisationMemberControllerTest.php │ ├── OrganisationRemoveUserTest.php │ ├── OrganisationRoleTest.php │ ├── OrganisationTest.php │ ├── PermissionTest.php │ ├── PreferenceControllerTest.php │ ├── ProductControllerTest.php │ ├── ProductCreateTest.php │ ├── ProductSearchTest.php │ ├── ProductTest.php │ ├── ProductUpdateTest.php │ ├── ProfileUpdateTest.php │ ├── ResetUserPasswordTest.php │ ├── RetrieveAllSubscriptionPlansTest.php │ ├── RoleCreationTest.php │ ├── RoleDeletionTest.php │ ├── RoleUpdateTest.php │ ├── SearchAndFilterSqueezeTest.php │ ├── SendEmailRequestsTest.php │ ├── ShowRoleTest.php │ ├── SqueezePageActivationTest.php │ ├── SqueezePageUserControllerTest.php │ ├── SqueezePagesTest.php │ ├── TestimonialTest.php │ ├── TimezoneTest.php │ ├── UpdatePasswordTest.php │ ├── UserDashboardTest.php │ ├── UserDeletionTest.php │ ├── UserUpdateTest.php │ └── WaitListControllerTest.php ├── TestCase.php └── Unit │ ├── DisableRoleTest.php │ ├── ExportAllUserDataTest.php │ ├── ForgetPasswordRequestTest.php │ ├── LoginTest.php │ ├── LogoutTest.php │ ├── NewsletterSubscriptionCreateTest.php │ ├── ProductDeleteTest.php │ ├── RegistrationTest.php │ ├── SqueezeControllerTest.php │ └── UpdateNotificationPreferenceTest.php ├── vite.config.js └── webhortiz-SubPlanFeature-1.0.0-resolved.yaml /-: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/- -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/.DS_Store -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 4 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | 17 | [docker-compose.yml] 18 | indent_size = 4 19 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | 3 | *.blade.php diff=html 4 | *.css diff=css 5 | *.html diff=html 6 | *.md diff=markdown 7 | *.php diff=php 8 | 9 | /.github export-ignore 10 | CHANGELOG.md export-ignore 11 | .styleci.yml export-ignore 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.phpunit.cache 2 | /node_modules 3 | /public/build 4 | /public/hot 5 | /public/storage 6 | /storage/*.key 7 | /vendor 8 | .env 9 | .env.backup 10 | .env.production 11 | .phpunit.result.cache 12 | Homestead.json 13 | Homestead.yaml 14 | auth.json 15 | npm-debug.log 16 | yarn-error.log 17 | /.fleet 18 | /.idea 19 | /.vscode 20 | docker-compose.yml 21 | /public/uploads 22 | ResponseHTTP_OK, 23 | can 24 | result.json 25 | -------------------------------------------------------------------------------- /.scribe/.filehashes: -------------------------------------------------------------------------------- 1 | # GENERATED. YOU SHOULDN'T MODIFY OR DELETE THIS FILE. 2 | # Scribe uses this file to know when you change something manually in your docs. 3 | .scribe/intro.md=c01f16c622132cbe2797085dcd335e9f 4 | .scribe/auth.md=9bee2b1ef8a238b2e58613fa636d5f39 -------------------------------------------------------------------------------- /.scribe/auth.md: -------------------------------------------------------------------------------- 1 | # Authenticating requests 2 | 3 | This API is not authenticated. 4 | -------------------------------------------------------------------------------- /.scribe/intro.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | 4 | 5 | 8 | 9 | This documentation aims to provide all the information you need to work with our API. 10 | 11 | 13 | 14 | -------------------------------------------------------------------------------- /API_REFRENCE.md: -------------------------------------------------------------------------------- 1 | # [App Name] Integration API Documentation 2 | 3 | ## Overview 4 | 5 | [Description] 6 | 7 | ## Base URL 8 | 9 | - Live URL: `https://example.com/api/v1` 10 | - Staging URL: `https://staging.example.com/api/v1` 11 | 12 | ## [Section] 13 | 14 | ### [Endpoint] 15 | 16 | #### [SubTitle] 17 | 18 | - **Endpoint:** `/api/[version]/[endpoint]` 19 | - **Method:** [HTTP-Method] 20 | - **Description:** [Description] 21 | 22 | **Body:** 23 | 24 | ```json 25 | { 26 | "[Key]": "[value]" 27 | } 28 | ``` 29 | 30 | **Success Response:** 31 | 32 | - **Code:** [Code] 33 | - **Content:** 34 | 35 | ```json 36 | { 37 | "status": true, 38 | "message": "[Message]", 39 | "data": { 40 | "[Key]": "[value]" 41 | } 42 | } 43 | ``` 44 | 45 | **Error Responses:** 46 | 47 | - **Code:** [Status-Code] 48 | - **Content:** 49 | 50 | ```json 51 | { 52 | "status": false, 53 | "message": "[Message]" 54 | } 55 | ``` 56 | 57 | ## Versioning 58 | 59 | This API is versioned to ensure backward compatibility and easy maintenance. The current version is [version]. 60 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | job(new SendEmailRequestsJob())->everyMinute(); 17 | } 18 | 19 | /** 20 | * Register the commands for the application. 21 | */ 22 | protected function commands(): void 23 | { 24 | $this->load(__DIR__.'/Commands'); 25 | 26 | require base_path('routes/console.php'); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Enums/PlanType.php: -------------------------------------------------------------------------------- 1 | json([ 15 | 'status' => 'success', 16 | 'message' => 'Timezones retrieved successfully', 17 | 'data' => $timezones 18 | ]); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | render($registry->getMetricFamilySamples()); 25 | 26 | return response($metrics, 200, ['Content-Type' => RenderTextFormat::MIME_TYPE]); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Http/Middleware/AdminMiddleware.php: -------------------------------------------------------------------------------- 1 | user(); 19 | 20 | if (!$user || $user->role !== 'admin' || !$user->is_active) { 21 | return response()->json([ 22 | 'status_code' => 401, 23 | 'message' => 'Unauthorized, admin access only', 24 | 'error' => 'Bad Request' 25 | ], 401); 26 | } 27 | 28 | return $next($request); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Http/Middleware/AlwaysAcceptJson.php: -------------------------------------------------------------------------------- 1 | headers->set('Accept', 'application/json'); 19 | return $next($request); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson() ? null : route('login'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Middleware/EnsureEmailIsVerified.php: -------------------------------------------------------------------------------- 1 | user() || ! $request->user()->hasVerifiedEmail()) { 20 | return response()->json([ 21 | 'status_code' => 403, 22 | 'message' => 'Email not verified. Please verify your email to continue.', 23 | 'status' => 'error', 24 | 'data' => [] 25 | ], 403); 26 | } 27 | 28 | return $next($request); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Http/Middleware/LoginAttempts.php: -------------------------------------------------------------------------------- 1 | ip(); 20 | 21 | if (RateLimiter::tooManyAttempts($key, 3)) { 22 | return response()->json([ 23 | 'message' => 'Too Many login attempts. Please try again in one hour', 24 | 'error' => 'too_many_attempts', 25 | 'status_code' => 403 26 | ], 403); 27 | } 28 | 29 | RateLimiter::hit($key, 3600); // Lock out for an hour (3600 seconds) 30 | 31 | return $next($request); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Http/Middleware/PreventRequestsDuringMaintenance.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Middleware/Prometheus/AllowLocalhostOnly.php: -------------------------------------------------------------------------------- 1 | isLocalhost($request->ip())) { 19 | return response('Unauthorized.', 401); 20 | } 21 | return $next($request); 22 | } 23 | 24 | 25 | /** 26 | * Check if the IP address is localhost. 27 | * 28 | * @param string $ip 29 | * @return bool 30 | */ 31 | protected function isLocalhost($ip) 32 | { 33 | return in_array($ip, ['127.0.0.1', '::1']); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Http/Middleware/RedirectIfAuthenticated.php: -------------------------------------------------------------------------------- 1 | check()) { 24 | return redirect(RouteServiceProvider::HOME); 25 | } 26 | } 27 | 28 | return $next($request); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Http/Middleware/SuperAdminMiddleware.php: -------------------------------------------------------------------------------- 1 | user()->role !== 'superadmin') { 14 | return ResponseHelper::response('Unauthorized. Super Admin access only.', 403); 15 | } 16 | 17 | return $next($request); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | 'current_password', 16 | 'password', 17 | 'password_confirmation', 18 | ]; 19 | } 20 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustHosts.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | public function hosts(): array 15 | { 16 | return [ 17 | $this->allSubdomainsOfApplicationUrl(), 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustProxies.php: -------------------------------------------------------------------------------- 1 | |string|null 14 | */ 15 | protected $proxies; 16 | 17 | /** 18 | * The headers that should be used to detect proxies. 19 | * 20 | * @var int 21 | */ 22 | protected $headers = 23 | Request::HEADER_X_FORWARDED_FOR | 24 | Request::HEADER_X_FORWARDED_HOST | 25 | Request::HEADER_X_FORWARDED_PORT | 26 | Request::HEADER_X_FORWARDED_PROTO | 27 | Request::HEADER_X_FORWARDED_AWS_ELB; 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Middleware/ValidateSignature.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 'fbclid', 16 | // 'utm_campaign', 17 | // 'utm_content', 18 | // 'utm_medium', 19 | // 'utm_source', 20 | // 'utm_term', 21 | ]; 22 | } 23 | -------------------------------------------------------------------------------- /app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Requests/CreateProductRequest.php: -------------------------------------------------------------------------------- 1 | |string> 21 | */ 22 | public function rules(): array 23 | { 24 | return [ 25 | 'name' => 'required|string|max:255', 26 | 'description' => 'required|string', 27 | 'category' => 'required', 28 | 'price' => 'required|numeric', 29 | 'status' => 'required', 30 | 'quantity' => 'required', 31 | 'image_url' => 'required|file|mimes:jpeg,png,jpg,gif|max:2048', 32 | ]; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/Http/Requests/CustomerRequest.php: -------------------------------------------------------------------------------- 1 | |string> 21 | */ 22 | public function rules(): array 23 | { 24 | return [ 25 | 'limit' => ['required', 'integer', 'min:1'], 26 | 'page' => ['required', 'integer', 'min:1'], 27 | ]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Http/Requests/DeleteSqueezeRequest.php: -------------------------------------------------------------------------------- 1 | |string> 21 | */ 22 | public function rules(): array 23 | { 24 | return [ 25 | 'squeeze_page' => 'required|string|exists:squeeze_pages,id' 26 | ]; 27 | } 28 | 29 | protected function prepareForValidation() 30 | { 31 | $this->merge([ 32 | 'squeeze_page' => $this->route('squeeze_page'), 33 | ]); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Http/Requests/FilterSqueezeRequest.php: -------------------------------------------------------------------------------- 1 | |string> 21 | */ 22 | public function rules(): array 23 | { 24 | return [ 25 | 'status' => 'required|string|in:online,offline', 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Requests/Plan/FeatureRequest.php: -------------------------------------------------------------------------------- 1 | |string> 21 | */ 22 | public function rules(): array 23 | { 24 | return [ 25 | 'feature' => 'string|required|unique:features,feature', 26 | 'description' => 'string|sometimes|max:255' 27 | ]; 28 | } 29 | 30 | public function attributes() 31 | { 32 | return [ 33 | 'feature' => 'feature title' 34 | ]; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/Http/Requests/Preference/SavePreferencesRequest.php: -------------------------------------------------------------------------------- 1 | |string> 21 | */ 22 | public function rules(): array 23 | { 24 | return [ 25 | 'language_id' => ['nullable','string'], 26 | 'region_id' => ['nullable','string'], 27 | 'timezone_id' => ['nullable','string'], 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Http/Requests/StoreApiStatusDataRequest.php: -------------------------------------------------------------------------------- 1 | |string> 21 | */ 22 | public function rules(): array 23 | { 24 | return [ 25 | 'api_group' => ['nullable', 'string'], 26 | 'method' => ['nullable', 'string'], 27 | 'status' => ['nullable', 'string'], 28 | 'response_time' => ['nullable'], 29 | 'last_checked' => ['nullable'], 30 | 'details' => ['nullable', 'string'], 31 | ]; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Http/Requests/StoreQuestMessageRequest.php: -------------------------------------------------------------------------------- 1 | |string> 21 | */ 22 | public function rules(): array 23 | { 24 | return [ 25 | // 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Requests/StoreUserRequest.php: -------------------------------------------------------------------------------- 1 | |string> 22 | */ 23 | public function rules(): array 24 | { 25 | return [ 26 | 'name' => 'required|string|max:255', 27 | 'email' => 'required|string|email|max:255|unique:users', 28 | 'password' => ['required', Password::min(8)], 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Http/Requests/UpdateProductRequest.php: -------------------------------------------------------------------------------- 1 | |string> 21 | */ 22 | public function rules(): array 23 | { 24 | return [ 25 | 'name' => 'nullable', 26 | 'quantity' => 'nullable', 27 | 'price' => 'nullable', 28 | 'category' => 'nullable', 29 | 'description' => 'sometimes', 30 | 31 | 32 | ]; 33 | } 34 | 35 | /** 36 | * Get custom attributes for validator errors. 37 | * 38 | * @return array 39 | */ 40 | } 41 | -------------------------------------------------------------------------------- /app/Http/Requests/UpdateQuestMessageRequest.php: -------------------------------------------------------------------------------- 1 | |string> 21 | */ 22 | public function rules(): array 23 | { 24 | return [ 25 | // 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Resources/FeatureResource.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | public function toArray(Request $request): array 16 | { 17 | return [ 18 | 'id' => $this->id, 19 | 'feature' => $this->feature, 20 | 'description' => $this->description, 21 | 'status' => $this->pivot->status, 22 | 'status_text' => $this->pivot->status ? 'active' : 'inactive' 23 | ]; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Resources/FeatureResourceCollection.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | public function toArray(Request $request): array 16 | { 17 | return parent::toArray($request); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Http/Resources/OrganisationResource.php: -------------------------------------------------------------------------------- 1 | $this->org_id, 15 | 'name' => $this->name, 16 | 'email' => $this->email, 17 | 'description' => $this->description, 18 | 'is_owner' => true, 19 | 'role' => 'Admin', 20 | 'industry' => $this->industry, 21 | 'type' => $this->type, 22 | 'country' => $this->country, 23 | 'address' => $this->address, 24 | 'state' => $this->state, 25 | 'created_at' => $this->created_at, 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Resources/OrganisationResourceCollection.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | public function toArray(Request $request): array 16 | { 17 | return parent::toArray($request); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Http/Resources/ProductResource.php: -------------------------------------------------------------------------------- 1 | $this->product_id, 19 | 'name' => $this->name, 20 | 'description' => $this->description, 21 | 'price' => $this->price, 22 | 'status' => $this->status, 23 | 'quantity' => $this->quantity, 24 | 'created_at' => $this->created_at, 25 | 'updated_at' => $this->updated_at, 26 | 27 | 28 | ]; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Http/Resources/SubscriptionResource.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | public function toArray(Request $request): array 16 | { 17 | return [ 18 | 'id' => $this->id, 19 | 'name' => $this->name, 20 | 'duration' => $this->duration, 21 | 'price' => $this->price, 22 | 'description' => $this->description, 23 | 'features' => new FeatureResourceCollection($this->whenLoaded('features')) 24 | ]; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Http/Resources/UserResource.php: -------------------------------------------------------------------------------- 1 | 14 | */ 15 | public function toArray(Request $request): array 16 | { 17 | return [ 18 | 'id' => $this->id, 19 | 'first_name' => $this->profile->first_name, 20 | 'last_name' => $this->profile->last_name, 21 | 'email' => $this->email, 22 | 'avatar_url' => $this->avatar_url, 23 | 'created_at' => $this->created_at, 24 | 'is_superadmin' => $this->role == 'admin' ? true : false, 25 | 'organisations' => OrganisationResource::collection($this->whenLoaded('owned_organisations')), 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Jobs/SendSqueezeEmail.php: -------------------------------------------------------------------------------- 1 | squeeze = $squeeze; 28 | } 29 | 30 | /** 31 | * Execute the job. 32 | * 33 | * @return void 34 | */ 35 | public function handle() 36 | { 37 | Mail::to($this->squeeze->email)->send(new SqueezeTemplateMail($this->squeeze)); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Mail/SqueezeTemplateMail.php: -------------------------------------------------------------------------------- 1 | squeeze = $squeeze; 19 | } 20 | 21 | public function build() 22 | { 23 | return $this->view('emails.squeeze_template') 24 | ->with([ 25 | 'first_name' => $this->squeeze->first_name, 26 | ]); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Mail/WaitlistConfirmation.php: -------------------------------------------------------------------------------- 1 | waitlist = $waitlist; 24 | } 25 | 26 | /** 27 | * Build the message. 28 | * 29 | * @return $this 30 | */ 31 | public function build() 32 | { 33 | return $this->subject('Waitlist Confirmation') 34 | ->view('emails.waitlist_confirmation'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/Models/ApiStatus.php: -------------------------------------------------------------------------------- 1 | article_id = (string) Str::uuid(); 17 | }); 18 | } 19 | protected $primaryKey = 'article_id'; 20 | protected $keyType = 'string'; 21 | public $incrementing = false; 22 | protected $fillable = ['user_id', 'title', 'content']; 23 | public function author() 24 | { 25 | return $this->belongsTo(User::class, 'user_id'); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Models/BillingPlan.php: -------------------------------------------------------------------------------- 1 | belongsToMany(Product::class, 'category_product', 'category_id', 'product_id')->using(CategoryProduct::class); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Models/CategoryProduct.php: -------------------------------------------------------------------------------- 1 | belongsTo(Blog::class); 18 | } 19 | 20 | public function user() 21 | { 22 | return $this->belongsTo(User::class); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /app/Models/CookiePreference.php: -------------------------------------------------------------------------------- 1 | 'array', 21 | ]; 22 | 23 | // Indicates if the model's ID is auto-incrementing 24 | public $incrementing = false; 25 | 26 | // Indicates the type of the model's primary key (UUID) 27 | protected $keyType = 'string'; 28 | 29 | // Define relationship with User model 30 | public function user() 31 | { 32 | return $this->belongsTo(User::class, 'user_id'); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/Models/EmailRequest.php: -------------------------------------------------------------------------------- 1 | id = (string) Str::uuid(); 28 | }); 29 | } 30 | 31 | public function template() 32 | { 33 | return $this->belongsTo(EmailTemplate::class, 'template_id'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Models/EmailTemplate.php: -------------------------------------------------------------------------------- 1 | title = Str::slug($model->title); 26 | }); 27 | } 28 | 29 | public function emailRequests() 30 | { 31 | return $this->hasMany(EmailRequest::class, 'template_id'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Models/Faq.php: -------------------------------------------------------------------------------- 1 | belongsToMany(SubscriptionPlan::class, 'features_subscription_plans') 19 | ->withPivot('status') 20 | ->withTimestamps(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Models/Gateway.php: -------------------------------------------------------------------------------- 1 | 'uuid', 17 | ]; 18 | 19 | public function payments() 20 | { 21 | return $this->hasMany(Payment::class); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Models/HelpArticle.php: -------------------------------------------------------------------------------- 1 | belongsTo(User::class, 'user_id'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Models/Inquiry.php: -------------------------------------------------------------------------------- 1 | belongsToMany(User::class, 'job_users', 'job_id', 'user_id')->using(JobUser::class); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/Models/JobApplication.php: -------------------------------------------------------------------------------- 1 | hasMany(Preference::class); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Models/NewsletterSubscription.php: -------------------------------------------------------------------------------- 1 | belongsToMany(User::class, 'user_notifications')->withPivot('status') 18 | ->withTimestamps();; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/Models/NotificationPreference.php: -------------------------------------------------------------------------------- 1 | belongsTo(User::class, 'user_id'); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Models/NotificationSetting.php: -------------------------------------------------------------------------------- 1 | belongsTo(Product::class, 'product_id'); 18 | } 19 | 20 | public function user(): BelongsTo 21 | { 22 | return $this->belongsTo(User::class, 'user_id'); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Models/OrganisationBillingPlan.php: -------------------------------------------------------------------------------- 1 | belongsTo(User::class); 26 | } 27 | 28 | public function gateway() 29 | { 30 | return $this->belongsTo(Gateway::class); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Models/Permission.php: -------------------------------------------------------------------------------- 1 | belongsToMany(Role::class, 'roles_permissions', 'permission_id', 'role_id') 18 | ->using(RolePermission::class); 19 | } 20 | 21 | public function users() 22 | { 23 | return $this->belongsToMany(User::class, 'users_permissions'); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Models/Preference.php: -------------------------------------------------------------------------------- 1 | belongsTo(User::class); 24 | } 25 | 26 | public function language() 27 | { 28 | return $this->belongsTo(Language::class); 29 | } 30 | 31 | public function region() 32 | { 33 | return $this->belongsTo(Region::class); 34 | } 35 | 36 | public function timezone() 37 | { 38 | return $this->belongsTo(Timezone::class); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/Models/ProductVariant.php: -------------------------------------------------------------------------------- 1 | belongsTo(Product::class, 'product_id', 'product_id'); 25 | } 26 | 27 | public function size() 28 | { 29 | return $this->belongsTo(Size::class); 30 | } 31 | 32 | public function productVariantsSize(): BelongsToMany 33 | { 34 | return $this->belongsToMany(Size::class, 'product_variants_size', 'product_variant_id', 'size_id'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/Models/ProductVariantSize.php: -------------------------------------------------------------------------------- 1 | belongsTo(Size::class); 21 | } 22 | 23 | public function productVariant(): BelongsTo 24 | { 25 | return $this->belongsTo(ProductVariant::class, 'product_variant_id', 'id'); 26 | } 27 | } -------------------------------------------------------------------------------- /app/Models/Profile.php: -------------------------------------------------------------------------------- 1 | belongsTo(User::class, 'user_id', 'id'); 41 | } 42 | 43 | 44 | 45 | 46 | } 47 | -------------------------------------------------------------------------------- /app/Models/Quest.php: -------------------------------------------------------------------------------- 1 | hasMany(QuestMessage::class)->orderBy('sequence'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/Models/QuestMessage.php: -------------------------------------------------------------------------------- 1 | belongsTo(Quest::class); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/Models/Region.php: -------------------------------------------------------------------------------- 1 | hasMany(Preference::class); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Models/Role.php: -------------------------------------------------------------------------------- 1 | belongsToMany(Permission::class, 'roles_permissions', 'role_id', 'permission_id') 18 | ->using(RolePermission::class); 19 | } 20 | 21 | public function users() 22 | { 23 | return $this->belongsToMany(User::class, 'users_roles', 'role_id', 'user_id'); 24 | } 25 | 26 | public function organisation() 27 | { 28 | return $this->belongsTo(Organisation::class, 'org_id', 'org_id'); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Models/RolePermission.php: -------------------------------------------------------------------------------- 1 | belongsTo(ProductVariant::class); 23 | } 24 | 25 | public function productVariantsSize() 26 | { 27 | return $this->hasMany(ProductVariantSize::class); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Models/SqueezeList.php: -------------------------------------------------------------------------------- 1 | belongsToMany(Feature::class, 'features_subscription_plans') 20 | ->withPivot('status') 21 | ->withTimestamps(); 22 | } 23 | 24 | public function userSubscriptions() 25 | { 26 | return $this->hasMany(UserSubscription::class, 'subscription_plan_id', 'id'); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /app/Models/Testimonial.php: -------------------------------------------------------------------------------- 1 | 'string', 20 | 'timezone' => 'string', 21 | 'description' => 'string', 22 | ]; 23 | 24 | 25 | public function preferences() 26 | { 27 | return $this->hasMany(Preference::class); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Models/UserNotification.php: -------------------------------------------------------------------------------- 1 | belongsTo(SubscriptionPlan::class, 'subscription_plan_id', 'id'); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/Models/Validators/AuthValidator.php: -------------------------------------------------------------------------------- 1 | ['required', 'string', 'max:255'], 16 | 'email' => ['required', 'string', 'email:rfc,dns', 'max:255', 'unique:users'], 17 | 'password' => ['required', Password::min(8)], 18 | ] 19 | )->validate(); 20 | } 21 | } -------------------------------------------------------------------------------- /app/Models/WaitList.php: -------------------------------------------------------------------------------- 1 | roles()->where('name', 'superadmin')->exists()) { 14 | return true; 15 | } 16 | 17 | // Check if the user is an organisation admin 18 | if ($user->roles()->where('org_id', $organisation->org_id) 19 | ->where('name', 'admin') 20 | ->exists()) { 21 | return true; 22 | } 23 | 24 | return false; 25 | 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | 16 | */ 17 | protected $policies = [ 18 | Organisation::class => OrganisationPolicy::class, 19 | ]; 20 | 21 | /** 22 | * Register any authentication / authorization services. 23 | */ 24 | public function boot(): void 25 | { 26 | // 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | app->singleton(CollectorRegistry::class, function () { 24 | $adapter = new APC(); 25 | return new CollectorRegistry($adapter); 26 | }); 27 | } 28 | } 29 | 30 | /** 31 | * Bootstrap services. 32 | */ 33 | public function boot(): void 34 | { 35 | // 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/Providers/SwaggerUiServiceProvider.php: -------------------------------------------------------------------------------- 1 | email, [ 14 | // 15 | ]); 16 | }); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/Rules/ValidatePlanType.php: -------------------------------------------------------------------------------- 1 | owned_organisations()->create([ 18 | 'name' => $name 19 | ]); 20 | $this->assign_member($user, $organisation); 21 | return $organisation; 22 | } 23 | 24 | public function assign_member(User $user, Organisation $organisation) { 25 | OrganisationUser::create([ 26 | 'user_id' => $user->id, 27 | 'org_id' => $organisation->org_id 28 | ]); 29 | } 30 | } -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /config/cors.php: -------------------------------------------------------------------------------- 1 | ['api/*', 'sanctum/csrf-cookie'], 19 | 20 | 'allowed_methods' => ['*'], 21 | 22 | 'allowed_origins' => ['*'], 23 | 24 | 'allowed_origins_patterns' => [], 25 | 26 | 'allowed_headers' => ['*'], 27 | 28 | 'exposed_headers' => [], 29 | 30 | 'max_age' => 0, 31 | 32 | 'supports_credentials' => false, 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite* 2 | -------------------------------------------------------------------------------- /database/factories/ArticleFactory.php: -------------------------------------------------------------------------------- 1 | Str::uuid(), 19 | 'user_id' => User::factory(), 20 | 'title' => $this->faker->sentence, 21 | 'content' => $this->faker->paragraphs(3, true), 22 | ]; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /database/factories/BillingPlanFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class BillingPlanFactory extends Factory 12 | { 13 | /** 14 | * Define the model's default state. 15 | * 16 | * @return array 17 | */ 18 | 19 | public function definition(): array 20 | { 21 | return [ 22 | 'id' => Str::uuid(), 23 | 'name' => $this->faker->words(3, true), 24 | 'price' => $this->faker->randomFloat(2, 10, 1000), // Generates a random price between $10 and $1000 25 | 'features' => json_encode($this->faker->words(5)), // Generates a JSON array of 5 random words 26 | 'description' => $this->faker->sentence, // Generates a random sentence 27 | ]; 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /database/factories/BlogCategoryFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class BlogCategoryFactory extends Factory 12 | { 13 | /** 14 | * Define the model's default state. 15 | * 16 | * @return array 17 | */ 18 | public function definition(): array 19 | { 20 | return [ 21 | 'id' => Str::uuid(), 22 | 'name' => $this->faker->word, 23 | 'description' => $this->faker->text 24 | ]; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/factories/CategoryFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class CategoryFactory extends Factory 12 | { 13 | /** 14 | * Define the model's default state. 15 | * 16 | * @return array 17 | */ 18 | public function definition(): array 19 | { 20 | $name = $this->faker->unique->word; 21 | return [ 22 | 'name' => $name, 23 | 'description' => $this->faker->text, 24 | 'slug' => Str::slug($name), 25 | ]; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /database/factories/CommentFactory.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | class CommentFactory extends Factory 14 | { 15 | /** 16 | * Define the model's default state. 17 | * 18 | * @return array 19 | */ 20 | public function definition(): array 21 | { 22 | return [ 23 | 'id' => (string) Str::uuid(), 24 | 'user_id' => User::factory(), 25 | 'blog_id' => Blog::factory(), 26 | 'name' => $this->faker->name, 27 | 'content' => $this->faker->paragraph, 28 | 'likes' => 0, 29 | 'dislikes' => 0, 30 | ]; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/factories/CookiePreferenceFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class CookiePreferenceFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | // 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/factories/EmailRequestFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class EmailRequestFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | // 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/factories/EmailTemplateFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class EmailTemplateFactory extends Factory 11 | { 12 | /** 13 | * The name of the factory's corresponding model. 14 | * 15 | * @var string 16 | */ 17 | protected $model = \App\Models\EmailTemplate::class; 18 | 19 | /** 20 | * Define the model's default state. 21 | * 22 | * @return array 23 | */ 24 | public function definition(): array 25 | { 26 | return [ 27 | 'id' => (string) Str::uuid(), 28 | 'title' => $this->faker->sentence, 29 | 'template' => $this->faker->paragraph, 30 | 'status' => $this->faker->boolean, 31 | ]; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/factories/FaqFactory.php: -------------------------------------------------------------------------------- 1 | Str::uuid(), 17 | 'question' => $this->faker->sentence(6, true) . '?', 18 | 'answer' => $this->faker->paragraph(3, true), 19 | 'category' => $this->faker->word(), 20 | 'created_at' => $this->faker->dateTimeThisYear(), 21 | 'updated_at' => $this->faker->dateTimeThisYear(), 22 | ]; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /database/factories/FeatureFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class FeatureFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | 'feature' => $this->faker->text(40), 21 | 'description' => $this->faker->text(40), 22 | ]; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /database/factories/InvitationFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class InvitationFactory extends Factory 12 | { 13 | /** 14 | * Define the model's default state. 15 | * 16 | * @return array 17 | */ 18 | public function definition(): array 19 | { 20 | return [ 21 | 'user_id' => Organisation::factory(), 22 | 'link' => $this->faker->link(), 23 | 'expires_at' => now()->addDays(5), 24 | ]; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/factories/JobApplicationFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class JobApplicationFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | // 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/factories/NotificationFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class NotificationFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | 'title' => $this->faker->sentence(), 21 | 'type' => $this->faker->randomElement(['email', 'push']), 22 | 'message' => $this->faker->paragraph(), 23 | ]; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /database/factories/NotificationPreferenceFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class NotificationPreferenceFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | 'user_id' => \App\Models\User::factory(), // Associate with a User 21 | 'email_notifications' => $this->faker->boolean, 22 | 'push_notifications' => $this->faker->boolean, 23 | 'sms_notifications' => $this->faker->boolean, 24 | ]; 25 | } 26 | } -------------------------------------------------------------------------------- /database/factories/OrganisationBillingPlanFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class OrganisationBillingPlanFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | // 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/factories/PaymentFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class PaymentFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | // 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/factories/PermissionFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class PermissionFactory extends Factory 12 | { 13 | protected $model = Permission::class; 14 | /** 15 | * Define the model's default state. 16 | * 17 | * @return array 18 | */ 19 | public function definition(): array 20 | { 21 | return [ 22 | // 'category' => $this->faker->word, 23 | 'name' => $this->faker->word, 24 | ]; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/factories/PreferenceFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class PreferenceFactory extends Factory 12 | { 13 | /** 14 | * Define the model's default state. 15 | * 16 | * @return array 17 | */ 18 | public function definition(): array 19 | { 20 | return [ 21 | 'user_id' => User::factory(), 22 | 'name' => $this->faker->word, 23 | 'value' => $this->faker->word, 24 | ]; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/factories/ProductVariantFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class ProductVariantFactory extends Factory 12 | { 13 | /** 14 | * Define the model's default state. 15 | * 16 | * @return array 17 | */ 18 | public function definition(): array 19 | { 20 | return [ 21 | 'id' => Str::uuid(), 22 | 'stock' => $this->faker->numberBetween(0, 100), 23 | 'stock_status' => $this->faker->randomElement(['in_stock', 'out_of_stock', 'low_on_stock']), 24 | 'price' => $this->faker->numberBetween(100, 1000), 25 | 'size_id' => Size::factory(), 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /database/factories/ProductVariantSizeFactory.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | class ProductVariantSizeFactory extends Factory 14 | { 15 | protected $model = ProductVariantSize::class; 16 | 17 | /** 18 | * Define the model's default state. 19 | * 20 | * @return array 21 | */ 22 | 23 | public function definition(): array 24 | { 25 | return [ 26 | 'id' => Str::uuid(), 27 | 'size_id' => Size::factory(), 28 | 'product_variant_id' => ProductVariant::factory(), 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/factories/ProfileFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class ProfileFactory extends Factory 12 | { 13 | /** 14 | * Define the model's default state. 15 | * 16 | * @return array 17 | */ 18 | public function definition(): array 19 | { 20 | $first_name = $this->faker->firstName; 21 | $last_name = $this->faker->lastName; 22 | $newUser = User::factory()->make(); 23 | 24 | return [ 25 | 'user_id' => $newUser->id, 26 | 'first_name' => $first_name, 27 | 'last_name' => $last_name, 28 | 'avatar_url' => $this->faker->imageUrl(), 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/factories/RegionFactory.php: -------------------------------------------------------------------------------- 1 | 19 | */ 20 | public function definition(): array 21 | { 22 | return [ 23 | 'id' => $this->faker->uuid(), 24 | 'name' => $this->faker->city(), 25 | 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /database/factories/RoleFactory.php: -------------------------------------------------------------------------------- 1 | create(); 15 | 16 | 17 | return [ 18 | 'name' => $this->faker->jobTitle, 19 | 'org_id' => $organisation->org_id, 20 | 'description' => $this->faker->sentence, 21 | 'is_active' => true, 22 | 'is_default' => false, 23 | ]; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /database/factories/SMSRequestFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class SMSRequestFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | // 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/factories/SMSTemplateFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class SMSTemplateFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | // 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/factories/SizeFactory.php: -------------------------------------------------------------------------------- 1 | 10 | */ 11 | class SizeFactory extends Factory 12 | { 13 | protected $model = Size::class; 14 | 15 | /** 16 | * Define the model's default state. 17 | * 18 | * @return array 19 | */ 20 | 21 | public function definition(): array 22 | { 23 | return [ 24 | 'id' => Str::uuid(), 25 | 'size' => $this->faker->randomElement(['small', 'standard', 'large']), 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /database/factories/SqueezeListFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class SqueezeListFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | // 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/factories/SqueezePageFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class SqueezePageFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | // 21 | ]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/factories/SqueezePageUserFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class SqueezePageUserFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | protected $model = SqueezePageUser::class; 18 | 19 | public function definition(): array 20 | { 21 | return [ 22 | 'firstname' => $this->faker->firstName, 23 | 'lastname' => $this->faker->lastName, 24 | 'email' => $this->faker->safeEmail, 25 | 'title' => $this->faker->sentence(3), 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /database/factories/SubscriptionPlanFactory.php: -------------------------------------------------------------------------------- 1 | 9 | */ 10 | class SubscriptionPlanFactory extends Factory 11 | { 12 | /** 13 | * Define the model's default state. 14 | * 15 | * @return array 16 | */ 17 | public function definition(): array 18 | { 19 | return [ 20 | 'name' => $this->faker->randomElement(['basic', 'premium']), 21 | 'price' => $this->faker->numberBetween(1000, 2000), 22 | 'duration' => $this->faker->randomElement(['monthly', 'yearly']), 23 | 'description' => $this->faker->realText() 24 | ]; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/factories/TestimonialFactory.php: -------------------------------------------------------------------------------- 1 | User::factory(), 27 | 'name' => $this->faker->name, 28 | 'content' => $this->faker->paragraph, 29 | ]; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/factories/TimezoneFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->timezone, 16 | 'gmtoffset' => $this->faker->timezone, 17 | 'description' => $this->faker->sentence, 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /database/factories/UserNotificationFactory.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class UserNotificationFactory extends Factory 13 | { 14 | /** 15 | * Define the model's default state. 16 | * 17 | * @return array 18 | */ 19 | public function definition(): array 20 | { 21 | return [ 22 | 'user_id' => User::factory(), 23 | 'notification_id' => Notification::factory(), 24 | 'status' => $this->faker->randomElement(['unread']), 25 | ]; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /database/factories/WaitListFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->name, 16 | 'email' => $this->faker->unique()->safeEmail, 17 | ]; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_100000_create_password_reset_tokens_table.php: -------------------------------------------------------------------------------- 1 | string('email')->primary(); 16 | $table->string('token'); 17 | $table->timestamp('created_at')->nullable(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::dropIfExists('password_reset_tokens'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2019_08_19_000000_create_failed_jobs_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('uuid')->unique(); 17 | $table->text('connection'); 18 | $table->text('queue'); 19 | $table->longText('payload'); 20 | $table->longText('exception'); 21 | $table->timestamp('failed_at')->useCurrent(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('failed_jobs'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->morphs('tokenable'); 17 | $table->string('name'); 18 | $table->string('token', 64)->unique(); 19 | $table->text('abilities')->nullable(); 20 | $table->timestamp('last_used_at')->nullable(); 21 | $table->timestamp('expires_at')->nullable(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | */ 29 | public function down(): void 30 | { 31 | Schema::dropIfExists('personal_access_tokens'); 32 | } 33 | }; 34 | -------------------------------------------------------------------------------- /database/migrations/2024_07_18_200840_create_products_table.php: -------------------------------------------------------------------------------- 1 | uuid('product_id')->primary(); 17 | $table->foreignUuid('user_id')->constrained()->onDelete('cascade')->onUpdate('cascade'); 18 | $table->string('name'); 19 | $table->text('description'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('products'); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_07_18_202000_create_organisation_users_table.php: -------------------------------------------------------------------------------- 1 | uuid('organisation_user_id')->primary(); 16 | $table->foreignUuid('org_id')->references('org_id')->on('organisations')->constrained()->onDelete('cascade')->onUpdate('cascade'); 17 | $table->foreignUuid('user_id')->constrained()->onDelete('cascade')->onUpdate('cascade'); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::dropIfExists('organisation_user'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_07_20_121051_create_articles_table.php: -------------------------------------------------------------------------------- 1 | uuid('article_id')->primary(); 13 | $table->foreignUuid('user_id')->constrained('users')->onDelete('cascade'); 14 | $table->string('title')->unique(); 15 | $table->text('content'); 16 | $table->timestamps(); 17 | }); 18 | } 19 | 20 | public function down() 21 | { 22 | Schema::dropIfExists('articles'); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /database/migrations/2024_07_20_131306_create_subscription_plans_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('name'); //basic or premium 17 | $table->decimal('price'); //stored as kobo 18 | $table->string('duration'); //monthly or yearly 19 | $table->text('features')->nullable(); 20 | $table->text('description'); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('subscription_plans'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2024_07_20_141031_create_features_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('feature'); 17 | $table->string('description')->nullable(); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('features'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_07_20_142941_features_subscription_plans_table.php: -------------------------------------------------------------------------------- 1 | foreignUuid('feature_id')->constrained('features'); 16 | $table->foreignUuid('subscription_plan_id')->constrained('subscription_plans'); 17 | $table->integer('status'); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('features_subscription_plans'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_07_20_220105_create_categories_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 13 | $table->string('name'); 14 | $table->text('description')->nullable(); 15 | $table->string('slug')->unique(); 16 | $table->timestamps(); 17 | }); 18 | } 19 | 20 | public function down() 21 | { 22 | Schema::dropIfExists('categories'); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /database/migrations/2024_07_21_034529_create_jobs_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('title'); 17 | $table->text('description'); 18 | $table->string('location'); 19 | $table->string('job_type')->nullable(); 20 | $table->string('company')->nullable(); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('jobs'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2024_07_21_042346_create_blogs_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->text('content'); 17 | $table->string('imageUrl'); 18 | $table->string('tags'); 19 | $table->string('author'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('blogs'); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_07_21_100956_add_columns_to_blogs_table.php: -------------------------------------------------------------------------------- 1 | string('title'); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('blogs', function (Blueprint $table) { 25 | $table->dropColumn('title'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_07_21_115606_modify_content_length_in_blogs_table.php: -------------------------------------------------------------------------------- 1 | text('content')->change(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('blogs', function (Blueprint $table) { 25 | $table->text('content')->change(); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_07_21_121534_create_permissions_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('name'); 17 | $table->timestamp('deleted_at')->nullable(); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('permissions'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_07_21_121928_create_roles_permissions_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->foreignUuid('role_id')->constrained('roles', 'id')->cascadeOnDelete()->cascadeOnUpdate(); 17 | $table->foreignUuid('permission_id')->constrained('permissions', 'id')->cascadeOnDelete() 18 | ->cascadeOnUpdate(); 19 | $table->timestamps(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | Schema::dropIfExists('roles_permissions'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_07_21_123053_create_users_permissions_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->foreignUuid('user_id')->constrained('users', 'id')->cascadeOnDelete()->cascadeOnUpdate(); 17 | $table->foreignUuid('permission_id')->constrained('permissions', 'id')->cascadeOnDelete()->cascadeOnUpdate(); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('users_permissions'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_07_21_123058_create_users_roles_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->foreignUuid('user_id')->constrained('users', 'id')->cascadeOnDelete()->cascadeOnUpdate(); 17 | $table->foreignUuid('role_id')->constrained('roles', 'id')->cascadeOnDelete()->cascadeOnUpdate(); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('users_roles'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_07_21_164302_create_job_users_table.php: -------------------------------------------------------------------------------- 1 | uuid('job_user_id')->primary(); 16 | $table->foreignUuid('job_id')->references('id')->on('jobs')->constrained()->onDelete('cascade')->onUpdate('cascade'); 17 | $table->foreignUuid('user_id')->constrained()->onDelete('cascade')->onUpdate('cascade'); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('job_users'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_07_21_201715_add_soft_delete_to_blogs_table.php: -------------------------------------------------------------------------------- 1 | softDeletes(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('blogs', function (Blueprint $table) { 25 | // 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_07_23_091923_create_invitations_table.php: -------------------------------------------------------------------------------- 1 | uuid()->primary(); 16 | $table->foreignUuid('org_id')->constrained('organisations', 'org_id')->cascadeOnDelete(); 17 | $table->string('email')->nullable(); 18 | $table->string('link')->unique(); 19 | $table->timestamp('expires_at'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('invitations'); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_07_23_171710_create_preferences_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->foreignUuid('user_id')->constrained('users', 'id')->cascadeOnDelete()->cascadeOnUpdate(); 17 | $table->string('name'); 18 | $table->string('value'); 19 | $table->timestamps(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | Schema::dropIfExists('preferences'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_07_24_011913_remove_column_from_blogs.php: -------------------------------------------------------------------------------- 1 | dropColumn(['tags', 'imageUrl']); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('blogs', function (Blueprint $table) { 25 | $table->string('tags')->default('default_value'); 26 | $table->string('imageUrl')->default('default_value'); 27 | }); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_07_24_012000_add_blog_tags_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('name'); 17 | $table->string('blog_id'); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('blog_tags'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_07_24_014449_create_blog_images_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('blog_id'); 17 | $table->string('image_url'); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('blog_images'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_07_24_113926_create_category_products_table.php: -------------------------------------------------------------------------------- 1 | uuid('category_product_id')->primary(); 16 | $table->foreignUuid('category_id')->references('id')->on('categories')->constrained()->onDelete('cascade')->onUpdate('cascade'); 17 | $table->foreignUuid('product_id')->constrained('products', 'product_id')->onDelete('cascade')->onUpdate('cascade'); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::dropIfExists('category_product'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_07_24_115628_create_blog_categories_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('name'); 17 | $table->string('description')->nullable(); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('blog_categories'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_07_24_121551_create_billing_plans_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 17 | $table->string('name'); 18 | $table->decimal('price', 8, 2); 19 | $table->json('features'); // Store features as JSON 20 | $table->text('description')->nullable(); 21 | $table->timestamps(); }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('billing_plans'); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_07_24_122951_create_organisation_billing_plans_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 17 | $table->timestamps(); 18 | $table->foreignUuid('organisation_id')->references('org_id')->on('organisations')->onDelete('cascade')->cascadeOnUpdate(); 19 | $table->foreignUuid('billing_plan_id')->references('id')->on('billing_plans')->onDelete('cascade')->cascadeOnUpdate(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | Schema::dropIfExists('organisation_billing_plans'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_07_24_143448_add_indexes_to_blogs_table.php: -------------------------------------------------------------------------------- 1 | index('author'); 13 | $table->index('title'); 14 | $table->index('created_at'); 15 | }); 16 | } 17 | 18 | public function down() 19 | { 20 | Schema::table('blogs', function (Blueprint $table) { 21 | $table->dropIndex(['author']); 22 | $table->dropIndex(['title']); 23 | $table->dropIndex(['created_at']); 24 | }); 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /database/migrations/2024_07_28_111524_create_cookie_preferences_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->foreignUuid('user_id')->constrained('users', 'id')->cascadeOnDelete()->cascadeOnUpdate(); 17 | $table->json('preferences'); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('cookie_preferences'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_07_28_112025_create_job_applications_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->foreignUuid('job_id')->constrained('jobs', 'id')->cascadeOnDelete()->cascadeOnUpdate(); 17 | $table->foreignUuid('user_id')->constrained('users', 'id')->cascadeOnDelete()->cascadeOnUpdate(); 18 | $table->text('cv'); 19 | $table->text('cover_letter'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('job_applications'); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_07_28_130448_create_wait_lists_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('name'); 17 | $table->string('email'); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('wait_lists'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_07_28_130545_create_squeeze_lists_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('name'); 17 | $table->string('email'); 18 | $table->string('company'); 19 | $table->timestamps(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | Schema::dropIfExists('squeeze_lists'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_07_28_130753_create_squeeze_pages_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('headline'); 17 | $table->string('sub_headline'); 18 | $table->string('hero_image'); 19 | $table->string('content'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('squeeze_pages'); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_07_28_170337_create_email_templates_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('title'); 17 | $table->text('template'); 18 | $table->boolean('status'); 19 | $table->timestamps(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | Schema::dropIfExists('email_templates'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_07_28_170700_create_notifications_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->enum('type', ['email', 'sms', 'push']); 17 | $table->string('title'); 18 | $table->text('message'); 19 | $table->timestamps(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | Schema::dropIfExists('notifications'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_07_28_170956_create_user_notifications_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->foreignUuid('user_id')->constrained('users', 'id')->cascadeOnDelete()->cascadeOnUpdate(); 17 | $table->foreignUuid('notification_id')->constrained('notifications', 'id')->cascadeOnDelete()->cascadeOnUpdate(); 18 | $table->enum('status', ['sent', 'read', 'unread']); 19 | $table->timestamps(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | Schema::dropIfExists('user_notifications'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_07_29_142639_alter_and_add_more_column_to_products.php: -------------------------------------------------------------------------------- 1 | string('quantity')->nullable()->change(); 16 | $table->boolean('is_archived')->default(false); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | */ 23 | public function down(): void 24 | { 25 | Schema::table('products', function (Blueprint $table) { 26 | $table->string('quantity')->change(); 27 | $table->dropColumn('is_archived'); 28 | }); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_07_29_142853_create_size_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->enum('size', ['small', 'standard', 'large']); 17 | $table->timestamps(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::dropIfExists('sizes'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_07_30_105146_alter_product_add_orgid.php: -------------------------------------------------------------------------------- 1 | foreignUuid('org_id')->nullable()->references('org_id')->on('organisations')->constrained()->onDelete('cascade')->onUpdate('cascade'); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | */ 23 | public function down(): void 24 | { 25 | // 26 | Schema::table('products', function (Blueprint $table) { 27 | $table->dropColumn('org_id'); 28 | }); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_07_30_114205_create_faqs_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('question'); 17 | $table->text('answer'); 18 | $table->boolean('status')->default(1); 19 | $table->timestamps(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | Schema::dropIfExists('faqs'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_07_31_215939_create_inquiries_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('name'); 17 | $table->string('email'); 18 | $table->text('message'); 19 | $table->boolean('status')->default(1); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('inquiries'); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_08_01_051659_update_payments_table_add_transaction_id.php: -------------------------------------------------------------------------------- 1 | string('transaction_id')->nullable(); 16 | $table->dropColumn('stripe_payment_id'); 17 | $table->dropColumn('payment_method'); 18 | 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::table('payments', function (Blueprint $table) { 28 | $table->dropColumn('transaction_id'); 29 | $table->string('stripe_payment_id'); 30 | $table->string('payment_method'); 31 | 32 | }); 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /database/migrations/2024_08_01_085815_create_email_requests_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->foreignUuid('template_id')->constrained('email_templates')->onDelete('cascade'); 17 | $table->string('subject'); 18 | $table->string('recipient'); 19 | $table->jsonb('variables')->nullable(); 20 | $table->string('status'); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | */ 28 | public function down(): void 29 | { 30 | Schema::dropIfExists('email_requests'); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /database/migrations/2024_08_01_143905_alter_columns_on_squeezes_table.php: -------------------------------------------------------------------------------- 1 | string('first_name')->nullable()->change(); 16 | $table->string('last_name')->nullable()->change(); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | */ 23 | public function down(): void 24 | { 25 | Schema::table('squeezes', function (Blueprint $table) { 26 | $table->dropColumn('first_name'); 27 | $table->dropColumn('last_name'); 28 | }); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_08_02_114218_add_soft_delete_to_users_table.php: -------------------------------------------------------------------------------- 1 | softDeletes(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('users', function (Blueprint $table) { 25 | $table->dropSoftDeletes(); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_08_02_142433_create_timezones_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('name'); 17 | $table->string('offset'); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('timezones'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_08_02_142500_create_regions_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('name'); 17 | $table->timestamps(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::dropIfExists('regions'); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_08_02_142513_create_languages_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('name'); 17 | $table->timestamps(); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | // Schema::dropIfExists('languages'); 27 | if (Schema::hasTable('languages')) { 28 | Schema::dropIfExists('languages'); 29 | } 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_08_06_085955_add_org_id_to_user_subscriptions.php: -------------------------------------------------------------------------------- 1 | foreignUuid('org_id')->constrained('organisations', 'org_id')->cascadeOnDelete()->cascadeOnUpdate(); 16 | }); 17 | } 18 | 19 | 20 | /** 21 | * Reverse the migrations. 22 | */ 23 | public function down(): void 24 | { 25 | 26 | Schema::table('user_subscriptions', function (Blueprint $table) { 27 | $table->dropForeign(['org_id']); 28 | $table->dropColumn('org_id'); 29 | }); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2024_08_06_184118_create_quests_table.php: -------------------------------------------------------------------------------- 1 | id(); 16 | $table->string('title'); 17 | $table->text('description'); 18 | $table->timestamps(); 19 | }); 20 | 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | */ 26 | public function down(): void 27 | { 28 | Schema::dropIfExists('quests'); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /database/migrations/2024_08_06_184558_create_quest_messages_table.php: -------------------------------------------------------------------------------- 1 | id(); 13 | $table->foreignId('quest_id')->constrained()->onDelete('cascade'); 14 | $table->string('key'); 15 | $table->text('question'); 16 | $table->text('answer'); 17 | $table->integer('sequence'); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | public function down() 23 | { 24 | Schema::dropIfExists('quest_messages'); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/migrations/2024_08_07_131402_alter_timezones_table_rename_and_add_columns.php: -------------------------------------------------------------------------------- 1 | renameColumn('name', 'timezone'); 16 | $table->renameColumn('offset', 'gmtoffset'); 17 | $table->string('description'); 18 | }); 19 | } 20 | 21 | public function down(): void 22 | { 23 | Schema::table('timezones', function (Blueprint $table) { 24 | $table->dropColumn('timezone'); 25 | $table->dropColumn('gmtoffset'); 26 | $table->dropColumn('description'); 27 | }); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_08_07_213218_alter_languages_table.php: -------------------------------------------------------------------------------- 1 | string('language')->unique()->after('id'); 13 | $table->string('code')->unique()->after('language'); 14 | $table->text('description')->nullable()->after('code'); 15 | $table->dropColumn('name'); 16 | }); 17 | } 18 | 19 | public function down() 20 | { 21 | Schema::table('languages', function (Blueprint $table) { 22 | $table->dropUnique(['language']); 23 | $table->dropUnique(['code']); 24 | $table->dropColumn(['language', 'code', 'description']); 25 | $table->string('name')->after('id'); 26 | }); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /database/migrations/2024_08_08_083933_update_faqs_table.php: -------------------------------------------------------------------------------- 1 | string('category')->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('faqs', function (Blueprint $table) { 25 | $table->dropColumn('category'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/2024_08_08_115517_create_newsletter_subscriptions_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->text('email'); 17 | $table->timestamps(); 18 | $table->softDeletes(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | */ 25 | public function down(): void 26 | { 27 | Schema::dropIfExists('newsletter_subscriptions'); 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /database/migrations/2024_08_08_155430_create_squeeze_pages_user_table.php: -------------------------------------------------------------------------------- 1 | uuid('id')->primary(); 16 | $table->string('firstname'); 17 | $table->string('lastname'); 18 | $table->string('email'); 19 | $table->string('title'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down(): void 28 | { 29 | Schema::dropIfExists('squeeze_pages_user'); 30 | } 31 | }; 32 | -------------------------------------------------------------------------------- /database/migrations/2025_03_01_052032_add_magic_link_columns_to_users_table.php: -------------------------------------------------------------------------------- 1 | string('magic_link_token', 100)->nullable()->after('remember_token'); 17 | $table->timestamp('magic_link_expires_at')->nullable()->after('magic_link_token'); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | */ 24 | public function down(): void 25 | { 26 | Schema::table('users', function (Blueprint $table) { 27 | $table->dropColumn('magic_link_token'); 28 | $table->dropColumn('magic_link_expires_at'); 29 | }); 30 | } 31 | } -------------------------------------------------------------------------------- /database/seeders/CommentSeeder.php: -------------------------------------------------------------------------------- 1 | count(3)->create(); 19 | User::factory()->count(3)->create(); 20 | EmailRequest::factory()->count(3)->create(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /database/seeders/EmailTemplateSeeder.php: -------------------------------------------------------------------------------- 1 | count(3)->create(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /database/seeders/InvitationSeeder.php: -------------------------------------------------------------------------------- 1 | create(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /database/seeders/OrderSeeder.php: -------------------------------------------------------------------------------- 1 | count(10)->create(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /database/seeders/OrganisationBillingPlanSeeder.php: -------------------------------------------------------------------------------- 1 | create(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /database/seeders/PaymentSeeder.php: -------------------------------------------------------------------------------- 1 | $permission]); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /database/seeders/PreferenceSeeder.php: -------------------------------------------------------------------------------- 1 | count(5)->create(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /database/seeders/ProductVariantSeeder.php: -------------------------------------------------------------------------------- 1 | each(function ($product) { 18 | ProductVariant::factory()->count(3)->create([ 19 | 'product_id' => $product->product_id, 20 | ]); 21 | }); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/seeders/ProductVariantSizeSeeder.php: -------------------------------------------------------------------------------- 1 | each(function ($variant) { 18 | ProductVariantSize::factory()->count(2)->create([ 19 | 'product_variant_id' => $variant->id, 20 | ]); 21 | }); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/seeders/ProfileSeeder.php: -------------------------------------------------------------------------------- 1 | insert([ 15 | 'title' => 'The Burning Building', 16 | 'description' => 'Welcome! A fire has broken out in an apartment building in your neighborhood. A baby is trapped inside and needs your help. Your mission: Go into the burning building and rescue the baby. Every second counts! To succeed, you must learn to understand and speak the words that would serve as your tool.', 17 | 'created_at' => now(), 18 | 'updated_at' => now(), 19 | ]); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /database/seeders/RegionSeeder.php: -------------------------------------------------------------------------------- 1 | count(10)->create(); // Creates 10 regions 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /database/seeders/RoleSeeder.php: -------------------------------------------------------------------------------- 1 | create(); 23 | foreach ($roles as $role) { 24 | $role = Role::firstOrCreate(['name' => $role[0], 'description' => $role[1], 'org_id' => $organisation->org_id]); 25 | Permission::inRandomOrder()->first()->roles()->attach($role->id); 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /database/seeders/SizeSeeder.php: -------------------------------------------------------------------------------- 1 | count(10)->create(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /database/seeders/SqueezeListSeeder.php: -------------------------------------------------------------------------------- 1 | count(15)->create(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /database/seeders/TimezoneSeeder.php: -------------------------------------------------------------------------------- 1 | getOffset(new \DateTime()); 18 | $description = "Description for {$timezone}"; 19 | 20 | Timezone::create([ 21 | 'timezone' => $timezone, 22 | 'gmtoffset' => $gmtoffset, 23 | 'description' => $description, 24 | ]); 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /database/seeders/UserJobSeeder.php: -------------------------------------------------------------------------------- 1 | count(10)->create(); 18 | 19 | foreach ($users as $user) { 20 | $jobs = Job::factory()->count(5)->create(); 21 | foreach ($jobs as $job) { 22 | $user->jobs()->attach($job->id); 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /database/seeders/UserNotificationSeeder.php: -------------------------------------------------------------------------------- 1 | count(5)->create(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /database/seeders/WaitListSeeder.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Send Requests To Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/favicon.ico -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/uploads/1722977096.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1722977096.jpg -------------------------------------------------------------------------------- /public/uploads/1722977574.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1722977574.jpg -------------------------------------------------------------------------------- /public/uploads/1722978653.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1722978653.jpg -------------------------------------------------------------------------------- /public/uploads/1722978978.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1722978978.jpg -------------------------------------------------------------------------------- /public/uploads/1722984249.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1722984249.jpg -------------------------------------------------------------------------------- /public/uploads/1722986116.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1722986116.jpg -------------------------------------------------------------------------------- /public/uploads/1722986951.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1722986951.jpg -------------------------------------------------------------------------------- /public/uploads/1722987043.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1722987043.jpg -------------------------------------------------------------------------------- /public/uploads/1722989699.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1722989699.jpg -------------------------------------------------------------------------------- /public/uploads/1722989897.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1722989897.jpg -------------------------------------------------------------------------------- /public/uploads/1722990809.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1722990809.jpg -------------------------------------------------------------------------------- /public/uploads/1723005492.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723005492.jpg -------------------------------------------------------------------------------- /public/uploads/1723005641.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723005641.jpg -------------------------------------------------------------------------------- /public/uploads/1723005793.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723005793.jpg -------------------------------------------------------------------------------- /public/uploads/1723006364.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723006364.jpg -------------------------------------------------------------------------------- /public/uploads/1723006536.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723006536.jpg -------------------------------------------------------------------------------- /public/uploads/1723006580.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723006580.jpg -------------------------------------------------------------------------------- /public/uploads/1723007660.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723007660.jpg -------------------------------------------------------------------------------- /public/uploads/1723037656.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723037656.jpg -------------------------------------------------------------------------------- /public/uploads/1723038561.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723038561.jpg -------------------------------------------------------------------------------- /public/uploads/1723041952.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723041952.jpg -------------------------------------------------------------------------------- /public/uploads/1723050163.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723050163.jpg -------------------------------------------------------------------------------- /public/uploads/1723050675.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723050675.jpg -------------------------------------------------------------------------------- /public/uploads/1723051293.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723051293.jpg -------------------------------------------------------------------------------- /public/uploads/1723052951.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723052951.jpg -------------------------------------------------------------------------------- /public/uploads/1723053078.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723053078.jpg -------------------------------------------------------------------------------- /public/uploads/1723053336.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723053336.jpg -------------------------------------------------------------------------------- /public/uploads/1723063093.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723063093.jpg -------------------------------------------------------------------------------- /public/uploads/1723065375.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723065375.jpg -------------------------------------------------------------------------------- /public/uploads/1723065604.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723065604.jpg -------------------------------------------------------------------------------- /public/uploads/1723066655.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723066655.jpg -------------------------------------------------------------------------------- /public/uploads/1723066919.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723066919.jpg -------------------------------------------------------------------------------- /public/uploads/1723068692.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723068692.jpg -------------------------------------------------------------------------------- /public/uploads/1723076130.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723076130.jpg -------------------------------------------------------------------------------- /public/uploads/1723077805.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723077805.jpg -------------------------------------------------------------------------------- /public/uploads/1723099428.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723099428.jpg -------------------------------------------------------------------------------- /public/uploads/1723107462.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723107462.jpg -------------------------------------------------------------------------------- /public/uploads/1723108399.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723108399.jpg -------------------------------------------------------------------------------- /public/uploads/1723108979.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723108979.jpg -------------------------------------------------------------------------------- /public/uploads/1723109232.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723109232.jpg -------------------------------------------------------------------------------- /public/uploads/1723122054.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723122054.jpg -------------------------------------------------------------------------------- /public/uploads/1723124275.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723124275.jpg -------------------------------------------------------------------------------- /public/uploads/1723126010.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723126010.jpg -------------------------------------------------------------------------------- /public/uploads/1723128635.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723128635.jpg -------------------------------------------------------------------------------- /public/uploads/1723134494.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723134494.jpg -------------------------------------------------------------------------------- /public/uploads/1723135020.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723135020.jpg -------------------------------------------------------------------------------- /public/uploads/1723135061.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723135061.jpg -------------------------------------------------------------------------------- /public/uploads/1723135410.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723135410.jpg -------------------------------------------------------------------------------- /public/uploads/1723137107.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723137107.jpg -------------------------------------------------------------------------------- /public/uploads/1723144500.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723144500.jpg -------------------------------------------------------------------------------- /public/uploads/1723194360.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1723194360.jpg -------------------------------------------------------------------------------- /public/uploads/1724158752.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1724158752.jpg -------------------------------------------------------------------------------- /public/uploads/1724159454.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1724159454.jpg -------------------------------------------------------------------------------- /public/uploads/1724219479.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1724219479.jpg -------------------------------------------------------------------------------- /public/uploads/1724226709.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1724226709.jpg -------------------------------------------------------------------------------- /public/uploads/1724228441.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/1724228441.jpg -------------------------------------------------------------------------------- /public/uploads/product_images/1724191282.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724191282.jpg -------------------------------------------------------------------------------- /public/uploads/product_images/1724191434.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724191434.jpg -------------------------------------------------------------------------------- /public/uploads/product_images/1724192878.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724192878.png -------------------------------------------------------------------------------- /public/uploads/product_images/1724192919.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724192919.png -------------------------------------------------------------------------------- /public/uploads/product_images/1724193022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724193022.png -------------------------------------------------------------------------------- /public/uploads/product_images/1724220452.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724220452.jpg -------------------------------------------------------------------------------- /public/uploads/product_images/1724220476.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724220476.jpg -------------------------------------------------------------------------------- /public/uploads/product_images/1724220589.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724220589.jpg -------------------------------------------------------------------------------- /public/uploads/product_images/1724220628.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724220628.jpg -------------------------------------------------------------------------------- /public/uploads/product_images/1724220685.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724220685.jpg -------------------------------------------------------------------------------- /public/uploads/product_images/1724220790.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724220790.jpg -------------------------------------------------------------------------------- /public/uploads/product_images/1724223912.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724223912.png -------------------------------------------------------------------------------- /public/uploads/product_images/1724226700.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724226700.jpg -------------------------------------------------------------------------------- /public/uploads/product_images/1724228045.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724228045.jpg -------------------------------------------------------------------------------- /public/uploads/product_images/1724228438.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/uploads/product_images/1724228438.jpg -------------------------------------------------------------------------------- /public/vendor/scribe/images/navbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/public/vendor/scribe/images/navbar.png -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/resources/css/app.css -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | import './bootstrap'; 2 | -------------------------------------------------------------------------------- /resources/views/emails/deactivated.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Account Deactivation Confirmation 5 | 6 | 7 |

Account Deactivated

8 |

Hello {{ $user->name }},

9 |

Your account has been successfully deactivated.

10 | @if($user->deactivation_reason) 11 |

Reason: {{ $user->deactivation_reason }}

12 | @endif 13 |

Thank you for being with us.

14 | 15 | 16 | -------------------------------------------------------------------------------- /resources/views/emails/generic.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Email 5 | 6 | 7 | {!! $content !!} 8 | 9 | 10 | -------------------------------------------------------------------------------- /resources/views/emails/magic_link.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Magic Link Login 5 | 6 | 7 |

Magic Link Login

8 |

Click the link below to log in:

9 | Login with Magic Link 10 |

This link will expire in 30 minutes.

11 | 12 | -------------------------------------------------------------------------------- /resources/views/emails/newsletter_subcription.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Welcome to Our Newsletter! 6 | 7 | 8 |

Welcome to Our Newsletter!

9 | 10 |

Hello {{ $user->name }},

11 | 12 |

Thank you for subscribing to our newsletter! We're excited to have you on board and keep you updated with the latest news and updates.

13 | 14 |

If you have any questions, feel free to reply to this email.

15 | 16 |

Thanks,
{{ config('app.name') }}

17 | 18 | 19 | -------------------------------------------------------------------------------- /resources/views/emails/squeeze_template.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Squeeze Template 6 | 7 | 8 | 9 |

Dear {{ $first_name }},

10 |

Thank you for your interest. Here is the template you requested.

11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /resources/views/emails/waitlist_confirmation.blade.php: -------------------------------------------------------------------------------- 1 |

Hello {{ $waitlist->name }},

2 |

Thank you for joining our waitlist! We will notify you when we launch.

3 | -------------------------------------------------------------------------------- /resources/views/mail/contact-inquiry-mail.blade.php: -------------------------------------------------------------------------------- 1 | 2 | ## Inquiry sent successfully, here is your message 3 | 4 | Name: {{ $name }}
5 | Email: {{ $email }}
6 | Message: {{ $message }}
7 | 8 | Thanks,
9 | {{-- {{ config('app.name') }} --}} 10 | Hng Boilerplate support team 11 |
12 | -------------------------------------------------------------------------------- /role: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hngprojects/hng_boilerplate_php_laravel_web/0ed14e65c8e652470af4ad6ff19e23efe33dd776/role -------------------------------------------------------------------------------- /routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 18 | }); 19 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 19 | })->purpose('Display an inspiring quote'); 20 | -------------------------------------------------------------------------------- /routes/web.php: -------------------------------------------------------------------------------- 1 | group(function () { 24 | Route::get('/prometheus/metrics/' . env('PROMETHEUS_SECRET', 'tzUDnGrzj5j3vp0HSz0HKj3LNrYf1cj9'), [MetricsController::class, 'metrics']); 25 | }); 26 | 27 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | compiled.php 2 | config.php 3 | down 4 | events.scanned.php 5 | maintenance.php 6 | routes.php 7 | routes.scanned.php 8 | schedule-* 9 | services.json 10 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 18 | 19 | return $app; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/Feature/RetrieveAllSubscriptionPlansTest.php: -------------------------------------------------------------------------------- 1 | getJson('/api/v1/billing-plans'); 16 | $response->assertStatus(200) 17 | ->assertJsonStructure([ 18 | 'status', 19 | 'message', 20 | 'data' => [ 21 | '*' => [ 22 | 'id', 23 | 'name', 24 | 'price', 25 | 'created_at' 26 | ] 27 | ] 28 | ]); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 |