| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -5,6 +5,8 @@ import { permissions } from '@ghostfolio/common/permissions'; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					import { Injectable } from '@nestjs/common'; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					import { JwtService } from '@nestjs/jwt'; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					import { Currency } from '@prisma/client'; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					import * as bent from 'bent'; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					import { subDays } from 'date-fns'; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					@Injectable() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					export class InfoService { | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -28,6 +30,10 @@ export class InfoService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      globalPermissions.push(permissions.enableSocialLogin); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if (this.configurationService.get('ENABLE_FEATURE_STATISTICS')) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      globalPermissions.push(permissions.enableStatistics); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      globalPermissions.push(permissions.enableSubscription); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -37,7 +43,8 @@ export class InfoService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      platforms, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      currencies: Object.values(Currency), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      demoAuthToken: this.getDemoAuthToken(), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      lastDataGathering: await this.getLastDataGathering() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      lastDataGathering: await this.getLastDataGathering(), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      statistics: await this.getStatistics() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -54,4 +61,67 @@ export class InfoService { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return lastDataGathering?.value ? new Date(lastDataGathering.value) : null; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  private async getStatistics() { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if (!this.configurationService.get('ENABLE_FEATURE_STATISTICS')) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      return undefined; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    const activeUsers1d = await this.countActiveUsers(1); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    const activeUsers30d = await this.countActiveUsers(30); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    const gitHubStargazers = await this.countGitHubStargazers(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      activeUsers1d, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      activeUsers30d, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      gitHubStargazers | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  private async countActiveUsers(aDays: number) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return await this.prisma.user.count({ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      orderBy: { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        Analytics: { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          updatedAt: 'desc' | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      where: { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        AND: [ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            NOT: { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					              Analytics: null | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          }, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            Analytics: { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					              updatedAt: { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                gt: subDays(new Date(), aDays) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					              } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        ] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  private async countGitHubStargazers(): Promise<number> { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    try { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      const get = bent( | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        `https://api.github.com/repos/ghostfolio/ghostfolio`, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        'GET', | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        'json', | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        200, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					          'User-Agent': 'request' | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      const { stargazers_count } = await get(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      return stargazers_count; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } catch (error) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      console.error(error); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					      return undefined; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					  } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
					 | 
				
				 | 
				
					
  |