Skip to content

feat(dashboards): refactor my-projects to use user contribution data#196

Merged
asithade merged 1 commit intomainfrom
feat/LFXV2-873
Dec 4, 2025
Merged

feat(dashboards): refactor my-projects to use user contribution data#196
asithade merged 1 commit intomainfrom
feat/LFXV2-873

Conversation

@asithade
Copy link
Contributor

@asithade asithade commented Dec 4, 2025

Summary

  • Refactor my-projects dashboard to fetch user-specific project contributions from USER_PROJECT_CONTRIBUTIONS_DAILY Snowflake table
  • Remove client-side pagination from my-projects component and add empty state
  • Fix board member dashboard available accounts binding
  • Update RSVP disabled message for legacy meetings
  • Hide data copilot sparkle icon temporarily

Changes

  • My Projects Component: Remove pagination, add empty state template
  • Analytics Service/Controller: Remove pagination params, use LF username from OIDC context
  • User Service: Query USER_PROJECT_CONTRIBUTIONS_DAILY table filtered by LF username
  • Interfaces: Update UserProjectContributionRow and ProjectItem with new fields

JIRA Tickets

  • LFXV2-873 - Refactor my-projects to use user contribution data
  • LFXV2-874 - Fix board member dashboard available accounts binding
  • LFXV2-875 - Update RSVP disabled message for legacy meetings
  • LFXV2-876 - Hide data copilot sparkle icon temporarily

- Remove pagination from my-projects component, add empty state
- Update analytics service and controller to use LF username
- Refactor user service to query USER_PROJECT_CONTRIBUTIONS_DAILY table
- Update interfaces with new fields (PROJECT_LOGO, IS_MAINTAINER, AFFILIATION)
- Fix board member dashboard available accounts binding (LFXV2-874)
- Update RSVP disabled message for legacy meetings (LFXV2-875)
- Hide data copilot sparkle icon temporarily (LFXV2-876)

LFXV2-873 LFXV2-874 LFXV2-875 LFXV2-876

Signed-off-by: Asitha de Silva <asithade@gmail.com>
@asithade asithade requested a review from jordane as a code owner December 4, 2025 18:49
Copilot AI review requested due to automatic review settings December 4, 2025 18:49
@coderabbitai
Copy link

coderabbitai bot commented Dec 4, 2025

Walkthrough

This pull request refactors the projects data retrieval from a pagination-based approach to an authentication-based username lookup. It removes lazy-loading pagination from the projects table UI, simplifies the analytics service API, updates backend controllers and services to use authenticated username parameters, and modifies related interface definitions and component properties.

Changes

Cohort / File(s) Summary
Data Model & Interface Updates
packages/shared/src/interfaces/analytics-data.interface.ts
packages/shared/src/interfaces/components.interface.ts
Renamed UserProjectActivityRow to UserProjectContributionRow with new fields PROJECT_LOGO and IS_MAINTAINER, removed DAILY_TOTAL_ACTIVITIES. Updated ProjectItem interface: added slug property, changed role from string to 'Maintainer' | 'Contributor' union type, removed status property.
Backend Service Layer Refactoring
apps/lfx-one/src/server/services/user.service.ts
apps/lfx-one/src/server/controllers/analytics.controller.ts
Replaced pagination-based query with username-based lookup; refactored getMyProjects() signature from (page, limit) to (lfUsername). Updated Snowflake query to use CTEs with project logos, affiliations, and activity data filtered by LF username. Removed pagination parameter parsing in controller and added authentication validation.
Frontend Service & API Layer
apps/lfx-one/src/app/shared/services/analytics.service.ts
Removed pagination parameters from getMyProjects() method; now calls /api/analytics/my-projects without query params. Updated JSDoc and error fallback response to match new signature.
My Projects Component
apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.ts
apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.html
Removed pagination state (paginationState$ BehaviorSubject, onPageChange method, rows signal). Simplified table from lazy-loaded with pagination to direct binding [value]="projects()"; added empty state ng-template with "No projects found" message.
Board Member Dashboard
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html
Changed availableAccounts from computed Signal (this.accountContextService.availableAccounts) to static array import (ACCOUNTS). Updated template binding from method call availableAccounts() to property availableAccounts.
Minor UI & Text Updates
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html
apps/lfx-one/src/app/shared/components/data-copilot/data-copilot.component.html
Updated RSVP disabledMessage text from "Meetings created outside of LFX One do not have RSVP functionality" to "RSVP functionality will soon be available for all upcoming LFX meetings visible to you". Commented out sparkle icon in data-copilot button.

Sequence Diagram

sequenceDiagram
    participant Client as Client / Component
    participant Service as Analytics Service
    participant Controller as Analytics Controller
    participant UserSvc as User Service
    participant DB as Snowflake DB

    Client->>Service: getMyProjects()
    Service->>Controller: GET /api/analytics/my-projects
    Controller->>Controller: Extract lfUsername from auth
    alt Username present
        Controller->>UserSvc: getMyProjects(lfUsername)
        UserSvc->>DB: Query projects + affiliations + activities<br/>filtered by LF_USERNAME
        DB-->>UserSvc: Result rows with contribution data
        UserSvc->>UserSvc: Group by PROJECT_ID<br/>Parse affiliations & role
        UserSvc-->>Controller: UserProjectsResponse<br/>(projects[], totalProjects)
        Controller-->>Service: 200 OK + response
    else Username missing
        Controller-->>Service: 401 AuthenticationError
    end
    Service-->>Client: Observable<UserProjectsResponse>
    Client->>Client: Update projects signal
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • user.service.ts: Requires careful review of the Snowflake query refactoring (CTE logic, aggregation, affiliation parsing) and ensure the new username-based filtering returns correct data without introducing regressions
  • analytics.controller.ts & analytics.service.ts: Verify authentication-based username extraction is secure and that the removal of pagination parameters doesn't break existing API contracts
  • Interface changes (analytics-data.interface.ts, components.interface.ts): Check that field removals (status), type narrowing (role), and renamings propagate correctly through all consumers
  • my-projects component: Confirm empty state template displays correctly and that removal of pagination state doesn't leave orphaned references

Pre-merge checks and finishing touches

✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: refactoring my-projects to use user contribution data from Snowflake instead of pagination, matching the primary objective.
Description check ✅ Passed The description is well-related to the changeset, covering all major changes including my-projects refactoring, pagination removal, accounts binding fix, RSVP message update, and data copilot icon hiding.
Linked Issues check ✅ Passed All coding requirements from linked issues are met: LFXV2-873 refactors my-projects with user contributions and removes pagination LFXV2-873, LFXV2-874 fixes accounts binding [LFXV2-874], LFXV2-875 updates RSVP message [LFXV2-875], and LFXV2-876 hides the sparkle icon [LFXV2-876].
Out of Scope Changes check ✅ Passed All code changes align with the linked issues: my-projects refactoring, service/controller updates for user contributions, interface updates, accounts binding fix, RSVP message update, and copilot icon visibility change are all within scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/LFXV2-873

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

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.ts (1)

37-45: Incorrect loading state logic in tap operator.

The tap(() => this.loading.set(true)) executes when the observable emits a value, meaning it sets loading to true after data has arrived. Since loading is already initialized to true on line 25, this tap is both redundant and semantically incorrect.

Apply this diff to fix the loading state flow:

   private readonly projectsResponse = toSignal(
     this.analyticsService.getMyProjects().pipe(
-      tap(() => this.loading.set(true)),
       finalize(() => this.loading.set(false))
     ),
     {
       initialValue: { data: [], totalProjects: 0 },
     }
   );
🧹 Nitpick comments (3)
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html (1)

264-272: Consider adding data-testid attributes to RSVP components for better test coverage.

The lfx-meeting-rsvp-details (line 264) and lfx-rsvp-button-group (line 276) components lack data-testid attributes. Given the file's existing convention and the fact that these components now have disabled states and custom messages worth testing, adding identifiers like data-testid="rsvp-details-card" and data-testid="rsvp-button-group" would improve test reliability and consistency with the rest of the component.

Also applies to: 276-281

apps/lfx-one/src/server/services/user.service.ts (2)

382-421: Consider adding a limit for very active users.

The query returns all projects and all daily activity records for a user without any limit. For users with many project contributions over extended periods, this could result in large result sets impacting performance and memory.

Consider adding a date range filter (e.g., last 90 days) or limiting the number of projects returned:

-- In UserProjects CTE, add ORDER BY and LIMIT
ORDER BY PROJECT_NAME, PROJECT_ID
LIMIT 50

-- Or in DailyActivities CTE, add date filter
WHERE LF_USERNAME = ?
  AND ACTIVITY_DATE >= DATEADD(DAY, -90, CURRENT_DATE())

379-379: Missing structured logging per backend service guidelines.

The method lacks logging for operation tracking. Per coding guidelines, backend services should log INFO level for successful data retrieval and DEBUG level for internal operations.

The method needs a req: Request parameter for logging, or use serverLogger directly. Example additions:

public async getMyProjects(req: Request, lfUsername: string): Promise<UserProjectsResponse> {
  req.log.debug({ lfUsername }, 'Fetching user project contributions');
  
  // ... query execution ...
  
  req.log.info(
    { projectCount: projects.length, lfUsername },
    'User project contributions retrieved successfully'
  );
  
  return { data: projects, totalProjects: projects.length };
}

Based on coding guidelines for apps/**/**/server/**/*.{ts,js}.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Jira integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 22776a1 and bab2101.

📒 Files selected for processing (11)
  • apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html (1 hunks)
  • apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts (2 hunks)
  • apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.html (2 hunks)
  • apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.ts (2 hunks)
  • apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html (2 hunks)
  • apps/lfx-one/src/app/shared/components/data-copilot/data-copilot.component.html (1 hunks)
  • apps/lfx-one/src/app/shared/services/analytics.service.ts (1 hunks)
  • apps/lfx-one/src/server/controllers/analytics.controller.ts (2 hunks)
  • apps/lfx-one/src/server/services/user.service.ts (2 hunks)
  • packages/shared/src/interfaces/analytics-data.interface.ts (2 hunks)
  • packages/shared/src/interfaces/components.interface.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (8)
**/*.{html,ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Always add data-testid attributes when creating new components for reliable test targeting

Files:

  • apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html
  • apps/lfx-one/src/server/controllers/analytics.controller.ts
  • apps/lfx-one/src/app/shared/components/data-copilot/data-copilot.component.html
  • apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html
  • apps/lfx-one/src/server/services/user.service.ts
  • apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts
  • packages/shared/src/interfaces/analytics-data.interface.ts
  • apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.html
  • apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.ts
  • packages/shared/src/interfaces/components.interface.ts
  • apps/lfx-one/src/app/shared/services/analytics.service.ts
**/*.html

📄 CodeRabbit inference engine (CLAUDE.md)

Use data-testid naming convention - [section]-[component]-[element] for hierarchical structure

Files:

  • apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html
  • apps/lfx-one/src/app/shared/components/data-copilot/data-copilot.component.html
  • apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html
  • apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.html
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Always use direct imports for standalone components - no barrel exports
Use TypeScript interfaces instead of union types for better maintainability
Do not nest ternary expressions
Prefer interface for defining object shapes in TypeScript
Use path mappings and import aliases as configured in tsconfig.json for imports

Files:

  • apps/lfx-one/src/server/controllers/analytics.controller.ts
  • apps/lfx-one/src/server/services/user.service.ts
  • apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts
  • packages/shared/src/interfaces/analytics-data.interface.ts
  • apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.ts
  • packages/shared/src/interfaces/components.interface.ts
  • apps/lfx-one/src/app/shared/services/analytics.service.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,js,jsx}: License headers are required on all source files
Prepend 'Generated with Claude Code (https://claude.ai/code)' if assisted with the code

Files:

  • apps/lfx-one/src/server/controllers/analytics.controller.ts
  • apps/lfx-one/src/server/services/user.service.ts
  • apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts
  • packages/shared/src/interfaces/analytics-data.interface.ts
  • apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.ts
  • packages/shared/src/interfaces/components.interface.ts
  • apps/lfx-one/src/app/shared/services/analytics.service.ts
apps/**/**/server/**/*.{ts,js}

📄 CodeRabbit inference engine (CLAUDE.md)

apps/**/**/server/**/*.{ts,js}: Use Pino for structured JSON logs with sensitive data redaction in all backend services
Always use err field for errors to leverage Pino's error serializer - correct: req.log.error({ err: error, ...metadata }, 'message')
Log INFO level for business operation completions (created, updated, deleted) and successful data retrieval
Log WARN level for error conditions leading to exceptions and data quality issues
Log DEBUG level for internal operations, preparation steps, and intent statements
Log ERROR level for system failures, unhandled exceptions, and critical errors

Files:

  • apps/lfx-one/src/server/controllers/analytics.controller.ts
  • apps/lfx-one/src/server/services/user.service.ts
apps/**/**/server/**/*controller*.{ts,js}

📄 CodeRabbit inference engine (CLAUDE.md)

All controller functions must use Logger helper methods: Logger.start(), Logger.success(), Logger.error(), Logger.warning(), Logger.validation()

Files:

  • apps/lfx-one/src/server/controllers/analytics.controller.ts
**/*.component.ts

📄 CodeRabbit inference engine (CLAUDE.md)

Use Angular 19 zoneless change detection with signals for component state management

Files:

  • apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts
  • apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.ts
packages/shared/src/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

All shared types, interfaces, and constants are centralized in @lfx-one/shared package

Files:

  • packages/shared/src/interfaces/analytics-data.interface.ts
  • packages/shared/src/interfaces/components.interface.ts
🧬 Code graph analysis (4)
apps/lfx-one/src/server/controllers/analytics.controller.ts (3)
apps/lfx-one/src/server/helpers/logger.ts (1)
  • Logger (10-129)
apps/lfx-one/src/server/utils/auth-helper.ts (1)
  • getUsernameFromAuth (10-22)
apps/lfx-one/src/server/errors/index.ts (1)
  • AuthenticationError (5-5)
apps/lfx-one/src/server/services/user.service.ts (2)
packages/shared/src/interfaces/analytics-data.interface.ts (2)
  • UserProjectsResponse (178-188)
  • UserProjectContributionRow (128-173)
packages/shared/src/interfaces/components.interface.ts (1)
  • ProjectItem (420-435)
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts (1)
packages/shared/src/constants/accounts.constants.ts (1)
  • ACCOUNTS (10-31)
apps/lfx-one/src/app/shared/services/analytics.service.ts (1)
packages/shared/src/interfaces/analytics-data.interface.ts (1)
  • UserProjectsResponse (178-188)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Agent
🔇 Additional comments (13)
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html (1)

271-271: Message text updated correctly per LFXV2-875 requirements.

Both RSVP component disabledMessage attributes have been updated with the correct text as specified in the PR objective. The message change—from "Meetings created outside of LFX One do not have RSVP functionality" to "RSVP functionality will soon be available for all upcoming LFX meetings visible to you"—improves messaging for legacy meetings.

Also applies to: 280-280

apps/lfx-one/src/app/shared/components/data-copilot/data-copilot.component.html (1)

14-14: LGTM! Temporary icon removal as per requirements.

The sparkle icon is appropriately commented out rather than deleted, making it easy to re-enable in the future per LFXV2-876 requirements.

apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html (1)

19-19: LGTM! Template binding correctly updated to match TypeScript changes.

The binding now uses availableAccounts as a property instead of availableAccounts() as a Signal method call, which correctly aligns with the TypeScript component change where availableAccounts is now the static ACCOUNTS constant.

apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.html (2)

19-19: Good simplification! Consider monitoring performance with large project lists.

The removal of pagination simplifies the implementation and aligns with the backend changes. However, if users have a large number of projects, loading all at once could impact performance.

Consider monitoring the performance impact for users with many projects. If needed, you could implement client-side virtual scrolling or re-introduce server-side pagination in the future.


81-90: LGTM! Empty state properly implemented with good UX.

The empty state template is well-structured with:

  • Proper colspan for full-width display
  • Icon and message for clear communication
  • Correct data-testid attribute per coding guidelines
apps/lfx-one/src/server/controllers/analytics.controller.ts (1)

126-133: LGTM! Authentication-based filtering properly implemented.

The change from pagination parameters to username-based filtering is well-implemented:

  • Uses getUsernameFromAuth helper for consistent auth handling
  • Properly throws AuthenticationError when username is missing
  • Clear error message for debugging
apps/lfx-one/src/app/shared/services/analytics.service.ts (1)

96-109: LGTM! Pagination removed cleanly with proper error handling.

The method signature and HTTP call have been correctly updated to remove pagination support, aligning with the backend changes. Error handling remains appropriate with a proper fallback response structure.

packages/shared/src/interfaces/analytics-data.interface.ts (1)

125-173: All references to the old interface name have been successfully updated.

The interface has been renamed from UserProjectActivityRow to UserProjectContributionRow with the following changes:

  • Added: PROJECT_LOGO, IS_MAINTAINER, AFFILIATION
  • Removed: DAILY_TOTAL_ACTIVITIES

Verification confirms no references to the old interface name remain in the codebase. The new interface is properly exported through the barrel export in packages/shared/src/interfaces/index.ts, and the migration appears complete with no breaking references outstanding.

apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts (1)

8-8: No actionable changes needed. The import and usage are correct.

The component intentionally uses the static ACCOUNTS constant for the display list (line 39), while line 55 correctly uses this.accountContextService.availableAccounts to retrieve the account for selection. The service's availableAccounts getter is a wrapper that returns either user-specific organizations from committee memberships or defaults to the static ACCOUNTS constant, ensuring the lookup respects the user's access level. This is a sound architectural pattern.

packages/shared/src/interfaces/components.interface.ts (1)

420-435: All ProjectItem consumers have been updated to handle the interface changes.

The breaking changes have been properly addressed:

  1. slug field added: user.service.ts correctly populates slug: row.PROJECT_SLUG
  2. role type narrowed to 'Maintainer' | 'Contributor': user.service.ts correctly assigns role: row.IS_MAINTAINER ? 'Maintainer' : 'Contributor'
  3. All other required fields: affiliations, codeActivities, and nonCodeActivities are properly initialized

Verified consumers:

  • user.service.ts: Creates ProjectItem objects with complete and correct field mapping
  • my-projects.component.ts: Successfully spreads project data and extends with chart configurations
  • analytics-data.interface.ts: Properly uses ProjectItem[] in response type

Note: The claim about a removed status field could not be verified in the current interface or any consumer code.

apps/lfx-one/src/server/services/user.service.ts (3)

21-21: LGTM!

Import updated to reflect the new UserProjectContributionRow interface which includes the additional fields (PROJECT_LOGO, IS_MAINTAINER, AFFILIATION) required by the refactored query.


373-379: LGTM on the method signature change.

The transition from pagination-based (page, limit) to username-based (lfUsername) aligns with the PR objective to fetch user-specific contributions directly from OIDC context.


428-451: LGTM on result processing.

The processing logic correctly handles:

  • Parsing comma-separated affiliations with empty string filtering
  • Converting null PROJECT_LOGO to undefined for the optional interface property
  • Using truthy evaluation for IS_MAINTAINER to handle Snowflake's boolean representation
  • Safely adding activity data only when ACTIVITY_DATE exists

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR refactors the my-projects dashboard to fetch user-specific project contributions from the Snowflake USER_PROJECT_CONTRIBUTIONS_DAILY table instead of the previous PROJECT_CODE_ACTIVITY table. The refactoring removes client-side pagination in favor of loading all projects at once, adds an empty state when no projects are found, and updates the data model to include new fields like project slug, logo, and user role (Maintainer/Contributor). Additionally, the PR includes several minor fixes: correcting the board member dashboard's available accounts binding to use a constant array, updating RSVP disabled messages for legacy meetings to be more user-friendly, and temporarily hiding the data copilot sparkle icon.

  • Refactored my-projects to query USER_PROJECT_CONTRIBUTIONS_DAILY table filtered by LF username from OIDC context
  • Removed client-side pagination and added empty state template for better UX
  • Updated interfaces to reflect new data structure with slug, logo, role, and improved documentation

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
packages/shared/src/interfaces/components.interface.ts Updated ProjectItem interface to include slug field and changed role to union type ('Maintainer' | 'Contributor'), improved documentation
packages/shared/src/interfaces/analytics-data.interface.ts Renamed interface from UserProjectActivityRow to UserProjectContributionRow, added PROJECT_LOGO, IS_MAINTAINER, and AFFILIATION fields
apps/lfx-one/src/server/services/user.service.ts Refactored getMyProjects to query USER_PROJECT_CONTRIBUTIONS_DAILY with LF username filter, removed pagination, added affiliation aggregation and maintainer role logic
apps/lfx-one/src/server/controllers/analytics.controller.ts Removed pagination parameters, added authentication check to get LF username from OIDC context
apps/lfx-one/src/app/shared/services/analytics.service.ts Removed pagination parameters from getMyProjects method
apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.ts Removed pagination state management and related imports, simplified data fetching
apps/lfx-one/src/app/modules/dashboards/components/my-projects/my-projects.component.html Removed pagination attributes from table, added empty state template
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.ts Changed availableAccounts from Signal to constant ACCOUNTS array
apps/lfx-one/src/app/modules/dashboards/board-member/board-member-dashboard.component.html Updated template binding to use non-callable ACCOUNTS constant
apps/lfx-one/src/app/shared/components/data-copilot/data-copilot.component.html Commented out sparkle icon
apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html Updated RSVP disabled message to be more user-friendly
Comments suppressed due to low confidence (1)

packages/shared/src/interfaces/analytics-data.interface.ts:172

  • The DAILY_CODE_ACTIVITIES and DAILY_NON_CODE_ACTIVITIES fields should be nullable (number | null) since the SQL query uses LEFT JOIN DailyActivities a at line 419 of user.service.ts. When projects have no activity data, these fields will be null. The code at line 448 of user.service.ts already handles this with || 0, but the interface type doesn't reflect the nullable nature.
  /**
   * Code-related activities for this date
   */
  DAILY_CODE_ACTIVITIES: number;

  /**
   * Non-code-related activities for this date
   */
  DAILY_NON_CODE_ACTIVITIES: number;

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@asithade asithade merged commit 1218bd5 into main Dec 4, 2025
14 checks passed
@asithade asithade deleted the feat/LFXV2-873 branch December 4, 2025 19:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants