Skip to content
CAI
Software that uses CAICheck a score

JakaAmbrus/PlayLink

38.9

Weak · 21 September 2026

7.2k

lines of production code

C#

with TypeScript, JavaScript

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

PlayLink is a full-stack social networking platform built with Angular 17 and ASP.NET Core that facilitates user connections through profiles, friend requests, and a content feed. It supports real-time private messaging via SignalR, user discovery with filtering, and role-based administration for content moderation. The system also includes a dedicated gaming section featuring browser-based mini-games and trivia.

How it got here

115 changes.

This period established the PlayLink social networking platform by building the core .NET 7 backend and Angular 17 frontend from scratch. The work focused on implementing essential social features, including user authentication, real-time messaging via SignalR, and a comprehensive feed system with posts, comments, and likes. It also introduced a gaming section with browser-based mini-games and a robust admin/moderator interface for user management.

2024 — Application layer testing and structure

10 changes.

This period focused on expanding unit test coverage across the application layer, adding comprehensive tests for features such as comments, posts, friends, users, authentication, and messaging. It also involved refactoring the codebase structure by moving the MarkMessageAsRead feature to align with domain concepts and introducing a structured hierarchy of application exceptions in the Domain layer to improve error handling.

Features

Ability to accept or decline friend requests with cache invalidation

Users can now respond to incoming friend requests by accepting or declining them. When a request is accepted, a new friendship record is created, the request status is updated, and the friend's details are returned in the response. The system validates that the user is authorized to respond, that the request is still pending, and that a friendship does not already exist. Upon acceptance or decline, relevant caches for friend requests and friendship status are invalidated to ensure data consistency.

server/Application/Features/Friends/RespondToFriendRequest · high confidence

Ability to remove existing friendships

Users can now remove an existing friendship by providing the target profile's username and their own authenticated user ID. The system locates the active friendship record and deletes it from the database. If a pending friend request exists between the two users, it is also removed. To ensure data consistency, the system invalidates the cached friend lists for both users and clears the specific friendship status cache entry before completing the operation.

server/Application/Features/Friends/RemoveFriendship · high confidence

Ability to remove pending friend requests

Users can now remove a pending friend request they initiated. This feature validates the request ID and ensures the user is the sender, then deletes the request from the database. It also triggers cache invalidation for the user's friend requests and, if the request was declined, invalidates the friendship status cache for both parties to ensure data consistency.

server/Application/Features/Friends/RemoveFriendRequest · high confidence

Add GetUserById query handler

Introduces a new MediatR-based query and handler for retrieving a user by their ID. The handler fetches the user from the database, maps the data to a UsersDto (including username, gender, full name, calculated age, country, and profile picture URL), and returns it wrapped in a GetUserByIdResponse. A validator ensures the provided ID is not empty.

server/Application/Features/Users/GetUserById · high confidence

Add ability to retrieve a user's friends list with caching

Users can now retrieve their list of friends via a new query handler that fetches associated user details (username, full name, profile picture, gender, and friendship date) from the database. To improve performance, the response is cached in memory for one day using a key based on the authenticated user's ID, reducing repeated database queries for the same data.

server/Application/Features/Friends/GetUserFriends · high confidence

Add command handler for deleting comments

The application now supports deleting comments through a new MediatR command pipeline. The handler verifies that the comment and its associated post exist, then enforces authorization by allowing deletion only if the requester is the post owner or holds the 'Moderator' role. Upon successful deletion, the comment is removed from the database and the parent post's comment count is decremented.

server/Application/Features/Comments/DeleteComment · high confidence

Add endpoint to retrieve friendship status with memory caching

Users can now query the current relationship status (Friends, Pending, Declined, or None) between the authenticated user and another profile by username. The implementation includes input validation for the required username and user ID, checks the database for existing friendships and friend requests, and caches the result in memory for one hour to improve performance.

server/Application/Features/Friends/GetFriendshipStatus · high confidence

Add message sending capability with validation and business rules

Introduces the ability for users to send private messages to other users. The implementation includes a command handler that validates the sender and recipient exist, prevents users from messaging themselves, and persists the message to the database. Input validation ensures the message content is not empty and does not exceed 500 characters, and the response includes detailed sender and recipient profile information.

server/Application/Features/Messages/SendMessage · high confidence

Add paginated message retrieval for user inbox, outbox, and unread messages

Users can now retrieve their private messages through a new query handler that supports paging and filters by container type (Inbox, Outbox, or unread). The endpoint returns detailed message metadata including sender and recipient names, genders, profile picture URLs, content, and timestamps, with dates normalized to UTC to address previous inconsistencies on mobile clients. Input validation ensures that page number, page size, and authenticated user ID are provided and valid.

server/Application/Features/Messages/GetMessagesForUser · high confidence

Add post deletion capability with ownership and moderation checks

Users can now delete their own posts or have posts removed by moderators. The new DeletePost feature enforces that only the post owner or a user with the 'Moderator' role can perform the deletion. When a post containing a photo is deleted, the associated image is removed from Cloudinary, and the user's photo cache is invalidated to ensure consistency.

server/Application/Features/Posts/DeletePost · high confidence

Added API documentation, real-time presence, and pagination support

The API now includes Swagger documentation for easier endpoint discovery and testing, with JWT Bearer authentication configured for secure access. Real-time features are enabled via SignalR, including a PresenceTracker to monitor active users. Additionally, pagination headers are automatically added to HTTP responses to support paginated data retrieval.

server/WebAPI/Extensions · high confidence

Added Hollow Knight-themed Tic Tac Toe and PSP-style Drawing Game

The gaming section now includes two new browser-based games. The first is 'Hollow X Hollow', a Tic Tac Toe implementation featuring a Hollow Knight theme with four difficulty levels (including an 'Impossible' mode using a minmax algorithm and a boss battle sequence), player-versus-player mode, and custom audio. The second is 'PlaySketch Portable', a drawing application styled as a PlayStation Portable (PSP) console, offering a grid-based canvas with color selection, grid resizing, and mute controls.

_client/src/assets/games/hollow\_x\hollow · high confidence

Added ability to retrieve a specific message by ID

Users can now fetch a single message using its unique identifier. This change introduces the query, handler, and validator for the Get Message By Id feature, allowing the system to look up a private message in the database and return its details (including sender/recipient info and content) or indicate if the message does not exist.

server/Application/Features/Messages/GetMessageById · high confidence

Added command handler for uploading comments

The application now supports uploading new comments on posts. This change introduces the command, handler, validator, and response structures for the UploadComment feature, allowing users to submit comment content (up to 300 characters) associated with a specific post and authenticated user.

server/Application/Features/Comments/UploadComment · high confidence

Added country list and friend request status enums

The domain layer now includes a comprehensive list of countries via the new \Country\ enum in \Countries.cs\, supporting location-based features. Additionally, new enums \FriendRequestStatus\ and \FriendshipStatus\ have been introduced to manage the lifecycle of friend connections, defining states such as Pending, Accepted, Declined, and Friends.

server/Domain/Enums · high confidence

Added endpoint to retrieve unique countries for user discovery

A new query handler and supporting classes have been added to fetch a distinct list of countries associated with users, excluding the currently authenticated user. This feature allows clients to discover available countries for features like user discovery, ensuring the requesting user's own country is not included in the results.

server/Application/Features/Users/GetUsersUniqueCountries · high confidence

Added feature to retrieve the three users with the nearest upcoming birthdays

Users can now request a list of the three users whose birthdays are coming up soonest. The system calculates the days until each user's birthday, sorts the results, and returns the top three. To improve performance, the result is cached in memory for one day, meaning subsequent requests within that window are served from the cache rather than hitting the database again.

server/Application/Features/Users/GetNearestBirthdayUsers · high confidence

Added paginated user listing with filtering and validation

The GetUsers feature now supports retrieving a paginated list of users, excluding the authenticated user from the results. Users can filter the list by gender and country, and sort by creation date or last activity. The implementation includes input validation for pagination parameters and authentication context, ensuring that only valid requests are processed.

server/Application/Features/Users/GetUsers · high confidence

Added query to retrieve user ID by username

A new capability has been introduced to look up a user's internal ID using their username. This is implemented via a MediatR query (GetUserIdByUsernameQuery) and its corresponding handler, which queries the database for a matching user and returns their ID. The handler throws a NotFoundException if the user does not exist, and input validation ensures the username is not empty.

server/Application/Features/Users/GetUserIdByUsername · high confidence

Admin capability to toggle user moderator status

Administrators can now assign or remove the 'Moderator' role for any user. This new feature adds a command handler that verifies the requester has Admin privileges, locates the target user, and toggles their Moderator role membership, returning a confirmation of the edit.

server/Application/Features/Admin/AdminEditRoles · high confidence

Admin endpoint to retrieve paginated user list with role details

Administrators can now fetch a paginated list of all users (excluding themselves) via the new AdminGetUsers feature. The handler enforces that the requester holds the 'Admin' role, throwing an UnauthorizedException otherwise. The response includes user details such as username, full name, gender, profile picture URL, creation date, and a boolean flag indicating if the user is a 'Moderator'. Pagination is controlled by PageNumber and PageSize parameters, which are validated to be greater than zero.

server/Application/Features/Admin/AdminGetUsers · high confidence

Admin user deletion with cascading cleanup and cache invalidation

Administrators can now delete user accounts via a new command handler that performs comprehensive cleanup of associated data, including removing connections, posts, friend requests, friendships, and private messages. The process also decrements the like count on posts previously liked by the deleted user to maintain data consistency. Upon successful deletion, the system invalidates memory caches for user search results and nearest birthday lists to ensure subsequent queries reflect the updated state.

server/Application/Features/Admin/AdminUserDelete · high confidence

Application now seeds default roles and test users on startup

The server infrastructure now automatically initializes the database with four roles (Member, Moderator, Admin, Guest) and pre-populates six test accounts upon application startup. This includes three standard test users with Member and Guest roles, three moderator test users with Moderator and Guest roles, and an automatic Admin role assignment for any user registering with the username 'admin', ensuring immediate availability of test data and administrative access without manual setup.

server/Infrastructure/Data · high confidence

Guest login role selection dialog added

A new guest login dialog has been introduced, allowing users to select their role as either 'Member' or 'Moderator' upon entry. The component presents these options as distinct buttons and includes a link to an admin video demo. Selecting a role closes the dialog and returns the chosen role to the caller.

client/src/app/features/portal/components/guest-login-dialog · high confidence

Guest user login capability introduced

Users can now log in as a guest by specifying a role (Member or Moderator). The system automatically assigns a pre-configured shared account from the database, prioritizing the least recently active user to prevent concurrent usage conflicts, and returns a session token along with the user's profile details.

server/Application/Features/Authentication/GuestUserLogin · high confidence

Initial Angular 17 client setup with Docker and NGINX configuration

The client application has been initialized as an Angular 17 project, introducing a modern standalone component architecture and strict TypeScript compilation settings. To support local development, a Docker setup is provided using Node 18 for building and NGINX for serving, complete with a development configuration that proxies API and WebSocket connections to the backend. The project structure includes core, features, and shared directories, with build optimizations such as OnPush change detection, lazy loading, and SCSS styling enabled by default.

client · high confidence

Initial Angular client setup with light/dark theming and route animations

The client application has been initialized as an Angular project, establishing the foundational UI structure and styling. This includes a global stylesheet with custom fonts and scrollbar styling, a theme system supporting both light and dark modes via CSS variables, and smooth slide-in/slide-out animations for navigation between routes such as Home, Discover, Games, and Messages.

client/src · high confidence

Initial server deployment configuration and middleware setup

The server entry point (Program.cs) is established with dependency injection for Application and Infrastructure layers, enabling Swagger documentation in development, Serilog request logging, and SignalR hubs for presence and messaging. The configuration includes IP-based rate limiting for specific API endpoints (e.g., registration, user search, posts) and exception handling middleware, while a Dockerfile and .dockerignore are added to support containerized local development.

server/WebAPI · high confidence

Introduce message group management commands and queries

Added application-layer features for managing message groups and their connections, including creating groups, adding or removing connections, and retrieving group or connection details. This change introduces a suite of MediatR commands and queries (with corresponding validators and DTOs) to handle group lifecycle operations and connection lookups within the server's application layer.

server/Application/Features/MessageGroups · high confidence

Introduces user management, activity tracking, and photo upload services

The server infrastructure now includes dedicated services for core user and media operations. A new UserManagerService implements user creation, role management, and authentication checks (find by username, password verification). A UserActivityService tracks user last-active timestamps, and a PhotoService handles image uploads and deletions via Cloudinary, applying specific transformations for profile and post images.

server/Infrastructure/Services · high confidence

Introduction of DI extension methods for authentication, caching, and token services

The application now provides dedicated extension methods to register core service dependencies via dependency injection. Users can now call AddAuthenticatedUserServices to register the authentication service, AddMemoryCacheExtensions to enable in-memory caching along with cache key and invalidation services, and AddTokenServices to register the token service, simplifying the startup configuration process.

server/Application/Extensions · high confidence

Introduction of application-layer service interfaces and data models

This change introduces a set of new interfaces in the Application layer to define service contracts and data models, establishing the abstraction layer for core functionality. Key additions include IApplicationDbContext for database access, IUserManager for user operations (creation, lookup, password checking, and role management), IAuthService for authentication context, and specific services for caching (ICacheInvalidationService, ICacheKeyService), photos (IPhotoService), and user activity. It also adds the PhotoUploadResult and PhotoDeletionResult models to handle photo operation outcomes.

server/Application/Interfaces · high confidence

Introduction of comment data transfer objects

Added CommentDto and CommentUploadDto classes to the Comments feature area. CommentDto defines the structure for comment responses including user details, post association, content, and interaction status, while CommentUploadDto specifies the input model for creating or updating comments.

server/Application/Features/Comments/Common · high confidence

Introduction of core domain entities for social networking features

The domain layer now includes a comprehensive set of entity classes that define the data model for user profiles, social interactions, and real-time communication. AppUser and AppRole establish the identity structure with profile details like gender and country, while Post, Comment, and Like entities enable content creation and engagement. FriendRequest and Friendship entities support social connectivity, and PrivateMessage along with Connection and Group entities provide the foundation for direct messaging and live chat capabilities.

server/Domain/Entities · high confidence

Introduction of in-memory caching and authentication services

The application now includes an in-memory caching layer to improve performance for user-related data, featuring a CacheInvalidationService to clear cached entries for user profiles, search results, birthdays, friend requests, and photos, alongside a CacheKeyService for generating consistent cache keys. Additionally, new AuthService and TokenService implementations handle user authentication, including JWT token creation with role claims and retrieving the current authenticated user's identity and roles from the HTTP context.

server/Application/Services · high confidence

Introduction of paginated posts feed with validation

The application now supports retrieving a paginated list of posts via the GetPosts feature. This change introduces a new query handler that fetches posts ordered by date, includes user profile details (username, full name, profile picture), and calculates interaction metrics like like counts and whether the current user has liked the post. Pagination is enforced through request parameters for page number and size, which are validated to ensure they are greater than zero. The response returns a paginated list of post DTOs, allowing clients to efficiently load posts in chunks rather than retrieving the entire dataset at once.

server/Application/Features/Posts/GetPosts · high confidence

Introduction of standalone utility pipes and form validators

The shared module now includes a set of new standalone utility pipes—FirstWord, LimitText, RelativeTime, RelativeUrl, and TimeAgo—alongside a collection of reusable form validators (such as standardLettersOnlyValidator and validCountryValidator). These additions provide users with built-in tools for formatting text snippets, displaying relative timestamps, handling CDN image URLs, and enforcing specific input constraints within Angular forms.

client/src/app/shared/pipes · high confidence

Introduction of structured application exceptions in the Domain layer

The server's Domain layer now includes a hierarchy of application exceptions (ApplicationExceptions, BadRequestException, ConflictException, NotFoundException, ServerErrorException, and UnauthorizedException). These exceptions carry an HTTP status code and optional error details, enabling the application to communicate precise error contexts and status codes to clients rather than relying on generic error handling.

server/Domain/Exceptions · high confidence

Moderator tools to delete user descriptions and profile photos

Moderators can now remove a user's profile description or profile photo via new application features. The delete description handler clears the user's description text, while the delete photo handler removes the image from storage, clears the profile picture fields in the database, and invalidates the user's photo cache to ensure data consistency across roles.

server/Application/Features/Moderator · high confidence

New API controllers for user, post, comment, message, and admin features

The server now exposes a comprehensive set of REST endpoints via new controllers in the WebAPI layer. Users can register, log in (including guest access), and manage their profiles (edit details, delete account, view nearest birthdays, search). The platform supports social interactions through friend requests and post/comment/like management. Messaging functionality allows users to send, receive, and delete private messages. Administrators and moderators have dedicated endpoints to manage user roles, delete users, and remove user content (descriptions/photos). All controllers follow a clean architecture pattern, delegating logic to MediatR handlers and enforcing role-based authorization policies.

server/WebAPI/Controllers · high confidence

New About Site page added

A new standalone Angular component has been introduced to display an 'About PlayLink' section. This page provides an introduction to the platform and its developer, Jaka Ambrus, and includes direct links to his portfolio, the project's GitHub repository, and a YouTube video showcasing the site's features.

client/src/app/core/components/about-site · high confidence

New Friends feature with cached request retrieval

This change introduces the Friends feature, specifically the GetFriendRequests capability. Users can now retrieve their pending incoming and historical sent friend requests via a new API endpoint. The implementation uses a 30-minute in-memory cache to optimize performance for repeated requests. The response includes detailed information about the sender or recipient (username, full name, profile picture, gender) and the request status.

server/Application/Features/Friends/GetFriendRequests · high confidence

New Games feature with Quiz widget and iframe-based mini-games

The Games section now includes a standalone Quiz widget component that allows users to play a multiple-choice trivia game with scoring and answer feedback, alongside a game selection page that links to iframe-based mini-games (Hollow X Hollow, PlaySketch Portable, and Rock Paper Scissors). The quiz component uses Angular's new control flow syntax (@if, @for) and standalone component architecture, while the mini-games are embedded via iframes with responsive styling for various screen sizes.

client/src/app/features/games · high confidence

New GetPostById query handler with authorization and validation

Added a new MediatR query handler for retrieving a post by ID, which includes input validation for PostId, AuthUserId, and user roles. The handler fetches post details along with associated user information and calculates whether the current user is authorized to view the post (either as the owner or a moderator). It also determines if the current user has liked the post.

server/Application/Features/Posts/GetPostById · high confidence

New Rock, Paper, Scissors game added to the gaming section

A new Rock, Paper, Scissors game has been added to the client's gaming assets. The implementation includes a start screen, gameplay logic with score tracking, and visual feedback through animations and audio effects. The game features a responsive design with fullscreen and mute controls, allowing users to play directly within the application's gaming section.

_client/src/assets/games/rock\_paper\scissors · high confidence

New core services for authentication, caching, and real-time presence

This change introduces a set of new core services to handle user account management, token storage, local storage abstraction, in-memory caching, and SignalR-based presence. The AccountService now manages login, guest login, registration, logout, and account deletion, coordinating with the new TokenService for JWT handling and the LocalStorageService for persistent data. The CacheManagerService provides a simple in-memory cache, while the PresenceService establishes a SignalR hub connection to track online users and display toast notifications for new messages. These services replace previous ad-hoc implementations, providing a structured foundation for authentication and real-time features.

client/src/app/core/services · high confidence

New data models and constants for the messages feature

The messages feature now includes dedicated TypeScript interfaces and constants to support its UI and data handling. A new \MessageParams\ interface defines pagination and container filtering parameters, while a \MessagesButtons\ interface and its corresponding constant array provide the configuration for the inbox, outbox, and unread view toggles. Additionally, a \NearestBirthdayUser\ interface has been added to model user birthday data, likely for display purposes within the messages context.

client/src/app/features/messages/constants, client/src/app/features/messages/models · high confidence

New data transfer objects for post content and post details

Added PostContentDto and PostDto classes in the Posts/Common area to structure post-related data. PostContentDto handles incoming post creation or update requests, including a description and an optional photo file. PostDto represents the structured output for post details, including user information (username, full name, profile picture, gender), post metadata (likes count, comments count, description, date posted, photo URL), and interaction states (is liked by current user, is authorized).

server/Application/Features/Posts/Common · high confidence

Added a new query handler that fetches a list of photo URLs for a given username, including the user's profile picture as the first item in the gallery. The response is cached in memory for one day to improve performance, and the handler validates that the username is provided.

server/Application/Features/Posts/GetUserPostPhotos · high confidence

New endpoint to retrieve a user's posts with pagination and authorization

Added a new query handler and validation logic for fetching posts by a specific username. The feature supports pagination, verifies the existence of the requested user, and determines authorization status based on whether the current user is the post owner or a moderator. It returns a paginated list of post details including like and comment counts, and whether the current user has liked each post.

server/Application/Features/Posts/GetPostsByUser · high confidence

New endpoint to retrieve message threads with automatic read marking

Added the \GetMessageThread\ feature (query, handler, validator, and response) that allows users to fetch the conversation history with a specific profile. The handler retrieves private messages between the authenticated user and the target profile, ensuring deleted messages are excluded, and automatically marks any unread messages as read by updating the \DateRead\ timestamp to UTC before returning the thread data.

server/Application/Features/Messages/GetMessageThread · high confidence

New friend display component with responsive layout

A new standalone component has been added to the home feature to display individual friend details, including their avatar, name, and the date the friendship was established. The component uses Angular's new control flow syntax for conditional rendering and applies OnPush change detection for performance. It includes responsive styling that hides the 'Friends since' date on screens narrower than 1300px to improve tablet and mobile readability.

client/src/app/features/home/components/friend-display · high confidence

New friend list component with error handling and responsive layout

The home page now includes a dedicated friend list component that displays the user's friends using the new Angular @for control flow. This component fetches friend data asynchronously and provides immediate visual feedback for loading states and network errors, ensuring users are informed if the friend list fails to load. The layout is responsive, adapting to different screen sizes with a fixed position on larger screens and a relative layout on smaller ones.

client/src/app/features/home/components/friend-list · high confidence

New home page user profile card with error handling

A new user profile card component has been added to the home page, displaying the current user's avatar, full name, country, and date of birth. The component uses an async pipe to handle the user data stream and includes specific loading and error states, showing a warning icon and message if the profile data fails to load. It also provides a direct link to the user's edit profile page.

client/src/app/features/home/components/home-user-card · high confidence

New login component with guest access support

The portal now features a dedicated login component that allows users to authenticate via username and password or enter as a guest. The guest login flow opens a dialog for role selection before proceeding, while standard login handles credential submission. The interface includes loading states to prevent duplicate requests and adapts its layout for mobile devices.

client/src/app/features/portal/components/login · high confidence

New message content component for profile conversations

A new standalone Angular component has been added to display individual message content within the profile feature. This component renders the sender's avatar, name, message body, and timestamps (including read status), utilizing OnPush change detection for performance optimization. It supports visual distinction between current-user and other-user messages through CSS flex-direction reversal and conditional styling.

client/src/app/features/profile/components/message-content · high confidence

New message display and cached birthday user services

Added MessageDisplayService to handle fetching paginated user messages and deleting individual messages via the API. Added NearestBirthdayService to retrieve a list of users with upcoming birthdays, implementing client-side caching through CacheManagerService to avoid redundant network requests for this data.

client/src/app/features/messages/services · high confidence

New post and comment like management capabilities

This change introduces the backend application logic for liking and unliking posts and comments, as well as retrieving the list of users who liked them. Users can now like or unlike a post or comment, with the system preventing duplicate likes and updating the like count accordingly. Additionally, a new feature allows fetching the usernames and full names of users who liked a specific post or comment, explicitly excluding the current user from that list to avoid self-referential results.

server/Application/Features/Likes · high confidence

New post upload capability with photo support and validation

Users can now create posts that include an optional photo (PNG or JPEG, max 5MB) and a description (max 400 characters). The system validates the input, uploads the image via the photo service, updates the user's photo cache upon success, and returns the newly created post details including user profile information.

server/Application/Features/Posts/UploadPost · high confidence

New profile retrieval endpoint with role-based moderation view

Added a new GetUserByUsername feature that allows retrieving a user's profile by username. The handler fetches user details (including description, gender, and location) and applies a specific logic for the 'Authorized' field: it is set to true only if the requesting user is a Moderator and is viewing another user's profile, effectively enabling a moderation view while hiding it from the current user or non-moderators.

server/Application/Features/Users/GetUserByUsername · high confidence

New profile services for user editing, messaging, and photo retrieval

This change introduces dedicated Angular services within the profile feature to handle specific user interactions. Users can now edit their profile details (username, description, country, and photo) via the new EditUserService, which sends data as FormData to the backend. Real-time messaging capabilities are enhanced with a new MessagesService that establishes a SignalR hub connection, handles live message threads, and displays error toasts for connection failures or rate-limiting (TooManyMessages). Additionally, a new UserPhotosService allows fetching a list of photo URLs for a specific user.

client/src/app/features/profile/services · high confidence

New shared services for client-side data management and interaction

This change introduces a suite of new services in the shared layer to handle specific client-side concerns. AvatarService manages user avatar details using Angular signals and local storage. ClickOutsideService provides a reusable mechanism for detecting clicks outside specific UI elements. CommentsService, PostsService, and LikesService expose HTTP endpoints for paginated comments, post feeds, and like/unlike interactions on posts and comments. FriendsService handles friend requests and lists, utilizing a central CacheManagerService to store and retrieve friend data, reducing redundant network calls. UserProfileService and UserSearchService also leverage this caching strategy for user profile and search data, with UserProfileService including an invalidation method for moderator actions. ModeratorService exposes endpoints for deleting user photos and descriptions.

client/src/app/shared/services · high confidence

New standalone admin panel for user management

The admin panel is now implemented as a standalone Angular component, introducing a dedicated interface for administrators to view and manage website users. This feature displays a paginated list of users (including details like username, role, and profile picture) and includes responsive styling that adapts to smaller screens. The implementation leverages the new standalone component architecture and Angular's new control flow syntax for rendering the user list.

client/src/app/features/admin · high confidence

New standalone header component with friend request notifications and mobile responsiveness

The application now uses a new standalone header component that displays friend request counts in the notification icon and provides a dedicated notification panel for managing these requests. The header includes a theme toggle button, a user dropdown menu, and responsive navigation links that switch between desktop and mobile layouts. It also features an admin panel link visible only to users with Admin or Moderator roles, and implements click-outside detection to close dropdowns and notification panels when users interact elsewhere on the page.

client/src/app/core/components/header · high confidence

New standalone login logo component with animations

The login logo is now rendered by a new standalone Angular component that displays the PlayLink logo image alongside text, featuring a spin animation for the image and slide animations for the text labels. The component includes specific CSS adjustments for iOS devices to ensure consistent layout, and it is structured as a standalone component within the portal features area.

client/src/app/features/portal/components/login-logo · high confidence

New standalone message component with real-time chat and mobile responsiveness

The message page now uses a new standalone Angular component that displays a scrollable chat history and a form for sending private messages via SignalR. The interface automatically scrolls to the bottom when new messages arrive, and the layout includes responsive styles that adjust heights and padding for screens under 1100px, 800px, and 460px to ensure usability on mobile devices.

client/src/app/features/profile/pages/message · high confidence

New standalone profile editing page with responsive design and caching

Users can now edit their profile details (description, country, and photo) via a new standalone component that includes mobile-responsive styling, country autocomplete, and form validation. The update process triggers cache invalidation for the user's posts and avatar, ensuring the main feed reflects changes immediately after saving.

client/src/app/features/profile/pages/edit · high confidence

New standalone profile page with responsive layout and animations

The profile feature now uses a new standalone component that renders a user card and navigation menu, powered by the async pipe for data handling. The layout is fully responsive, adapting to mobile screens via media queries and including entrance animations for the profile section and route transitions.

client/src/app/features/profile · high confidence

New user login endpoint with validation and token generation

The application now includes a new login feature that accepts a username and password, validates the input to ensure fields are not empty, and trims whitespace from the username. Upon successful authentication, the system generates an authentication token and returns user profile details including username, full name, gender, and profile picture URL. This change introduces the command handler, validator, and data transfer objects required for this specific authentication flow.

server/Application/Features/Authentication/UserLogin · high confidence

New user registration endpoint with validation and role assignment

The application now supports user registration via a new command handler that creates an AppUser, assigns the 'Member' role, and returns a JWT token. The process includes strict input validation (username, password, gender, full name, country, and age) and ensures data integrity by wrapping user creation and role assignment in a database transaction.

server/Application/Features/Authentication/UserRegistration · high confidence

New user registration form with validation and mobile support

The portal now includes a dedicated registration component that collects username, full name, date of birth, gender, country, and password. The form uses reactive validation (required fields, length limits, character restrictions, and password matching) and provides country auto-completion. A loading state prevents duplicate submission during registration, and the layout includes responsive styles for mobile devices.

client/src/app/features/portal/components/register · high confidence

New utility classes for pagination, validation, and date handling

This change introduces a new set of utility classes in the Application layer to support core application features. It adds DateTimeUtils for calculating age and days until a birthday (including validation that birth dates are not in the future), ValidationUtils for checking user roles, country codes, file sizes/types, and URL validity, and a suite of Pagination-related classes (PaginationParams, PagedList, PaginationHeader, MessageParams, UserParams) to enable paginated data retrieval and filtering for users and messages.

server/Application/Utils · high confidence

Paginated retrieval of post comments with validation and authorization checks

Users can now fetch comments for a specific post using a new paginated endpoint. The implementation validates that the post exists (throwing a not-found error if it does not), ensures pagination parameters are valid, and checks user roles. The response includes comment details such as content, author information, like counts, and flags indicating whether the current user has liked the comment or is authorized to view it.

server/Application/Features/Comments/GetPostComments · high confidence

Real-time messaging and online presence tracking

The server now supports live chat and user presence via SignalR hubs. MessageHub enables real-time message delivery, thread retrieval, and group management, while enforcing a rate limit of 5 messages per minute with a custom warning if exceeded. PresenceHub and PresenceTracker provide online status updates, notifying users when others connect or disconnect and allowing clients to retrieve the current list of online users.

server/WebAPI/SignalR · high confidence

Send friend request functionality added

Users can now send friend requests to other users via the server-side application layer. This change introduces the command, handler, validator, and response structures for the 'SendFriendRequest' feature. The handler validates that the receiver exists, ensures the user is not sending a request to themselves or an existing friend, checks for pending or declined previous requests, and persists the new request to the database. It also triggers cache invalidation for the receiver's friend requests and the friendship status between the two users to ensure data consistency.

server/Application/Features/Friends/SendFriendRequest · high confidence

Soft-delete private messages with authorization checks

The application now supports deleting private messages via a new MediatR command that implements a soft-delete mechanism. When a user deletes a message, the system verifies that the user is either the sender or recipient; if authorized, it marks the message as deleted for that specific user (SenderDeleted or RecipientDeleted) rather than immediately removing it from the database. The message is only physically removed from storage once both the sender and recipient have marked it as deleted. This change introduces the command, handler, validator, and response structures for this feature within the Messages feature area.

server/Application/Features/Messages/DeleteMessage · high confidence

User account deletion feature

Users can now delete their own accounts via a new command handler. The process removes the user's posts, connections, friend requests, friendships, and private messages from the database. It also decrements the like count on any posts the user previously liked. Guest and Administrator accounts are protected and cannot be deleted. After deletion, the search and nearest-birthdays caches are invalidated.

server/Application/Features/Users/DeleteUser · high confidence

User profile editing capability with photo upload and validation

Users can now update their profile details, including description, country, and profile picture. The system validates input (e.g., photo size \< 5MB, valid country, description length \<= 200 chars) and handles photo uploads by replacing existing images in cloud storage. Only the profile owner can edit their own details, ensuring authorization. The response returns the updated photo URL, description, and country.

server/Application/Features/Users/EditUserDetails · high confidence

Architecture

Centralized application service registration

The server's application layer now uses a centralized dependency injection setup to register core services. This includes MediatR for command/query handling, FluentValidation for request validation, and specific service collections for token management, authenticated user operations, and memory caching.

server/Application, server/Infrastructure · high confidence

Behavioural changes

Added Entity Framework Core configurations for new domain entities

The data layer now includes explicit Entity Framework Core mapping configurations for several new domain entities, including AppRole, AppUser, Comment, FriendRequest, Friendship, Like, Post, and PrivateMessage. These configurations define the database relationships and constraints for the system, such as user-role associations, post and comment interactions, friend request flows, and private messaging, ensuring the database schema correctly reflects the updated application model.

server/Infrastructure/Data/Configurations · high confidence

Added development and production environment configurations

The application now includes distinct environment files for development and production builds. The development environment is configured to connect to a local HTTPS server at localhost:7074 for both API and SignalR hub endpoints, while the production environment uses relative paths for these services. Both configurations share the same Cloudinary URL for media storage.

client/src/environments · high confidence

Added in-memory caching for user search results

The GetUsersForSearchBar query handler now caches the list of users returned by the search bar endpoint in memory for 10 minutes. This reduces database load by serving repeated search requests from the cache instead of querying the database every time, improving response times for users searching for other accounts.

server/Application/Features/Users/GetUsersForSearchBar · high confidence

Added validation pipeline behavior for request handling

A new ValidationBehavior has been introduced to the application's request pipeline. This behavior automatically intercepts requests, validates them using FluentValidation validators, and throws a ValidationException if any validation failures are detected, ensuring data integrity before the request is processed further.

server/Application/Behaviors · high confidence

Admin route access control via local storage roles

A new admin guard has been introduced to restrict access to administrative sections of the application. When a user attempts to navigate to a protected admin route, the system checks the 'roles' item stored in local storage; if the stored JSON array does not include 'Admin', the user is redirected to the home page. This ensures that only users with the Admin role can access these features.

client/src/app/features/admin/guards · high confidence

Admin user display component refactored to standalone with responsive styling

The admin user display component has been converted to a standalone component, utilizing Angular's new control flow syntax (@if) for conditional rendering of user details and role-editing buttons. The component now includes responsive SCSS styles that adjust layout and font sizes for screens under 750px and 480px, ensuring better usability on smaller devices. Functionally, it retains the ability to edit user roles and delete users via dialog confirmations, but the underlying implementation is cleaner and more modular.

client/src/app/features/admin/components · high confidence

Auth form migrated to standalone component with new responsive styling

The portal's authentication form has been refactored into a standalone Angular component, removing the need for module declarations and allowing it to directly import the Login and Register sub-components. The UI now uses Angular's new control flow syntax (@if) to switch between the Sign In and Sign Up views, and the styling has been updated with specific media queries to improve responsiveness on mobile devices (max-width: 600px), including adjustments to margins, borders, and background colors.

client/src/app/features/portal/components/auth-form · high confidence

Centralized HTTP interceptors and Cloudinary loader configuration

The core module now explicitly registers AuthInterceptor and ErrorInterceptor to handle authentication and error handling for all HTTP requests, and configures the Cloudinary image loader using the URL defined in the environment settings.

client/src/app/core · high confidence

Centralized HTTP interceptors for authentication and error handling

The application now uses dedicated HTTP interceptors to manage user experience and security. The new AuthInterceptor automatically attaches JWT tokens to outgoing requests, excluding login and registration endpoints, ensuring authenticated users remain logged in across API calls. Simultaneously, the ErrorInterceptor provides consistent user feedback by displaying specific error messages via Toastr for common HTTP status codes (400, 401, 404, 409, 429, 500), including handling rate-limiting notifications and detailed validation errors.

client/src/app/core/interceptors · high confidence

Centralized exception handling with structured JSON error responses

The API now uses a new centralized ExceptionMiddleware to catch and handle errors consistently. When an exception occurs, the middleware logs the error and returns a structured JSON response containing the status code, a user-friendly message, and, in development mode, the stack trace. For validation errors, specific error details are included in the response payload, while other exceptions return a generic 'Internal Server Error' message in production environments to avoid leaking sensitive information.

server/WebAPI/Middleware · high confidence

Centralized server startup configuration and service registration

The server's startup logic has been consolidated into a set of extension methods within the Infrastructure layer, establishing a unified entry point for application configuration. This includes registering the PostgreSQL database context and user management services, configuring ASP.NET Core Identity with JWT authentication (including SignalR hub token support), and setting up role-based authorization policies. Additionally, the application now integrates Cloudinary for image storage, implements IP-based rate limiting to protect endpoints, and enforces HTTPS redirection with environment-specific CORS rules for production and development origins.

server/Infrastructure/Extensions · high confidence

Database schema refactored to support ASP.NET Core Identity and new social features

The database schema has been significantly updated to migrate from a custom user model to ASP.NET Core Identity, introducing standard tables for roles, claims, logins, and tokens. The user profile was expanded to include location (City, Country), personal details (FullName, DateOfBirth), and activity tracking (Created, LastActive). New tables were added to support social interactions, including FriendRequest, Post, GroupChat, and GroupMessage. Messaging was restructured by replacing the generic Message table with a dedicated PrivateMessage table, and user profile pictures were removed from the database schema.

server/Infrastructure/Data/Migrations · high confidence

Discover feature restructured into standalone components with mobile-responsive filters

The Discover feature has been refactored into standalone components, introducing a dedicated Searchbar component for user lookup and a main Discover component that manages user listings, pagination, and filtering. The UI now supports mobile responsiveness, including a toggleable filter panel for smaller screens, and persists user filter preferences (age, gender, country, sort order) to local storage. The search interface includes an autocomplete dropdown for users, while the main view displays matched users with loading skeletons and error states.

client/src/app/features/discover · high confidence

Discover services now use global cache management

The Discover feature's services (CountriesService and DiscoverUsersService) now integrate with a global CacheManagerService to cache API responses. This means that repeated requests for user lists and country data will be served from the cache instead of hitting the server again, improving performance and reducing network load.

client/src/app/features/discover/services · high confidence

Friend request notifications now prevent duplicate actions and use OnPush change detection

The header notifications component has been refactored to standalone architecture with OnPush change detection for improved performance. It now includes a loading state that disables Accept/Decline buttons during API calls to prevent duplicate requests, and displays a 'No New Requests' message when the list is empty. The UI uses Angular's new control flow syntax (@for, @if) and distinguishes between pending requests (with action buttons) and resolved requests (showing acceptance/decline status).

client/src/app/core/components/header/components/header-notifications · high confidence

Header logo component refactored to standalone with hover animations

The header logo component has been converted to a standalone Angular component using OnPush change detection for improved performance. It now features interactive hover effects, where the logo image and text elements animate (spin and translate) when the user mouses over the link. The component also supports dynamic theming, switching between light and dark logo images based on the provided theme input.

client/src/app/core/components/header/components/header-logo · high confidence

The header navigation links component has been refactored into a standalone Angular component, replacing the previous implementation. This change introduces the new @for() control flow syntax for rendering the navigation list, which improves performance and aligns with modern Angular standards. The component now explicitly imports RouterLink and RouterLinkActive, and the navigation data (Home, Discover, Messages, Games) is defined in a dedicated module. This update is part of a broader client migration to standalone components and a restructuring of the application into features, core, and shared modules.

client/src/app/core/components/header/components/header-nav-links · high confidence

Home feed now uses infinite scroll with caching and responsive layout

The home page now loads posts in paginated chunks using infinite scroll, automatically fetching more content as the user scrolls down. Initial load and subsequent pages are cached locally to improve performance and reduce redundant network requests. The layout is fully responsive, hiding sidebars on smaller screens and adjusting font sizes and spacing for mobile devices. Error states are displayed if post loading fails, and the feed updates immediately when posts are uploaded, edited, or deleted.

client/src/app/features/home · high confidence

Introduction of ValidationException for structured validation errors

The application now includes a specific ValidationException class that captures validation failures from FluentValidation. When validation fails, this exception groups errors by property name and provides a structured dictionary of error messages, allowing the API to return detailed, field-specific validation feedback to the client instead of a generic error.

server/Application/Exceptions · high confidence

Introduction of shared TypeScript models for client-side type safety

The client application now includes a set of new TypeScript interfaces and classes in the shared models directory to define the structure of data exchanged with the backend. These models cover core domain entities including authentication (LoginRequest, RegisterRequest, AuthResponse), user profiles (ProfileUser, SearchUser, Avatar), social interactions (Post, Comment, Friend, FriendRequest, LikedUser), messaging (Message), and utility structures (Pagination, DialogData). This change establishes a consistent type contract for the UI components and services, replacing any previous ad-hoc or untyped data handling with strict TypeScript definitions.

client/src/app/shared/models · high confidence

Introduction of standalone User Card component with modern Angular control flow

The user card in the Discover feature has been replaced with a new standalone component that leverages Angular's new @if control flow syntax for conditional rendering. This update introduces a hover-based interaction where profile images and icons scale and blur, while action icons (view profile, message) slide up from the bottom. The component now uses OnPush change detection for performance, integrates with the PresenceService to display a live online status indicator, and utilizes NgOptimizedImage for efficient image loading.

client/src/app/features/discover/components/user-card · high confidence

Introduction of standalone header dropdown component

The header dropdown menu is now implemented as a standalone Angular component, replacing the previous structure. This change introduces a new UI for the user menu, featuring 'Edit Profile', 'About Site', and 'Log Out' options with specific styling and iconography. The component utilizes OnPush change detection for performance and integrates directly with the router and account service to handle navigation and logout actions.

client/src/app/core/components/header/components/header-dropdown · high confidence

Mark message as read feature moved to Messages folder

The MarkMessageAsRead command, handler, validator, and response have been relocated from the MessageGroups folder to the Messages folder. This change reorganizes the application's feature structure to better align with the domain concept of messages, without altering the underlying functionality of marking a message as read.

server/Application/Features/Messages/MarkMessageAsRead · high confidence

Message display component migrated to standalone architecture with OnPush change detection

The message display component has been refactored into a standalone component, explicitly importing only the dependencies it uses (RouterLink, UserAvatarComponent, pipes, and SpinnerComponent) rather than relying on a shared module. This change enables the use of Angular's new control flow syntax (@if) for conditional rendering and applies OnPush change detection to improve performance. Additionally, the component now includes a loading indicator state for the delete action, preventing duplicate requests while a message is being removed.

client/src/app/features/messages/components/message-display · high confidence

New routing structure and navigation guards

The application now uses a comprehensive routing configuration that organizes features into distinct modules (home, discover, profile, messages, games, admin) with lazy-loaded components. New navigation guards enforce access control: authentication checks redirect unauthenticated users to the portal, while specific profile guards prevent users from editing other users' profiles or accessing message tabs on other users' profiles. A new 'not-found' component handles 404 errors, and the main app component manages theme persistence and navbar visibility based on the current route.

client/src/app · high confidence

New standalone profile user card with friend status and moderation controls

The profile user card has been replaced with a new standalone component that displays user details (picture, name, location, birthday, description, join date) and manages friend interactions. It now shows real-time online/offline status, handles friend request states (None, Pending, Declined, Friends, Loading, Error) with appropriate buttons, and provides moderation actions for pictures and descriptions. The component includes loading indicators to prevent duplicate requests and error handling for friend status operations.

client/src/app/features/profile/components/profile-user-card · high confidence

New user profile and search data transfer objects

The application introduces a set of new Data Transfer Objects (DTOs) within the Users feature to standardize user data representation. These include EditUserDto for updating user profiles (username, photo, description, country), ProfileUserDto for detailed user profile views (including gender, date of birth, and authorization status), SearchUserDto for search results, UserBirthdayDto for birthday-related features, and UsersDto for general user listings. These changes support the backend logic for user editing, discovery, and profile display.

server/Application/Features/Users/Common · high confidence

Online users list now shows error states and uses standalone components

The online users list component has been refactored to be standalone and now explicitly handles loading and error states. Users will see a specific 'Error Loading Online Users' message if the request fails, rather than a silent failure or generic loading state. The component now combines user search data with presence service data to display only currently online users, leveraging the async pipe for cleaner template logic.

client/src/app/features/messages/components/online-users-list · high confidence

Portal login page redesigned with responsive layout and animations

The portal login interface has been updated to a new standalone component structure, featuring a redesigned layout with animated text ('Connect, Play, Stay') and a dedicated logo section. The styling now includes responsive breakpoints to adjust the layout for mobile devices (hiding subtext on smaller screens, switching background images) and large displays, while a hidden icon is pre-loaded to prevent initial flicker on iOS devices.

client/src/app/features/portal · high confidence

The profile gallery page has been rewritten as a standalone component that uses Angular's @switch control flow to display distinct states: a spinner while loading, a message if the user has no photos, an error message on failure, and the photo gallery once loaded. The layout includes responsive styles that adjust the gallery width and height on screens narrower than 900px.

client/src/app/features/profile/pages/gallery · high confidence

Profile navigation component migrated to standalone architecture with new control flow

The profile navigation component has been converted to a standalone component, utilizing Angular's standalone imports for routing directives and enabling OnPush change detection for performance optimization. The template now uses the new @if/@else control flow syntax to conditionally display either a 'Message' link (for other users' profiles) or an 'Edit Info' link (for the current user's profile), replacing previous structural directives. Mobile responsiveness has also been updated with specific media queries for screens under 900px and 450px.

client/src/app/features/profile/components/profile-navigation · high confidence

Profile posts page now uses standalone components with caching and infinite scroll

The profile posts page has been refactored to use Angular standalone components, replacing the previous module-based structure. This change introduces client-side caching for member posts to improve load times, adds infinite scroll for paginated post loading, and includes responsive styling updates for mobile devices. Users will see improved performance and a better mobile experience when viewing posts on member profiles.

client/src/app/features/profile/pages/posts · high confidence

Redesigned messages interface with sidebar and loading controls

The Messages page has been restructured into a three-column layout featuring a left sidebar for upcoming birthdays, a central area for paginated message lists with tabbed navigation (e.g., Unread, Sent), and a right sidebar for online users. This update introduces explicit loading states with a spinner and error handling for message retrieval, prevents duplicate requests during navigation, and improves mobile responsiveness by hiding sidebars on smaller screens.

client/src/app/features/messages · high confidence

Shared UI components migrated to standalone architecture with OnPush change detection

The shared components in the client application—including post, comment, upload, and user-avatar modules—have been refactored into standalone components. This change introduces OnPush change detection strategies to improve rendering performance and utilizes Angular's NgOptimizedImage directive for better image loading. The update also incorporates the new @if and @for control flow syntax in templates, replacing legacy structural directives, and integrates a global spinner component to provide consistent loading feedback during user interactions.

client/src/app/shared/components · high confidence

User activity logging and Swagger authorization documentation

The API now automatically updates the last active timestamp for authenticated users upon successful requests via the new LogUserActivity filter. Additionally, Swagger documentation is enhanced to automatically display 401/403 responses and Bearer token security requirements for endpoints marked with the Authorize attribute, improving developer visibility into authentication needs.

server/WebAPI/Filters · high confidence

Test coverage

Added unit tests for Message Group and Connection commands and queries; Added unit tests for Posts application features; Added unit tests for authentication handlers; Added unit tests for comment management features; Added unit tests for moderator commands to delete user descriptions and photos; Added unit tests for private messaging features; Added unit tests for the Friends feature handlers; Added unit tests for user management features; Initial server-side unit and integration test suite.

Dependencies

Initial dependency manifests for Angular 17 client and .NET 7 server

The project now includes its first dependency manifests, establishing the client-side stack on Angular 17 (including Material, SignalR, and various UI utilities) and the server-side stack on .NET 7 (using Entity Framework Core, MediatR, and JWT authentication). This change introduces the foundational package definitions for both the frontend and backend, along with the necessary test frameworks (xUnit, NSubstitute) for the server.

(dependencies) · high confidence

Housekeeping

Server project structure and documentation added

The server area now includes a README.md detailing the PlayLink ASP.NET Core Web API's tech stack (C\#, PostgreSQL, Docker, SignalR) and Clean Architecture layers (Domain, Application, Infrastructure, WebAPI), alongside a server.sln file that defines the solution structure with these four core projects and two test projects (Application.Tests.Unit, WebAPI.Tests.Integration).

server · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 40 → 39 (-1.2)
  • Rubric changed (rubric-2026.08.18 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 66 → 70 (+3.4)
  • Architecture 91 → 91 (+0.3)
  • Maturity 57 → 53 (-4.0)
  • Readiness 20 → 21 (+0.5)
  • Security 62 → 57 (-4.7)
  • Accessibility 49 → 49 (+0.3)

Resolved (75)

  • Bounded contexts not declared
  • Change coupling: PostDto.cs ↔ DataContext.cs (server/Application/Features/Posts/Common/PostDto.cs)
  • Change coupling: PostDto.cs ↔ PostsController.cs (server/Application/Features/Posts/Common/PostDto.cs)
  • Change coupling: PostDto.cs ↔ UploadPostCommandValidator.cs (server/Application/Features/Posts/Common/PostDto.cs)
  • Change coupling: app-routing.module.ts ↔ app.module.ts (client/src/app/app-routing.module.ts)
  • Change coupling: app-routing.module.ts ↔ route-animations.ts (client/src/app/app-routing.module.ts)
  • Change coupling: app.module.ts ↔ auth-form.component.ts (client/src/app/app.module.ts)
  • Change coupling: app.module.ts ↔ nav-links.ts (client/src/app/app.module.ts)
  • Change coupling: app.module.ts ↔ route-animations.ts (client/src/app/app.module.ts)
  • Change coupling: route-animations.ts ↔ UsersController.cs (client/src/app/core/animations/route-animations.ts)
  • Change coupling: route-animations.ts ↔ nav-links.ts (client/src/app/core/animations/route-animations.ts)
  • Coverage not measured — analyzer environment
  • Critical CVE: [GHSA redacted] (client/package-lock.json)
  • Critical CVE: [GHSA redacted] (client/package-lock.json)
  • Critical CVE: [GHSA redacted] (client/package-lock.json)
  • Duplicated block (10 lines × 2) (server/Application/Features/Messages/GetMessagesForUser/GetMessagesForUserQueryValidator.cs)
  • Duplicated block (10 lines × 3) (server/Application/Features/Admin/AdminGetUsers/AdminGetUsersQueryValidator.cs)
  • High CVE: [GHSA redacted] (client/package-lock.json)
  • High CVE: [GHSA redacted] (client/package-lock.json)
  • High CVE: [GHSA redacted] (client/package-lock.json)
  • …and 55 more

New (148)

  • (anonymous) (cognitive 16) (client/src/assets/games/rock_paper_scissors/script.js)
  • Boundary-crossing change coupling: home.component.ts ↔ comment.component.ts (client/src/app/features/home/home.component.ts)
  • Change coupling: app-routing.module.ts ↔ app.component.ts (client/src/app/app-routing.module.ts)
  • Change coupling: app.module.ts ↔ UserRegistrationCommandValidator.cs (client/src/app/app.module.ts)
  • Change coupling: home.component.ts ↔ posts.component.ts (client/src/app/features/home/home.component.ts)
  • Critical CVE: [GHSA redacted] (client/package-lock.json)
  • Critical CVE: [GHSA redacted] (client/package-lock.json)
  • Critical CVE: [GHSA redacted] (client/package-lock.json)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (10 lines × 2) (server/Application/Features/Messages/GetMessagesForUser/GetMessagesForUserQueryValidator.cs)
  • Duplicated block (10 lines × 2) (server/Application/Features/Posts/DeletePost/DeletePostCommandValidator.cs)
  • Duplicated block (10 lines × 3) (server/Application/Features/Admin/AdminGetUsers/AdminGetUsersQueryValidator.cs)
  • Duplicated block (11 lines × 2) (server/Application/Features/Admin/AdminUserDelete/AdminUserDeleteCommandHandler.cs)
  • Duplicated block (11 lines × 3) (server/Application/Features/Admin/AdminGetUsers/AdminGetUsersQueryValidator.cs)
  • Duplicated block (13 lines × 2) (server/Application/Features/Admin/AdminUserDelete/AdminUserDeleteCommandHandler.cs)
  • Duplicated block (6 lines × 2) (server/Application/Features/Friends/GetFriendshipStatus/GetFriendshipStatusQueryHandler.cs)
  • Duplicated block (7 lines × 2) (server/Application/Features/Likes/LikeComment/LikeCommentCommandValidator.cs)
  • Duplicated block (7 lines × 2) (server/Application/Features/Likes/LikePost/LikePostCommandValidator.cs)
  • End-of-life runtime: .NET net7.0
  • …and 128 more

API surface

  • Unchanged — 37 HTTP endpoints

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

JakaAmbrus/PlayLink was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 9acab9d96e7bb2b02f65fe479bf4cea3d81d2c4b — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-28e75b8e3254.