Skip to content

Conversation

@ljonesfl
Copy link
Member

@ljonesfl ljonesfl commented Nov 11, 2025

Adds a more service-like architecture to the system.

Summary by CodeRabbit

  • New Features

    • Enhanced post workflows: create, update, delete, publish/unpublish, schedule; automatic slug, category and tag handling.
  • Bug Fixes

    • Author column shows username with "Unknown" fallback.
    • Views display correct view counts.
    • Post editor now uses body field for content.
  • Chores

    • Large refactor for naming consistency, repository/service patterns, and centralized DB connection; CLI and email sender modernized.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 11, 2025

Warning

Rate limit exceeded

@ljonesfl has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 8 minutes and 53 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 190117c and 31605d6.

📒 Files selected for processing (3)
  • readme.md (1 hunks)
  • src/Cms/Controllers/Admin/ProfileController.php (2 hunks)
  • tests/Cms/Services/Post/PublisherTest.php (1 hunks)

Walkthrough

Wide-scope mechanical refactor: normalized identifier casing (lowerCamelCase / snake_case), centralized PDO creation via new ConnectionFactory using SettingManager, migrated repositories and tests to DI, added post/tag service layer, renamed/moved email sender, and updated controllers, CLI, views, initializers, and many tests.

Changes

Cohort / File(s) Summary
Database connection factory
src/Cms/Database/ConnectionFactory.php
New class providing createFromSettings() / createFromConfig() that builds DSNs for sqlite/mysql/pgsql and returns configured PDO; throws on missing/unsupported config.
Repository interfaces & implementations
src/Cms/Repositories/*
src/Cms/Repositories/ICategoryRepository.php, .../IPostRepository.php, .../ITagRepository.php, .../IUserRepository.php, .../IPasswordResetTokenRepository.php, .../DatabaseCategoryRepository.php, .../DatabasePostRepository.php, .../DatabaseTagRepository.php, .../DatabaseUserRepository.php, .../DatabasePasswordResetTokenRepository.php
Constructors migrated to accept SettingManager; repositories now obtain PDO via ConnectionFactory::createFromSettings(); PDO property renamed to $_pdo; parameter names standardized to camelCase; new findByIds() added to category repo.
Auth core & filters
src/Cms/Auth/* and filters src/Cms/Auth/Filters/*
Renamed private fields/params to consistent camelCase/snake_case; standardized method parameter names; added CsrfTokenManager::regenerate(); tightened remember-token cookie handling and naming consistency.
Session & Password handling
src/Cms/Auth/SessionManager.php, src/Cms/Auth/PasswordHasher.php
Session/private properties renamed and parameter names standardized; password hasher public method parameter names normalized; no functional behavior changes beyond naming.
Password reset flow
src/Cms/Auth/PasswordResetManager.php, resources/app/Initializers/PasswordResetInitializer.php
Token manager and initializer switched to use $settings and repositories constructed from SettingManager (no intermediate dbConfig); parameter/variable renames to camelCase; control-flow simplified.
Models
src/Cms/Models/* (Category, Post, Tag, User, PasswordResetToken)
Converted internal properties and method parameter names to snake_case / lowerCamelCase; updated fromArray() / toArray() mappings and getters/setters to new names.
Post & Tag service layer
src/Cms/Services/Post/*, src/Cms/Services/Tag/*
New services: Post Creator, Updater, Deleter, Publisher; Tag Creator and Tag Resolver for slugging and resolving/creating tags; constructors inject repository/resolver dependencies.
Email service & helpers
src/Cms/Services/Email/Sender.php, src/Cms/Email/helpers.php
EmailService moved/renamed to Sender (namespace Services\Email); constructor/property names normalized; helper factory functions updated to return/use Sender.
Maintenance
src/Cms/Maintenance/*, resources/app/Initializers/MaintenanceInitializer.php
Internal properties and params renamed to consistent casing; MaintenanceManager file path and enable/isIpAllowed signatures updated; initializers use $settings/$app.
Controllers (admin/auth/public/content/blog)
src/Cms/Controllers/Admin/*, src/Cms/Controllers/Auth/*, src/Cms/Controllers/Blog.php, src/Cms/Controllers/Content.php
Widespread renaming to lowerCamelCase variables/params; PostController wired to new post/tag services; repository instantiation switched to use SettingManager/DI; view-data variables standardized.
Initializers & entrypoint
resources/app/Initializers/*, resources/public/index.php, src/Bootstrap.php
Initializers and index.php variable renames ($App$app, $Settings$settings); router filter registration updated to $app->getRouter()->registerFilter(...); boot() param renamed to $configPath.
CLI commands
src/Cms/Cli/Commands/*
Standardized parameter names; replaced echo-based output with structured $this->output->... methods; Settings retrieval moved to Registry; many helper method renames and signature normalizations.
Views
resources/views/admin/posts/edit.php, resources/views/admin/posts/index.php, resources/views/blog/category.php, resources/views/blog/tag.php
Content textarea uses getBody(); author rendering made null-safe (use author->getUsername() or "Unknown"); views use getViewCount() for views column.
Tests
tests/**/* (many files)
Updated tests to match renamed properties/params and repository constructors (now take SettingManager); injected SettingManager mocks where needed; added unit tests for new services (Post Creator/Updater/Deleter/Publisher, Tag Creator/Resolver); removed tests tied to removed getDatabaseConfig helpers.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant Controller
    participant Service as PostService (Creator/Updater)
    participant CategoryRepo
    participant TagResolver
    participant Repo as IPostRepository
    participant Settings as SettingManager
    participant CF as ConnectionFactory
    participant PDO

    Controller->>Service: create(title, body, authorId, status, ...)
    Service->>CategoryRepo: findByIds(categoryIds)
    Service->>TagResolver: resolveFromString(tagNames)
    Service->>Repo: create(Post)
    Repo->>CF: createFromSettings(Settings)
    CF->>Settings: getSection("database")
    CF->>PDO: new PDO(DSN,...)
    PDO-->>Repo: PDO instance
    Repo-->>Service: persisted Post
    Service-->>Controller: Post
Loading
sequenceDiagram
    autonumber
    participant Repo
    participant CF as ConnectionFactory
    participant Settings as SettingManager
    participant PDO

    Repo->>CF: createFromSettings(Settings)
    CF->>Settings: getSection('database')
    CF->>PDO: build DSN & new PDO(...)
    PDO-->>Repo: PDO instance
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Areas to focus review on:

  • ConnectionFactory DSN and adapter edge cases (sqlite paths, charset/port defaults).
  • Repository constructor/DI changes and tests mocking SettingManager.
  • Post service behaviors (slug generation, category/tag association, publishedAt handling).
  • Password reset/token repo changes and token hashing flow.
  • Csrf/remember-token cookie security and SessionManager behavior.
  • Views' null-safe author access consistency across models and repositories.
  • CLI output changes: ensure output object methods exist and interactive flows remain correct.

Possibly related PRs

Poem

🐰
I hopped through files with nimble feet,
I tamed the names and made them neat.
PDOs now spring from a single tree,
Posts get slugs and tags roam free.
A carrot cake for every passing test!

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Feature/service architecture' is vague and doesn't clearly convey the main changes in this large refactoring PR that spans naming conventions, service classes, and architectural improvements. Consider a more descriptive title such as 'Refactor codebase to camelCase naming conventions and introduce service architecture pattern' to better summarize the scope of changes.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed Docstring coverage is 91.36% which is sufficient. The required threshold is 80.00%.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

🧹 Nitpick comments (10)
src/Cms/Cli/Commands/Install/InstallCommand.php (1)

390-432: Consider checking mkdir return value for better error reporting.

Line 399 calls mkdir() without verifying success. While subsequent copy() calls will fail if the directory creation fails, explicitly checking the return value would provide clearer error messages.

Apply this diff to add error handling:

 	if( !is_dir( $dest ) )
 	{
-		mkdir( $dest, 0755, true );
+		if( !mkdir( $dest, 0755, true ) )
+		{
+			$this->output->error( "  Failed to create directory: $dest" );
+			return false;
+		}
 	}
src/Cms/Auth/CsrfTokenManager.php (1)

65-68: Consider removing redundant regenerate() method.

The regenerate() method simply delegates to generate() without any additional logic. While it provides semantic clarity, it adds no functional value.

If you prefer to keep it for API clarity, consider adding a docblock explaining the distinction (if any) between regenerate() and generate(), or simply remove it and use generate() directly.

-	/**
-	 * Regenerate CSRF token
-	 */
-	public function regenerate(): string
-	{
-		return $this->generate();
-	}
src/Cms/Services/Post/Updater.php (1)

85-91: Extract duplicated generateSlug() to a shared utility.

The generateSlug() implementation is identical in both Creator and Updater services, violating the DRY principle.

Consider extracting this to a shared utility class:

// src/Cms/Services/Post/SlugGenerator.php
namespace Neuron\Cms\Services\Post;

class SlugGenerator
{
	public static function generate( string $title ): string
	{
		$slug = strtolower( trim( $title ) );
		$slug = preg_replace( '/[^a-z0-9-]/', '-', $slug );
		$slug = preg_replace( '/-+/', '-', $slug );
		return trim( $slug, '-' );
	}
}

Then use it in both services:

$post->setSlug( $slug ?: SlugGenerator::generate( $title ) );

The same duplication exists in Tag\Creator (lines 46-52), so this utility could be used there as well.

src/Cms/Services/Tag/Creator.php (1)

46-52: Extract duplicated generateSlug() to a shared utility.

This generateSlug() implementation is identical to the ones in Post\Creator and Post\Updater, violating the DRY principle. See the suggestion in the Updater review (lines 85-91) for a shared utility approach.

tests/Cms/BlogTest.php (1)

25-34: Consider removing or updating deprecated tests.

All tests in this file are marked as skipped and reference the deprecated Blahg library. This file adds maintenance overhead without providing value.

Consider either:

  1. Removing this file entirely if the tests are no longer relevant
  2. Creating new tests for the current Blog controller implementation that uses DatabasePostRepository, DatabaseCategoryRepository, and DatabaseTagRepository

If you'd like, I can help generate updated test cases that work with the current implementation.

src/Cms/Cli/Commands/User/CreateCommand.php (1)

44-45: Clarify or remove the unused $parameters.

PHPMD is flagging execute() because $parameters is never used. Either accept non-interactive input here (e.g., allow passing username, email, etc.) or explicitly silence the warning so CI stays green. A minimal fix would be:

 public function execute( array $parameters = [] ): int
 {
+    unset( $parameters );
src/Cms/Services/Post/Creator.php (1)

94-100: Consider sharing slugification logic.

generateSlug() duplicates the rules already living in Neuron\Cms\Services\Tag\Creator. Pulling both behind a shared slug helper (or trait) would keep posts and tags in sync if the rules ever change.

src/Cms/Controllers/Admin/PostController.php (1)

41-72: Consider dependency injection container for service wiring.

The manual service instantiation works correctly but creates tight coupling. For future maintenance, consider using a DI container to manage service dependencies.

src/Cms/Controllers/Admin/UserController.php (1)

57-58: Consider reusing CsrfTokenManager as a class property.

The CsrfTokenManager is instantiated multiple times across different methods. Consider initializing it once in the constructor and reusing it throughout the class.

Apply this pattern in the constructor:

 	private DatabaseUserRepository $_repository;
 	private PasswordHasher $_hasher;
 	private SessionManager $_sessionManager;
+	private CsrfTokenManager $_csrfManager;
 	$this->_repository = new DatabaseUserRepository( $settings );
 	$this->_hasher = new PasswordHasher();
 	$this->_sessionManager = new SessionManager();
 	$this->_sessionManager->start();
+	$this->_csrfManager = new CsrfTokenManager( $this->_sessionManager );

Then replace instantiations with:

-	$csrfManager = new CsrfTokenManager( $this->_sessionManager );
-	Registry::getInstance()->set( 'Auth.CsrfToken', $csrfManager->getToken() );
+	Registry::getInstance()->set( 'Auth.CsrfToken', $this->_csrfManager->getToken() );
src/Cms/Controllers/Admin/TagController.php (1)

296-302: Consider enhancing slug generation to handle Unicode characters.

The current implementation strips non-ASCII characters. For better internationalization support, consider using a library like cocur/slugify or enhancing the regex to transliterate Unicode characters.

Example enhancement for basic transliteration:

 private function generateSlug( string $name ): string
 {
+	// Basic transliteration for common accented characters
+	$name = iconv( 'UTF-8', 'ASCII//TRANSLIT//IGNORE', $name );
 	$slug = strtolower( trim( $name ) );
 	$slug = preg_replace( '/[^a-z0-9-]/', '-', $slug );
 	$slug = preg_replace( '/-+/', '-', $slug );
 	return trim( $slug, '-' );
 }

Or use a dedicated library:

use Cocur\Slugify\Slugify;

private function generateSlug( string $name ): string
{
	$slugify = new Slugify();
	return $slugify->slugify( $name );
}
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 356f4f9 and 379e30a.

📒 Files selected for processing (81)
  • resources/app/Initializers/AuthInitializer.php (2 hunks)
  • resources/app/Initializers/MaintenanceInitializer.php (2 hunks)
  • resources/app/Initializers/PasswordResetInitializer.php (2 hunks)
  • resources/public/index.php (1 hunks)
  • resources/views/admin/posts/edit.php (1 hunks)
  • resources/views/admin/posts/index.php (1 hunks)
  • resources/views/blog/category.php (1 hunks)
  • resources/views/blog/tag.php (1 hunks)
  • src/Bootstrap.php (1 hunks)
  • src/Cms/Auth/AuthManager.php (7 hunks)
  • src/Cms/Auth/CsrfTokenManager.php (1 hunks)
  • src/Cms/Auth/Filters/AuthenticationFilter.php (1 hunks)
  • src/Cms/Auth/Filters/CsrfFilter.php (2 hunks)
  • src/Cms/Auth/PasswordHasher.php (2 hunks)
  • src/Cms/Auth/PasswordResetManager.php (5 hunks)
  • src/Cms/Auth/SessionManager.php (5 hunks)
  • src/Cms/Auth/helpers.php (4 hunks)
  • src/Cms/Cli/Commands/Generate/EmailCommand.php (4 hunks)
  • src/Cms/Cli/Commands/Install/InstallCommand.php (38 hunks)
  • src/Cms/Cli/Commands/Maintenance/EnableCommand.php (1 hunks)
  • src/Cms/Cli/Commands/Queue/InstallCommand.php (9 hunks)
  • src/Cms/Cli/Commands/User/CreateCommand.php (7 hunks)
  • src/Cms/Cli/Commands/User/DeleteCommand.php (5 hunks)
  • src/Cms/Cli/Commands/User/ListCommand.php (5 hunks)
  • src/Cms/Controllers/Admin/CategoryController.php (5 hunks)
  • src/Cms/Controllers/Admin/DashboardController.php (1 hunks)
  • src/Cms/Controllers/Admin/PostController.php (4 hunks)
  • src/Cms/Controllers/Admin/ProfileController.php (2 hunks)
  • src/Cms/Controllers/Admin/TagController.php (4 hunks)
  • src/Cms/Controllers/Admin/UserController.php (5 hunks)
  • src/Cms/Controllers/Auth/LoginController.php (1 hunks)
  • src/Cms/Controllers/Auth/PasswordResetController.php (3 hunks)
  • src/Cms/Controllers/Blog.php (6 hunks)
  • src/Cms/Controllers/Content.php (7 hunks)
  • src/Cms/Database/ConnectionFactory.php (1 hunks)
  • src/Cms/Email/helpers.php (5 hunks)
  • src/Cms/Maintenance/MaintenanceConfig.php (8 hunks)
  • src/Cms/Maintenance/MaintenanceFilter.php (6 hunks)
  • src/Cms/Maintenance/MaintenanceManager.php (9 hunks)
  • src/Cms/Models/Category.php (7 hunks)
  • src/Cms/Models/PasswordResetToken.php (7 hunks)
  • src/Cms/Models/Post.php (19 hunks)
  • src/Cms/Models/Tag.php (6 hunks)
  • src/Cms/Models/User.php (19 hunks)
  • src/Cms/Repositories/DatabaseCategoryRepository.php (8 hunks)
  • src/Cms/Repositories/DatabasePasswordResetTokenRepository.php (5 hunks)
  • src/Cms/Repositories/DatabasePostRepository.php (15 hunks)
  • src/Cms/Repositories/DatabaseTagRepository.php (9 hunks)
  • src/Cms/Repositories/DatabaseUserRepository.php (11 hunks)
  • src/Cms/Repositories/ICategoryRepository.php (1 hunks)
  • src/Cms/Repositories/IPasswordResetTokenRepository.php (1 hunks)
  • src/Cms/Repositories/IPostRepository.php (2 hunks)
  • src/Cms/Repositories/ITagRepository.php (1 hunks)
  • src/Cms/Repositories/IUserRepository.php (1 hunks)
  • src/Cms/Services/Email/Sender.php (14 hunks)
  • src/Cms/Services/Post/Creator.php (1 hunks)
  • src/Cms/Services/Post/Deleter.php (1 hunks)
  • src/Cms/Services/Post/Publisher.php (1 hunks)
  • src/Cms/Services/Post/Updater.php (1 hunks)
  • src/Cms/Services/Tag/Creator.php (1 hunks)
  • src/Cms/Services/Tag/Resolver.php (1 hunks)
  • tests/BootstrapTest.php (6 hunks)
  • tests/Cms/Auth/AuthManagerTest.php (2 hunks)
  • tests/Cms/BlogControllerTest.php (15 hunks)
  • tests/Cms/BlogTest.php (9 hunks)
  • tests/Cms/Cli/Commands/Install/InstallCommandTest.php (0 hunks)
  • tests/Cms/ContentControllerTest.php (5 hunks)
  • tests/Cms/Maintenance/MaintenanceCommandsTest.php (11 hunks)
  • tests/Cms/Maintenance/MaintenanceConfigTest.php (6 hunks)
  • tests/Cms/Maintenance/MaintenanceFilterTest.php (12 hunks)
  • tests/Cms/Maintenance/MaintenanceManagerTest.php (14 hunks)
  • tests/Cms/Repositories/DatabaseCategoryRepositoryTest.php (1 hunks)
  • tests/Cms/Repositories/DatabasePostRepositoryTest.php (1 hunks)
  • tests/Cms/Repositories/DatabaseTagRepositoryTest.php (1 hunks)
  • tests/Cms/Repositories/DatabaseUserRepositoryTest.php (5 hunks)
  • tests/Cms/Services/Post/CreatorTest.php (1 hunks)
  • tests/Cms/Services/Post/DeleterTest.php (1 hunks)
  • tests/Cms/Services/Post/PublisherTest.php (1 hunks)
  • tests/Cms/Services/Post/UpdaterTest.php (1 hunks)
  • tests/Cms/Services/Tag/CreatorTest.php (1 hunks)
  • tests/Cms/Services/Tag/ResolverTest.php (1 hunks)
💤 Files with no reviewable changes (1)
  • tests/Cms/Cli/Commands/Install/InstallCommandTest.php
🧰 Additional context used
🧬 Code graph analysis (73)
tests/Cms/Maintenance/MaintenanceCommandsTest.php (3)
src/Cms/Maintenance/MaintenanceManager.php (8)
  • MaintenanceManager (10-225)
  • isEnabled (27-37)
  • getStatus (93-101)
  • enable (48-71)
  • getMessage (146-151)
  • getRetryAfter (158-163)
  • isIpAllowed (109-139)
  • disable (78-86)
tests/Cms/Maintenance/MaintenanceFilterTest.php (1)
  • setUp (20-31)
tests/Cms/Maintenance/MaintenanceManagerTest.php (1)
  • setUp (18-26)
src/Cms/Services/Post/Deleter.php (4)
src/Cms/Models/Post.php (2)
  • Post (13-516)
  • getId (48-51)
src/Cms/Controllers/Admin/PostController.php (1)
  • __construct (41-72)
src/Cms/Repositories/DatabasePostRepository.php (1)
  • delete (192-199)
src/Cms/Repositories/IPostRepository.php (1)
  • delete (37-37)
resources/views/admin/posts/edit.php (1)
src/Cms/Models/Post.php (1)
  • getBody (99-102)
resources/app/Initializers/MaintenanceInitializer.php (2)
resources/app/Initializers/AuthInitializer.php (1)
  • run (27-76)
src/Cms/Maintenance/MaintenanceManager.php (1)
  • MaintenanceManager (10-225)
tests/Cms/Services/Post/DeleterTest.php (3)
src/Cms/Models/Post.php (2)
  • Post (13-516)
  • setId (56-60)
src/Cms/Services/Post/Deleter.php (3)
  • Deleter (15-50)
  • delete (30-38)
  • deleteById (46-49)
src/Cms/Repositories/IPostRepository.php (1)
  • delete (37-37)
resources/views/admin/posts/index.php (2)
src/Cms/Models/Post.php (2)
  • getAuthor (167-170)
  • getViewCount (246-249)
src/Cms/Models/User.php (1)
  • getUsername (70-73)
resources/public/index.php (1)
src/Bootstrap.php (1)
  • boot (35-38)
resources/views/blog/category.php (2)
src/Cms/Models/Post.php (1)
  • getAuthor (167-170)
src/Cms/Models/User.php (1)
  • getUsername (70-73)
src/Cms/Repositories/IPasswordResetTokenRepository.php (2)
src/Cms/Repositories/DatabasePasswordResetTokenRepository.php (4)
  • create (37-54)
  • findByToken (59-67)
  • deleteByEmail (72-78)
  • deleteByToken (83-89)
src/Cms/Models/PasswordResetToken.php (1)
  • PasswordResetToken (14-178)
src/Cms/Cli/Commands/Maintenance/EnableCommand.php (1)
src/Cms/Maintenance/MaintenanceConfig.php (2)
  • MaintenanceConfig (10-146)
  • getAllowedIps (93-104)
src/Cms/Cli/Commands/User/CreateCommand.php (4)
src/Cms/Cli/Commands/Generate/EmailCommand.php (1)
  • execute (48-85)
src/Cms/Cli/Commands/Install/InstallCommand.php (1)
  • execute (61-142)
src/Cms/Cli/Commands/User/DeleteCommand.php (2)
  • execute (42-113)
  • prompt (143-147)
src/Cms/Repositories/DatabaseUserRepository.php (1)
  • DatabaseUserRepository (19-250)
src/Cms/Cli/Commands/User/DeleteCommand.php (2)
src/Cms/Cli/Commands/User/CreateCommand.php (2)
  • execute (44-162)
  • prompt (192-196)
src/Cms/Repositories/DatabaseUserRepository.php (1)
  • DatabaseUserRepository (19-250)
src/Cms/Maintenance/MaintenanceFilter.php (1)
src/Cms/Maintenance/MaintenanceManager.php (6)
  • MaintenanceManager (10-225)
  • __construct (17-20)
  • isEnabled (27-37)
  • isIpAllowed (109-139)
  • getRetryAfter (158-163)
  • getMessage (146-151)
src/Cms/Repositories/DatabasePasswordResetTokenRepository.php (3)
src/Cms/Database/ConnectionFactory.php (2)
  • ConnectionFactory (17-78)
  • createFromSettings (26-36)
src/Cms/Models/PasswordResetToken.php (7)
  • PasswordResetToken (14-178)
  • getEmail (57-60)
  • getToken (74-77)
  • getCreatedAt (91-94)
  • getExpiresAt (108-111)
  • setId (48-52)
  • fromArray (133-163)
src/Cms/Repositories/IPasswordResetTokenRepository.php (4)
  • create (22-22)
  • findByToken (30-30)
  • deleteByEmail (38-38)
  • deleteByToken (46-46)
src/Cms/Controllers/Admin/DashboardController.php (5)
src/Cms/Auth/CsrfTokenManager.php (3)
  • __construct (18-21)
  • CsrfTokenManager (13-69)
  • getToken (36-44)
src/Cms/Auth/SessionManager.php (5)
  • __construct (18-27)
  • get (105-109)
  • SessionManager (13-185)
  • start (32-55)
  • set (96-100)
src/Cms/Controllers/Admin/PostController.php (2)
  • __construct (41-72)
  • index (80-122)
src/Cms/Controllers/Content.php (1)
  • getName (118-121)
src/Cms/Models/User.php (1)
  • getUsername (70-73)
src/Cms/Repositories/IUserRepository.php (1)
src/Cms/Repositories/DatabaseUserRepository.php (7)
  • findById (37-45)
  • findByUsername (50-58)
  • findByEmail (63-71)
  • findByRememberToken (76-84)
  • create (89-130)
  • update (135-188)
  • delete (193-199)
src/Cms/Repositories/ITagRepository.php (2)
src/Cms/Repositories/DatabaseTagRepository.php (6)
  • findById (37-45)
  • findBySlug (50-58)
  • findByName (63-71)
  • create (76-105)
  • update (110-145)
  • delete (150-157)
src/Cms/Repositories/ICategoryRepository.php (6)
  • findById (17-17)
  • findBySlug (22-22)
  • findByName (27-27)
  • create (40-40)
  • update (45-45)
  • delete (50-50)
src/Cms/Services/Tag/Resolver.php (6)
src/Cms/Models/Tag.php (1)
  • Tag (13-166)
src/Cms/Services/Post/Creator.php (2)
  • Creator (18-101)
  • create (49-86)
src/Cms/Services/Tag/Creator.php (2)
  • Creator (15-53)
  • create (31-38)
src/Cms/Controllers/Admin/PostController.php (2)
  • __construct (41-72)
  • create (130-160)
src/Cms/Repositories/DatabaseTagRepository.php (2)
  • findByName (63-71)
  • create (76-105)
src/Cms/Repositories/ITagRepository.php (2)
  • findByName (27-27)
  • create (32-32)
tests/Cms/Maintenance/MaintenanceManagerTest.php (1)
src/Cms/Maintenance/MaintenanceManager.php (8)
  • MaintenanceManager (10-225)
  • isEnabled (27-37)
  • getStatus (93-101)
  • enable (48-71)
  • disable (78-86)
  • getMessage (146-151)
  • getRetryAfter (158-163)
  • isIpAllowed (109-139)
src/Cms/Cli/Commands/Queue/InstallCommand.php (2)
src/Cms/Cli/Commands/Generate/EmailCommand.php (1)
  • __construct (15-19)
src/Cms/Cli/Commands/Install/InstallCommand.php (2)
  • __construct (25-32)
  • camelToSnake (897-900)
tests/Cms/Services/Tag/CreatorTest.php (3)
src/Cms/Models/Tag.php (7)
  • Tag (13-166)
  • setId (37-41)
  • setName (54-58)
  • setSlug (71-75)
  • getName (46-49)
  • getSlug (63-66)
  • getId (29-32)
src/Cms/Services/Tag/Creator.php (2)
  • Creator (15-53)
  • create (31-38)
src/Cms/Repositories/ITagRepository.php (1)
  • create (32-32)
src/Cms/Services/Post/Publisher.php (4)
src/Cms/Models/Post.php (4)
  • Post (13-516)
  • getStatus (188-191)
  • setStatus (196-200)
  • setPublishedAt (237-241)
src/Cms/Repositories/DatabasePostRepository.php (1)
  • update (127-187)
src/Cms/Repositories/IPostRepository.php (1)
  • update (32-32)
src/Cms/Services/Post/Updater.php (1)
  • update (48-77)
tests/Cms/Repositories/DatabaseUserRepositoryTest.php (1)
src/Cms/Repositories/DatabaseUserRepository.php (1)
  • DatabaseUserRepository (19-250)
src/Cms/Repositories/DatabaseUserRepository.php (3)
src/Cms/Database/ConnectionFactory.php (2)
  • ConnectionFactory (17-78)
  • createFromSettings (26-36)
src/Cms/Repositories/DatabaseCategoryRepository.php (4)
  • findById (37-45)
  • create (98-128)
  • update (133-170)
  • delete (175-182)
src/Cms/Repositories/IUserRepository.php (7)
  • findById (17-17)
  • findByUsername (22-22)
  • findByEmail (27-27)
  • findByRememberToken (32-32)
  • create (37-37)
  • update (42-42)
  • delete (47-47)
resources/app/Initializers/PasswordResetInitializer.php (3)
resources/app/Initializers/AuthInitializer.php (1)
  • run (27-76)
src/Cms/Repositories/DatabasePasswordResetTokenRepository.php (1)
  • DatabasePasswordResetTokenRepository (19-117)
src/Cms/Repositories/DatabaseUserRepository.php (1)
  • DatabaseUserRepository (19-250)
tests/Cms/Maintenance/MaintenanceConfigTest.php (5)
tests/BootstrapTest.php (1)
  • setUp (17-29)
tests/Cms/ContentControllerTest.php (1)
  • setUp (19-57)
tests/Cms/Maintenance/MaintenanceCommandsTest.php (1)
  • setUp (19-27)
tests/Cms/Maintenance/MaintenanceFilterTest.php (1)
  • setUp (20-31)
tests/Cms/Maintenance/MaintenanceManagerTest.php (1)
  • setUp (18-26)
tests/Cms/ContentControllerTest.php (2)
tests/BootstrapTest.php (1)
  • setUp (17-29)
src/Cms/Controllers/Content.php (12)
  • Content (56-210)
  • getName (118-121)
  • getTitle (136-139)
  • getDescription (154-157)
  • getUrl (172-175)
  • getRssUrl (98-101)
  • setName (127-131)
  • setTitle (145-149)
  • setDescription (163-167)
  • setUrl (183-187)
  • setRssUrl (109-113)
  • markdown (193-209)
src/Cms/Repositories/ICategoryRepository.php (3)
src/Cms/Repositories/DatabaseCategoryRepository.php (7)
  • findById (37-45)
  • findBySlug (50-58)
  • findByName (63-71)
  • findByIds (79-93)
  • create (98-128)
  • update (133-170)
  • delete (175-182)
src/Cms/Services/Post/Creator.php (1)
  • create (49-86)
src/Cms/Services/Post/Updater.php (1)
  • update (48-77)
src/Cms/Email/helpers.php (1)
src/Cms/Services/Email/Sender.php (1)
  • Sender (18-270)
src/Cms/Controllers/Admin/UserController.php (6)
src/Cms/Repositories/DatabaseUserRepository.php (3)
  • DatabaseUserRepository (19-250)
  • all (204-210)
  • create (89-130)
src/Cms/Auth/PasswordHasher.php (3)
  • PasswordHasher (13-200)
  • meetsRequirements (53-86)
  • hash (24-30)
src/Cms/Auth/SessionManager.php (6)
  • SessionManager (13-185)
  • get (105-109)
  • start (32-55)
  • set (96-100)
  • getFlash (141-147)
  • flash (132-136)
src/Cms/Controllers/Admin/ProfileController.php (1)
  • __construct (32-43)
src/Cms/Controllers/Content.php (1)
  • __construct (67-93)
src/Cms/Auth/CsrfTokenManager.php (2)
  • CsrfTokenManager (13-69)
  • getToken (36-44)
resources/views/blog/tag.php (2)
src/Cms/Models/Post.php (1)
  • getAuthor (167-170)
src/Cms/Models/User.php (1)
  • getUsername (70-73)
tests/Cms/BlogTest.php (1)
src/Cms/Controllers/Blog.php (6)
  • Blog (17-283)
  • index (52-79)
  • show (87-121)
  • tag (160-191)
  • category (199-230)
  • feed (239-282)
src/Cms/Services/Post/Creator.php (7)
src/Cms/Models/Post.php (12)
  • Post (13-516)
  • setTitle (73-77)
  • setSlug (90-94)
  • setBody (107-111)
  • setExcerpt (124-128)
  • setFeaturedImage (141-145)
  • setAuthorId (158-162)
  • setStatus (196-200)
  • setCreatedAt (280-284)
  • setPublishedAt (237-241)
  • setCategories (318-322)
  • setTags (378-382)
src/Cms/Services/Tag/Resolver.php (2)
  • Resolver (16-64)
  • resolveFromString (37-63)
src/Cms/Services/Tag/Creator.php (3)
  • Creator (15-53)
  • create (31-38)
  • generateSlug (46-52)
src/Cms/Repositories/DatabaseCategoryRepository.php (2)
  • create (98-128)
  • findByIds (79-93)
src/Cms/Repositories/DatabasePostRepository.php (1)
  • create (76-122)
src/Cms/Repositories/ICategoryRepository.php (2)
  • create (40-40)
  • findByIds (35-35)
src/Cms/Repositories/IPostRepository.php (1)
  • create (27-27)
src/Cms/Services/Post/Updater.php (5)
src/Cms/Models/Post.php (9)
  • Post (13-516)
  • setTitle (73-77)
  • setSlug (90-94)
  • setBody (107-111)
  • setExcerpt (124-128)
  • setFeaturedImage (141-145)
  • setStatus (196-200)
  • setCategories (318-322)
  • setTags (378-382)
src/Cms/Services/Tag/Resolver.php (2)
  • Resolver (16-64)
  • resolveFromString (37-63)
src/Cms/Controllers/Admin/PostController.php (1)
  • update (279-341)
src/Cms/Repositories/DatabaseCategoryRepository.php (2)
  • update (133-170)
  • findByIds (79-93)
src/Cms/Repositories/DatabasePostRepository.php (1)
  • update (127-187)
resources/app/Initializers/AuthInitializer.php (3)
resources/app/Initializers/MaintenanceInitializer.php (1)
  • run (26-80)
resources/app/Initializers/PasswordResetInitializer.php (1)
  • run (27-87)
src/Cms/Repositories/DatabaseUserRepository.php (1)
  • DatabaseUserRepository (19-250)
src/Cms/Controllers/Admin/TagController.php (3)
src/Cms/Repositories/DatabaseTagRepository.php (2)
  • DatabaseTagRepository (19-204)
  • create (76-105)
src/Cms/Controllers/Admin/CategoryController.php (2)
  • __construct (29-38)
  • create (80-101)
src/Cms/Controllers/Admin/PostController.php (2)
  • __construct (41-72)
  • create (130-160)
tests/BootstrapTest.php (5)
tests/Cms/ContentControllerTest.php (1)
  • setUp (19-57)
tests/Cms/Maintenance/MaintenanceCommandsTest.php (1)
  • setUp (19-27)
tests/Cms/Maintenance/MaintenanceConfigTest.php (1)
  • setUp (17-21)
tests/Cms/Maintenance/MaintenanceFilterTest.php (1)
  • setUp (20-31)
tests/Cms/Maintenance/MaintenanceManagerTest.php (1)
  • setUp (18-26)
tests/Cms/Services/Post/CreatorTest.php (7)
src/Cms/Models/Post.php (3)
  • Post (13-516)
  • getCategories (308-311)
  • getTags (368-371)
src/Cms/Models/Category.php (1)
  • Category (13-186)
src/Cms/Models/Tag.php (1)
  • Tag (13-166)
src/Cms/Services/Post/Creator.php (2)
  • Creator (18-101)
  • create (49-86)
src/Cms/Services/Tag/Resolver.php (1)
  • Resolver (16-64)
src/Cms/Repositories/ICategoryRepository.php (2)
  • create (40-40)
  • count (62-62)
src/Cms/Repositories/IPostRepository.php (2)
  • create (27-27)
  • count (104-104)
src/Cms/Controllers/Auth/PasswordResetController.php (5)
src/Cms/Auth/PasswordResetManager.php (5)
  • PasswordResetManager (18-239)
  • __construct (38-53)
  • requestReset (73-104)
  • validateToken (112-124)
  • resetPassword (134-167)
src/Cms/Auth/SessionManager.php (5)
  • SessionManager (13-185)
  • get (105-109)
  • start (32-55)
  • getFlash (141-147)
  • flash (132-136)
src/Cms/Auth/CsrfTokenManager.php (3)
  • CsrfTokenManager (13-69)
  • getToken (36-44)
  • validate (49-60)
src/Cms/Controllers/Auth/LoginController.php (1)
  • __construct (31-48)
src/Cms/Controllers/Content.php (2)
  • __construct (67-93)
  • getName (118-121)
tests/Cms/Services/Tag/ResolverTest.php (3)
src/Cms/Models/Tag.php (5)
  • Tag (13-166)
  • setId (37-41)
  • setName (54-58)
  • setSlug (71-75)
  • getName (46-49)
src/Cms/Services/Tag/Creator.php (1)
  • Creator (15-53)
src/Cms/Services/Tag/Resolver.php (2)
  • Resolver (16-64)
  • resolveFromString (37-63)
tests/Cms/Auth/AuthManagerTest.php (1)
src/Cms/Repositories/DatabaseUserRepository.php (1)
  • DatabaseUserRepository (19-250)
src/Cms/Controllers/Admin/PostController.php (12)
src/Cms/Models/Post.php (3)
  • Post (13-516)
  • getId (48-51)
  • getAuthor (167-170)
src/Cms/Services/Post/Creator.php (2)
  • Creator (18-101)
  • create (49-86)
src/Cms/Services/Tag/Creator.php (2)
  • Creator (15-53)
  • create (31-38)
src/Cms/Services/Post/Updater.php (2)
  • Updater (17-92)
  • update (48-77)
src/Cms/Services/Post/Deleter.php (2)
  • Deleter (15-50)
  • delete (30-38)
src/Cms/Services/Tag/Resolver.php (1)
  • Resolver (16-64)
src/Cms/Repositories/DatabasePostRepository.php (7)
  • DatabasePostRepository (22-534)
  • all (204-229)
  • getByAuthor (234-252)
  • create (76-122)
  • findById (40-53)
  • update (127-187)
  • delete (192-199)
src/Cms/Repositories/DatabaseCategoryRepository.php (6)
  • DatabaseCategoryRepository (19-229)
  • all (187-193)
  • create (98-128)
  • findById (37-45)
  • update (133-170)
  • delete (175-182)
src/Cms/Repositories/DatabaseTagRepository.php (6)
  • DatabaseTagRepository (19-204)
  • all (162-168)
  • create (76-105)
  • findById (37-45)
  • update (110-145)
  • delete (150-157)
src/Cms/Controllers/Admin/CategoryController.php (5)
  • __construct (29-38)
  • create (80-101)
  • store (110-155)
  • update (203-256)
  • destroy (265-294)
src/Cms/Auth/SessionManager.php (8)
  • get (105-109)
  • SessionManager (13-185)
  • start (32-55)
  • set (96-100)
  • getFlash (141-147)
  • getId (172-176)
  • flash (132-136)
  • destroy (69-91)
src/Cms/Auth/CsrfTokenManager.php (2)
  • CsrfTokenManager (13-69)
  • getToken (36-44)
src/Cms/Auth/AuthManager.php (5)
src/Cms/Auth/SessionManager.php (7)
  • SessionManager (13-185)
  • regenerate (60-64)
  • set (96-100)
  • getId (172-176)
  • destroy (69-91)
  • has (114-118)
  • get (105-109)
src/Cms/Auth/PasswordHasher.php (4)
  • PasswordHasher (13-200)
  • verify (35-38)
  • needsRehash (43-48)
  • hash (24-30)
src/Cms/Models/User.php (13)
  • isLockedOut (324-332)
  • isActive (179-182)
  • incrementFailedLoginAttempts (288-292)
  • getFailedLoginAttempts (271-274)
  • setLockedUntil (315-319)
  • resetFailedLoginAttempts (297-302)
  • setLastLoginAt (379-383)
  • getPasswordHash (104-107)
  • setPasswordHash (112-116)
  • User (12-459)
  • getId (53-56)
  • getRole (121-124)
  • setRememberToken (220-224)
src/Cms/Repositories/DatabaseUserRepository.php (4)
  • findByUsername (50-58)
  • update (135-188)
  • findById (37-45)
  • findByRememberToken (76-84)
src/Cms/Repositories/IUserRepository.php (4)
  • findByUsername (22-22)
  • update (42-42)
  • findById (17-17)
  • findByRememberToken (32-32)
src/Cms/Cli/Commands/Generate/EmailCommand.php (3)
src/Cms/Cli/Commands/Install/InstallCommand.php (2)
  • __construct (25-32)
  • execute (61-142)
src/Cms/Cli/Commands/Queue/InstallCommand.php (2)
  • __construct (19-22)
  • execute (51-151)
src/Cms/Cli/Commands/User/CreateCommand.php (1)
  • execute (44-162)
src/Cms/Auth/helpers.php (2)
src/Cms/Auth/AuthManager.php (2)
  • user (165-188)
  • isAdmin (289-292)
src/Cms/Models/User.php (4)
  • isAdmin (138-141)
  • isEditor (146-149)
  • isAuthor (154-157)
  • getRole (121-124)
tests/Cms/Services/Post/PublisherTest.php (2)
src/Cms/Models/Post.php (6)
  • Post (13-516)
  • setId (56-60)
  • setStatus (196-200)
  • getStatus (188-191)
  • getPublishedAt (229-232)
  • setPublishedAt (237-241)
src/Cms/Services/Post/Publisher.php (4)
  • Publisher (17-95)
  • publish (33-47)
  • unpublish (56-70)
  • schedule (80-94)
src/Cms/Services/Tag/Creator.php (4)
src/Cms/Models/Tag.php (3)
  • Tag (13-166)
  • setName (54-58)
  • setSlug (71-75)
src/Cms/Controllers/Admin/PostController.php (2)
  • __construct (41-72)
  • create (130-160)
src/Cms/Repositories/DatabaseTagRepository.php (1)
  • create (76-105)
src/Cms/Repositories/ITagRepository.php (1)
  • create (32-32)
tests/Cms/Maintenance/MaintenanceFilterTest.php (2)
src/Cms/Maintenance/MaintenanceManager.php (2)
  • MaintenanceManager (10-225)
  • enable (48-71)
src/Cms/Maintenance/MaintenanceFilter.php (1)
  • MaintenanceFilter (11-319)
src/Cms/Repositories/DatabaseTagRepository.php (3)
src/Cms/Database/ConnectionFactory.php (2)
  • ConnectionFactory (17-78)
  • createFromSettings (26-36)
src/Cms/Controllers/Admin/TagController.php (3)
  • __construct (27-36)
  • create (78-99)
  • update (199-250)
src/Cms/Repositories/DatabaseCategoryRepository.php (6)
  • findById (37-45)
  • findBySlug (50-58)
  • findByName (63-71)
  • create (98-128)
  • update (133-170)
  • delete (175-182)
src/Cms/Controllers/Blog.php (4)
src/Cms/Controllers/Content.php (7)
  • Content (56-210)
  • __construct (67-93)
  • getName (118-121)
  • getTitle (136-139)
  • getDescription (154-157)
  • setTitle (145-149)
  • getUrl (172-175)
src/Cms/Repositories/DatabasePostRepository.php (7)
  • DatabasePostRepository (22-534)
  • all (204-229)
  • getPublished (307-310)
  • findBySlug (58-71)
  • incrementViewCount (352-358)
  • getByTag (282-302)
  • getByCategory (257-277)
src/Cms/Repositories/DatabaseCategoryRepository.php (3)
  • DatabaseCategoryRepository (19-229)
  • all (187-193)
  • findBySlug (50-58)
src/Cms/Repositories/DatabaseTagRepository.php (3)
  • DatabaseTagRepository (19-204)
  • all (162-168)
  • findBySlug (50-58)
src/Cms/Auth/PasswordResetManager.php (7)
src/Cms/Auth/PasswordHasher.php (4)
  • PasswordHasher (13-200)
  • hash (24-30)
  • meetsRequirements (53-86)
  • getValidationErrors (91-121)
src/Cms/Controllers/Auth/PasswordResetController.php (3)
  • __construct (33-50)
  • requestReset (83-136)
  • resetPassword (191-247)
src/Cms/Repositories/DatabaseUserRepository.php (3)
  • findByEmail (63-71)
  • create (89-130)
  • update (135-188)
src/Cms/Repositories/IUserRepository.php (3)
  • findByEmail (27-27)
  • create (37-37)
  • update (42-42)
src/Cms/Repositories/DatabasePasswordResetTokenRepository.php (5)
  • deleteByEmail (72-78)
  • create (37-54)
  • findByToken (59-67)
  • deleteByToken (83-89)
  • deleteExpired (94-102)
src/Cms/Repositories/IPasswordResetTokenRepository.php (5)
  • deleteByEmail (38-38)
  • create (22-22)
  • findByToken (30-30)
  • deleteByToken (46-46)
  • deleteExpired (53-53)
src/Cms/Models/PasswordResetToken.php (3)
  • PasswordResetToken (14-178)
  • isExpired (125-128)
  • getEmail (57-60)
src/Cms/Controllers/Content.php (3)
src/Cms/Models/Category.php (3)
  • setName (55-59)
  • setDescription (89-93)
  • getName (47-50)
src/Cms/Models/Tag.php (2)
  • setName (54-58)
  • getName (46-49)
src/Cms/Models/Post.php (2)
  • setTitle (73-77)
  • getTitle (65-68)
src/Cms/Maintenance/MaintenanceManager.php (1)
src/Cms/Maintenance/MaintenanceFilter.php (1)
  • __construct (20-32)
src/Cms/Repositories/IPostRepository.php (1)
src/Cms/Repositories/DatabasePostRepository.php (16)
  • findById (40-53)
  • findBySlug (58-71)
  • create (76-122)
  • update (127-187)
  • delete (192-199)
  • all (204-229)
  • getByAuthor (234-252)
  • getByCategory (257-277)
  • getByTag (282-302)
  • getPublished (307-310)
  • count (331-347)
  • incrementViewCount (352-358)
  • attachCategories (363-384)
  • detachCategories (389-395)
  • attachTags (400-421)
  • detachTags (426-432)
tests/Cms/BlogControllerTest.php (3)
src/Cms/Repositories/DatabasePostRepository.php (2)
  • DatabasePostRepository (22-534)
  • create (76-122)
src/Cms/Repositories/DatabaseCategoryRepository.php (2)
  • DatabaseCategoryRepository (19-229)
  • create (98-128)
src/Cms/Repositories/DatabaseTagRepository.php (2)
  • DatabaseTagRepository (19-204)
  • create (76-105)
src/Cms/Controllers/Admin/CategoryController.php (3)
src/Cms/Repositories/DatabaseCategoryRepository.php (6)
  • DatabaseCategoryRepository (19-229)
  • allWithPostCount (209-228)
  • create (98-128)
  • findById (37-45)
  • update (133-170)
  • delete (175-182)
src/Cms/Controllers/Admin/PostController.php (3)
  • __construct (41-72)
  • create (130-160)
  • update (279-341)
src/Cms/Repositories/ICategoryRepository.php (5)
  • allWithPostCount (69-69)
  • create (40-40)
  • findById (17-17)
  • update (45-45)
  • delete (50-50)
src/Cms/Services/Email/Sender.php (1)
src/Cms/Email/helpers.php (1)
  • email (98-101)
src/Cms/Auth/SessionManager.php (3)
src/Cms/Auth/AuthManager.php (1)
  • __construct (25-34)
src/Cms/Auth/CsrfTokenManager.php (1)
  • __construct (18-21)
src/Cms/Controllers/Auth/LoginController.php (1)
  • __construct (31-48)
src/Cms/Controllers/Admin/ProfileController.php (5)
src/Cms/Repositories/DatabaseUserRepository.php (1)
  • DatabaseUserRepository (19-250)
src/Cms/Auth/PasswordHasher.php (3)
  • PasswordHasher (13-200)
  • meetsRequirements (53-86)
  • hash (24-30)
src/Cms/Auth/SessionManager.php (4)
  • SessionManager (13-185)
  • get (105-109)
  • start (32-55)
  • set (96-100)
src/Cms/Controllers/Admin/UserController.php (1)
  • __construct (33-44)
src/Cms/Auth/CsrfTokenManager.php (1)
  • CsrfTokenManager (13-69)
src/Cms/Cli/Commands/User/ListCommand.php (4)
src/Cms/Cli/Commands/User/CreateCommand.php (2)
  • execute (44-162)
  • getUserRepository (167-187)
src/Cms/Cli/Commands/User/DeleteCommand.php (2)
  • execute (42-113)
  • getUserRepository (118-138)
src/Cms/Repositories/DatabaseUserRepository.php (1)
  • DatabaseUserRepository (19-250)
src/Cms/Models/User.php (2)
  • isLockedOut (324-332)
  • getStatus (162-165)
tests/Cms/Services/Post/UpdaterTest.php (7)
src/Cms/Models/Post.php (12)
  • Post (13-516)
  • setId (56-60)
  • setTitle (73-77)
  • setBody (107-111)
  • getTitle (65-68)
  • getBody (99-102)
  • getStatus (188-191)
  • getSlug (82-85)
  • getCategories (308-311)
  • getTags (368-371)
  • getExcerpt (116-119)
  • getFeaturedImage (133-136)
src/Cms/Models/Category.php (5)
  • Category (13-186)
  • setId (38-42)
  • getSlug (64-67)
  • setName (55-59)
  • getName (47-50)
src/Cms/Models/Tag.php (5)
  • Tag (13-166)
  • setId (37-41)
  • getSlug (63-66)
  • setName (54-58)
  • getName (46-49)
src/Cms/Services/Post/Updater.php (2)
  • Updater (17-92)
  • update (48-77)
src/Cms/Services/Tag/Resolver.php (1)
  • Resolver (16-64)
src/Cms/Repositories/ICategoryRepository.php (2)
  • update (45-45)
  • count (62-62)
src/Cms/Repositories/IPostRepository.php (2)
  • update (32-32)
  • count (104-104)
src/Cms/Auth/Filters/CsrfFilter.php (1)
src/Cms/Auth/CsrfTokenManager.php (3)
  • CsrfTokenManager (13-69)
  • __construct (18-21)
  • validate (49-60)
src/Cms/Controllers/Auth/LoginController.php (4)
src/Cms/Auth/AuthManager.php (6)
  • AuthManager (17-321)
  • __construct (25-34)
  • check (145-160)
  • login (100-114)
  • attempt (39-95)
  • logout (119-140)
src/Cms/Auth/SessionManager.php (6)
  • SessionManager (13-185)
  • __construct (18-27)
  • get (105-109)
  • start (32-55)
  • getFlash (141-147)
  • flash (132-136)
src/Cms/Auth/CsrfTokenManager.php (4)
  • CsrfTokenManager (13-69)
  • __construct (18-21)
  • getToken (36-44)
  • validate (49-60)
src/Cms/Controllers/Content.php (1)
  • getName (118-121)
src/Cms/Cli/Commands/Install/InstallCommand.php (6)
src/Cms/Cli/Commands/Generate/EmailCommand.php (2)
  • __construct (15-19)
  • execute (48-85)
src/Cms/Cli/Commands/Queue/InstallCommand.php (3)
  • __construct (19-22)
  • execute (51-151)
  • runMigration (343-404)
src/Cms/Controllers/Admin/CategoryController.php (1)
  • __construct (29-38)
src/Cms/Controllers/Admin/PostController.php (1)
  • __construct (41-72)
src/Cms/Controllers/Admin/ProfileController.php (1)
  • __construct (32-43)
src/Cms/Repositories/DatabaseUserRepository.php (1)
  • DatabaseUserRepository (19-250)
src/Cms/Repositories/DatabaseCategoryRepository.php (5)
src/Cms/Database/ConnectionFactory.php (2)
  • ConnectionFactory (17-78)
  • createFromSettings (26-36)
src/Cms/Models/Category.php (8)
  • Category (13-186)
  • fromArray (136-168)
  • getSlug (64-67)
  • getName (47-50)
  • getDescription (81-84)
  • getCreatedAt (98-101)
  • setId (38-42)
  • getId (30-33)
src/Cms/Repositories/ICategoryRepository.php (8)
  • findById (17-17)
  • findBySlug (22-22)
  • findByName (27-27)
  • findByIds (35-35)
  • count (62-62)
  • create (40-40)
  • update (45-45)
  • delete (50-50)
src/Cms/Services/Post/Creator.php (1)
  • create (49-86)
src/Cms/Services/Post/Updater.php (1)
  • update (48-77)
src/Cms/Auth/Filters/AuthenticationFilter.php (1)
src/Cms/Auth/AuthManager.php (3)
  • AuthManager (17-321)
  • check (145-160)
  • user (165-188)
src/Cms/Models/PasswordResetToken.php (2)
src/Cms/Models/Category.php (4)
  • getId (30-33)
  • setId (38-42)
  • setCreatedAt (106-110)
  • fromArray (136-168)
src/Cms/Models/User.php (5)
  • getId (53-56)
  • setId (61-65)
  • setEmail (95-99)
  • setCreatedAt (345-349)
  • fromArray (412-458)
src/Cms/Models/Tag.php (1)
src/Cms/Models/Category.php (7)
  • getId (30-33)
  • setId (38-42)
  • setName (55-59)
  • setSlug (72-76)
  • setCreatedAt (106-110)
  • setUpdatedAt (123-127)
  • fromArray (136-168)
src/Cms/Models/User.php (4)
src/Cms/Models/Category.php (6)
  • getId (30-33)
  • setId (38-42)
  • getCreatedAt (98-101)
  • setCreatedAt (106-110)
  • setUpdatedAt (123-127)
  • fromArray (136-168)
src/Cms/Models/PasswordResetToken.php (6)
  • getId (40-43)
  • setId (48-52)
  • setEmail (65-69)
  • getCreatedAt (91-94)
  • setCreatedAt (99-103)
  • fromArray (133-163)
src/Cms/Models/Post.php (8)
  • getId (48-51)
  • setId (56-60)
  • getStatus (188-191)
  • setStatus (196-200)
  • getCreatedAt (272-275)
  • setCreatedAt (280-284)
  • setUpdatedAt (297-301)
  • fromArray (430-492)
src/Cms/Models/Tag.php (6)
  • getId (29-32)
  • setId (37-41)
  • getCreatedAt (80-83)
  • setCreatedAt (88-92)
  • setUpdatedAt (105-109)
  • fromArray (118-149)
src/Cms/Auth/CsrfTokenManager.php (4)
src/Cms/Auth/SessionManager.php (5)
  • SessionManager (13-185)
  • __construct (18-27)
  • set (96-100)
  • has (114-118)
  • get (105-109)
src/Cms/Auth/AuthManager.php (1)
  • __construct (25-34)
src/Cms/Auth/Filters/CsrfFilter.php (1)
  • __construct (23-31)
src/Cms/Controllers/Auth/LoginController.php (1)
  • __construct (31-48)
src/Cms/Models/Category.php (4)
src/Cms/Models/PasswordResetToken.php (4)
  • getId (40-43)
  • setId (48-52)
  • setCreatedAt (99-103)
  • fromArray (133-163)
src/Cms/Models/Post.php (6)
  • getId (48-51)
  • setId (56-60)
  • setSlug (90-94)
  • setCreatedAt (280-284)
  • setUpdatedAt (297-301)
  • fromArray (430-492)
src/Cms/Models/Tag.php (7)
  • getId (29-32)
  • setId (37-41)
  • setName (54-58)
  • setSlug (71-75)
  • setCreatedAt (88-92)
  • setUpdatedAt (105-109)
  • fromArray (118-149)
src/Cms/Models/User.php (5)
  • getId (53-56)
  • setId (61-65)
  • setCreatedAt (345-349)
  • setUpdatedAt (362-366)
  • fromArray (412-458)
src/Cms/Repositories/DatabasePostRepository.php (4)
src/Cms/Database/ConnectionFactory.php (2)
  • ConnectionFactory (17-78)
  • createFromSettings (26-36)
src/Cms/Models/Post.php (7)
  • Post (13-516)
  • setId (56-60)
  • getId (48-51)
  • fromArray (430-492)
  • setAuthor (175-183)
  • setCategories (318-322)
  • setTags (378-382)
src/Cms/Models/User.php (4)
  • User (12-459)
  • setId (61-65)
  • getId (53-56)
  • fromArray (412-458)
src/Cms/Repositories/DatabaseUserRepository.php (4)
  • findById (37-45)
  • create (89-130)
  • count (215-221)
  • update (135-188)
src/Cms/Models/Post.php (3)
src/Cms/Models/User.php (3)
  • User (12-459)
  • getId (53-56)
  • setId (61-65)
src/Cms/Models/Category.php (3)
  • getId (30-33)
  • setId (38-42)
  • Category (13-186)
src/Cms/Models/Tag.php (3)
  • getId (29-32)
  • setId (37-41)
  • Tag (13-166)
🪛 PHPMD (2.15.0)
resources/app/Initializers/MaintenanceInitializer.php

26-26: Avoid unused parameters such as '$argv'. (undefined)

(UnusedFormalParameter)

src/Cms/Cli/Commands/User/CreateCommand.php

44-44: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)

src/Cms/Maintenance/MaintenanceFilter.php

40-40: Avoid unused parameters such as '$route'. (undefined)

(UnusedFormalParameter)


109-109: Avoid unused local variables such as '$message'. (undefined)

(UnusedLocalVariable)

src/Cms/Controllers/Admin/DashboardController.php

36-36: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)

src/Cms/Cli/Commands/Queue/InstallCommand.php

51-51: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)

resources/app/Initializers/PasswordResetInitializer.php

27-27: Avoid unused parameters such as '$argv'. (undefined)

(UnusedFormalParameter)

src/Cms/Controllers/Admin/UserController.php

52-52: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


87-87: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


118-118: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)

resources/app/Initializers/AuthInitializer.php

27-27: Avoid unused parameters such as '$argv'. (undefined)

(UnusedFormalParameter)

src/Cms/Controllers/Admin/TagController.php

45-45: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


45-45: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)


78-78: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


78-78: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)


108-108: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


160-160: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)


259-259: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)

src/Cms/Controllers/Auth/PasswordResetController.php

57-57: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


83-83: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


143-143: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


191-191: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)

src/Cms/Controllers/Admin/PostController.php

80-80: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


130-130: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


168-168: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)

src/Cms/Controllers/Blog.php

52-52: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


52-52: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)


87-87: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)


129-129: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)


160-160: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)


199-199: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)


239-239: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


239-239: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)

src/Cms/Controllers/Admin/CategoryController.php

47-47: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


47-47: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)


80-80: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


80-80: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)


110-110: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


164-164: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)


265-265: Avoid unused parameters such as '$request'. (undefined)

(UnusedFormalParameter)

src/Cms/Controllers/Admin/ProfileController.php

51-51: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


88-88: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)

src/Cms/Cli/Commands/User/ListCommand.php

42-42: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)

src/Cms/Auth/Filters/CsrfFilter.php

36-36: Avoid unused parameters such as '$route'. (undefined)

(UnusedFormalParameter)

src/Cms/Controllers/Auth/LoginController.php

55-55: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


94-94: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


143-143: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)

src/Cms/Cli/Commands/Install/InstallCommand.php

61-61: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)

Copy link
Contributor

Copilot AI commented Nov 11, 2025

@ljonesfl I've opened a new pull request, #7, to work on those changes. Once the pull request is ready, I'll request review from you.

Copy link
Contributor

Copilot AI commented Nov 11, 2025

@ljonesfl I've opened a new pull request, #8, to work on those changes. Once the pull request is ready, I'll request review from you.

Copy link
Contributor

Copilot AI commented Nov 11, 2025

@ljonesfl I've opened a new pull request, #9, to work on those changes. Once the pull request is ready, I'll request review from you.

Copy link
Contributor

Copilot AI commented Nov 11, 2025

@ljonesfl I've opened a new pull request, #10, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 3 commits November 11, 2025 03:11
Co-authored-by: ljonesfl <1099983+ljonesfl@users.noreply.github.com>
Co-authored-by: ljonesfl <1099983+ljonesfl@users.noreply.github.com>
Copy link
Contributor

Copilot AI commented Nov 11, 2025

@ljonesfl I've opened a new pull request, #11, to work on those changes. Once the pull request is ready, I'll request review from you.

Copy link
Contributor

Copilot AI commented Nov 11, 2025

@ljonesfl I've opened a new pull request, #12, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 6 commits November 11, 2025 03:13
Co-authored-by: ljonesfl <1099983+ljonesfl@users.noreply.github.com>
Co-authored-by: ljonesfl <1099983+ljonesfl@users.noreply.github.com>
…ervice

Co-authored-by: ljonesfl <1099983+ljonesfl@users.noreply.github.com>
Co-authored-by: ljonesfl <1099983+ljonesfl@users.noreply.github.com>
Fix stale session bypass in AuthenticationFilter
Fix authorization type mismatch in PostController
ljonesfl and others added 7 commits November 10, 2025 21:25
Fix type mismatch in PostController authorization checks
Fix type mismatch in PostController authorization checks
Fix missing publishedAt timestamp in Updater service
Co-authored-by: ljonesfl <1099983+ljonesfl@users.noreply.github.com>
Handle repository persistence failures in Publisher service
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Copy link
Contributor

Copilot AI commented Nov 11, 2025

@ljonesfl I've opened a new pull request, #13, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI and others added 2 commits November 11, 2025 03:52
Co-authored-by: ljonesfl <1099983+ljonesfl@users.noreply.github.com>
Fix PostgreSQL boolean casting vulnerability in DatabaseUserRepository
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
src/Cms/Services/Post/Updater.php (1)

91-97: Consider Unicode-aware slug generation.

The current slug generation converts non-ASCII characters to hyphens, which may produce suboptimal results for international content (e.g., "Café" becomes "caf-").

Consider using a transliteration library for better internationalization support:

private function generateSlug( string $title ): string
{
	// Example using iconv for transliteration (if available)
	$slug = iconv( 'UTF-8', 'ASCII//TRANSLIT', $title );
	$slug = strtolower( trim( $slug ) );
	$slug = preg_replace( '/[^a-z0-9-]/', '-', $slug );
	$slug = preg_replace( '/-+/', '-', $slug );
	return trim( $slug, '-' );
}

Alternatively, consider using a dedicated slug generation library like cocur/slugify for more robust handling.

src/Cms/Controllers/Admin/PostController.php (1)

80-80: Unused parameters in method signatures.

The $parameters argument is unused in index(), create(), and store() methods, while other methods (edit(), update(), destroy()) do use it to extract the post ID. If this uniform signature is not a framework requirement, consider making the parameter optional or removing it where unused.

If the framework doesn't require uniform signatures, you could make the parameter optional:

-public function index( array $parameters ): string
+public function index( array $parameters = [] ): string

Or document why the signature is uniform (e.g., if it's a framework convention).

Also applies to: 130-130, 168-168

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7d263d7 and 190117c.

📒 Files selected for processing (7)
  • src/Cms/Controllers/Admin/PostController.php (4 hunks)
  • src/Cms/Database/ConnectionFactory.php (1 hunks)
  • src/Cms/Repositories/DatabaseUserRepository.php (11 hunks)
  • src/Cms/Services/Post/Publisher.php (1 hunks)
  • src/Cms/Services/Post/Updater.php (1 hunks)
  • tests/Cms/Services/Post/PublisherTest.php (1 hunks)
  • tests/Cms/Services/Post/UpdaterTest.php (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/Cms/Services/Post/Publisher.php
🧰 Additional context used
🧬 Code graph analysis (5)
src/Cms/Controllers/Admin/PostController.php (7)
src/Cms/Models/Post.php (3)
  • Post (13-516)
  • getId (48-51)
  • getAuthorId (150-153)
src/Cms/Services/Post/Creator.php (2)
  • Creator (18-101)
  • create (49-86)
src/Cms/Services/Tag/Creator.php (2)
  • Creator (15-53)
  • create (31-38)
src/Cms/Services/Post/Updater.php (2)
  • Updater (17-98)
  • update (48-83)
src/Cms/Services/Post/Deleter.php (2)
  • Deleter (15-50)
  • delete (30-38)
src/Cms/Services/Tag/Resolver.php (1)
  • Resolver (16-64)
src/Cms/Repositories/DatabasePostRepository.php (7)
  • DatabasePostRepository (22-534)
  • all (204-229)
  • getByAuthor (234-252)
  • create (76-122)
  • findById (40-53)
  • update (127-187)
  • delete (192-199)
tests/Cms/Services/Post/UpdaterTest.php (6)
src/Cms/Models/Post.php (15)
  • Post (13-516)
  • setId (56-60)
  • setTitle (73-77)
  • setBody (107-111)
  • getTitle (65-68)
  • getBody (99-102)
  • getStatus (188-191)
  • getSlug (82-85)
  • getCategories (308-311)
  • getTags (368-371)
  • getExcerpt (116-119)
  • getFeaturedImage (133-136)
  • setStatus (196-200)
  • getPublishedAt (229-232)
  • setPublishedAt (237-241)
src/Cms/Models/Category.php (3)
  • Category (13-186)
  • setId (38-42)
  • getSlug (64-67)
src/Cms/Models/Tag.php (3)
  • Tag (13-166)
  • setId (37-41)
  • getSlug (63-66)
src/Cms/Services/Post/Updater.php (2)
  • Updater (17-98)
  • update (48-83)
src/Cms/Services/Tag/Resolver.php (1)
  • Resolver (16-64)
src/Cms/Repositories/IPostRepository.php (2)
  • update (32-32)
  • count (104-104)
src/Cms/Repositories/DatabaseUserRepository.php (3)
src/Cms/Database/ConnectionFactory.php (2)
  • ConnectionFactory (17-88)
  • createFromSettings (26-36)
src/Cms/Models/User.php (15)
  • User (12-459)
  • getUsername (70-73)
  • getEmail (87-90)
  • getPasswordHash (104-107)
  • getRole (121-124)
  • getStatus (162-165)
  • isEmailVerified (195-198)
  • getTwoFactorSecret (229-232)
  • getRememberToken (212-215)
  • getFailedLoginAttempts (271-274)
  • getLockedUntil (307-310)
  • getLastLoginAt (371-374)
  • getCreatedAt (337-340)
  • setId (61-65)
  • getId (53-56)
src/Cms/Repositories/IUserRepository.php (7)
  • findById (17-17)
  • findByUsername (22-22)
  • findByEmail (27-27)
  • findByRememberToken (32-32)
  • create (37-37)
  • update (42-42)
  • delete (47-47)
tests/Cms/Services/Post/PublisherTest.php (2)
src/Cms/Models/Post.php (5)
  • Post (13-516)
  • setStatus (196-200)
  • getStatus (188-191)
  • getPublishedAt (229-232)
  • setPublishedAt (237-241)
src/Cms/Services/Post/Publisher.php (4)
  • Publisher (17-104)
  • publish (33-50)
  • unpublish (59-76)
  • schedule (86-103)
src/Cms/Services/Post/Updater.php (5)
src/Cms/Models/Post.php (11)
  • Post (13-516)
  • setTitle (73-77)
  • setSlug (90-94)
  • setBody (107-111)
  • setExcerpt (124-128)
  • setFeaturedImage (141-145)
  • setStatus (196-200)
  • getPublishedAt (229-232)
  • setPublishedAt (237-241)
  • setCategories (318-322)
  • setTags (378-382)
src/Cms/Services/Tag/Resolver.php (2)
  • Resolver (16-64)
  • resolveFromString (37-63)
src/Cms/Repositories/DatabaseCategoryRepository.php (2)
  • update (133-170)
  • findByIds (79-93)
src/Cms/Repositories/IPostRepository.php (1)
  • update (32-32)
src/Cms/Repositories/DatabasePostRepository.php (1)
  • update (127-187)
🪛 PHPMD (2.15.0)
src/Cms/Controllers/Admin/PostController.php

80-80: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


130-130: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)


168-168: Avoid unused parameters such as '$parameters'. (undefined)

(UnusedFormalParameter)

🔇 Additional comments (4)
tests/Cms/Services/Post/UpdaterTest.php (1)

1-360: Excellent test coverage!

This test suite comprehensively validates the Updater service across all key scenarios: required/optional field updates, slug generation, category/tag relationships, business rules for publishedAt, and return value verification. The tests are well-structured with clear assertions and proper mocking.

src/Cms/Services/Post/Updater.php (1)

67-71: Business rule correctly implemented.

The auto-setting of publishedAt when transitioning to published status is now correctly implemented, addressing the previous review concern. The logic appropriately preserves existing timestamps.

src/Cms/Controllers/Admin/PostController.php (2)

244-244: Authorization checks correctly fixed.

All three authorization checks now properly compare author ID with user ID using $post->getAuthorId() !== $user->getId(), resolving the previous type mismatch issues.

Also applies to: 301-301, 370-370


30-72: Service initialization looks good.

The constructor properly wires up all repositories and services with dependency injection. The TagResolver is correctly instantiated with its dependencies and passed to the Creator and Updater services.

ljonesfl and others added 4 commits November 10, 2025 22:01
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@ljonesfl ljonesfl merged commit 4e2d765 into develop Nov 11, 2025
2 checks passed
@ljonesfl ljonesfl deleted the feature/service-architecture branch November 11, 2025 04:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants