-
Notifications
You must be signed in to change notification settings - Fork 0
Feature/service architecture #6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
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 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. 📒 Files selected for processing (3)
WalkthroughWide-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
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
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
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Areas to focus review on:
Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
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. Comment |
There was a problem hiding this 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 subsequentcopy()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 redundantregenerate()method.The
regenerate()method simply delegates togenerate()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()andgenerate(), or simply remove it and usegenerate()directly.- /** - * Regenerate CSRF token - */ - public function regenerate(): string - { - return $this->generate(); - }src/Cms/Services/Post/Updater.php (1)
85-91: Extract duplicatedgenerateSlug()to a shared utility.The
generateSlug()implementation is identical in bothCreatorandUpdaterservices, 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 duplicatedgenerateSlug()to a shared utility.This
generateSlug()implementation is identical to the ones inPost\CreatorandPost\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:
- Removing this file entirely if the tests are no longer relevant
- Creating new tests for the current
Blogcontroller implementation that usesDatabasePostRepository,DatabaseCategoryRepository, andDatabaseTagRepositoryIf 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$parametersis never used. Either accept non-interactive input here (e.g., allow passingusername,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 inNeuron\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
CsrfTokenManageris 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/slugifyor 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
📒 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)
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)
Co-authored-by: ljonesfl <1099983+ljonesfl@users.noreply.github.com>
Co-authored-by: ljonesfl <1099983+ljonesfl@users.noreply.github.com>
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
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>
Co-authored-by: ljonesfl <1099983+ljonesfl@users.noreply.github.com>
Fix PostgreSQL boolean casting vulnerability in DatabaseUserRepository
There was a problem hiding this 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/slugifyfor more robust handling.src/Cms/Controllers/Admin/PostController.php (1)
80-80: Unused parameters in method signatures.The
$parametersargument is unused inindex(),create(), andstore()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 = [] ): stringOr 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
📒 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
publishedAtwhen 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.
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
…cms into feature/service-architecture
Adds a more service-like architecture to the system.
Summary by CodeRabbit
New Features
Bug Fixes
Chores