|
|
|
@ -4,9 +4,10 @@ import { locale } from '@ghostfolio/common/config';
|
|
|
|
|
import { resetHours } from '@ghostfolio/common/helper';
|
|
|
|
|
import { User as IUser, UserWithSettings } from '@ghostfolio/common/interfaces';
|
|
|
|
|
import { getPermissions, permissions } from '@ghostfolio/common/permissions';
|
|
|
|
|
import { SubscriptionType } from '@ghostfolio/common/types/subscription.type';
|
|
|
|
|
import { Injectable } from '@nestjs/common';
|
|
|
|
|
import { Currency, Prisma, Provider, User, ViewMode } from '@prisma/client';
|
|
|
|
|
import { add } from 'date-fns';
|
|
|
|
|
import { add, isBefore } from 'date-fns';
|
|
|
|
|
|
|
|
|
|
const crypto = require('crypto');
|
|
|
|
|
|
|
|
|
@ -24,7 +25,8 @@ export class UserService {
|
|
|
|
|
alias,
|
|
|
|
|
id,
|
|
|
|
|
role,
|
|
|
|
|
Settings
|
|
|
|
|
Settings,
|
|
|
|
|
subscription
|
|
|
|
|
}: UserWithSettings): Promise<IUser> {
|
|
|
|
|
const access = await this.prisma.access.findMany({
|
|
|
|
|
include: {
|
|
|
|
@ -43,6 +45,7 @@ export class UserService {
|
|
|
|
|
return {
|
|
|
|
|
alias,
|
|
|
|
|
id,
|
|
|
|
|
subscription,
|
|
|
|
|
access: access.map((accessItem) => {
|
|
|
|
|
return {
|
|
|
|
|
alias: accessItem.User.alias,
|
|
|
|
@ -54,11 +57,7 @@ export class UserService {
|
|
|
|
|
settings: {
|
|
|
|
|
locale,
|
|
|
|
|
baseCurrency: Settings?.currency ?? UserService.DEFAULT_CURRENCY,
|
|
|
|
|
viewMode: Settings.viewMode ?? ViewMode.DEFAULT
|
|
|
|
|
},
|
|
|
|
|
subscription: {
|
|
|
|
|
expiresAt: resetHours(add(new Date(), { days: 7 })),
|
|
|
|
|
type: 'Premium'
|
|
|
|
|
viewMode: Settings?.viewMode ?? ViewMode.DEFAULT
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
@ -66,26 +65,49 @@ export class UserService {
|
|
|
|
|
public async user(
|
|
|
|
|
userWhereUniqueInput: Prisma.UserWhereUniqueInput
|
|
|
|
|
): Promise<UserWithSettings | null> {
|
|
|
|
|
const user = await this.prisma.user.findUnique({
|
|
|
|
|
include: { Account: true, Settings: true },
|
|
|
|
|
const userFromDatabase = await this.prisma.user.findUnique({
|
|
|
|
|
include: { Account: true, Settings: true, Subscription: true },
|
|
|
|
|
where: userWhereUniqueInput
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (user?.Settings) {
|
|
|
|
|
if (!user.Settings.currency) {
|
|
|
|
|
const user: UserWithSettings = userFromDatabase;
|
|
|
|
|
|
|
|
|
|
if (userFromDatabase?.Settings) {
|
|
|
|
|
if (!userFromDatabase.Settings.currency) {
|
|
|
|
|
// Set default currency if needed
|
|
|
|
|
user.Settings.currency = UserService.DEFAULT_CURRENCY;
|
|
|
|
|
userFromDatabase.Settings.currency = UserService.DEFAULT_CURRENCY;
|
|
|
|
|
}
|
|
|
|
|
} else if (user) {
|
|
|
|
|
} else if (userFromDatabase) {
|
|
|
|
|
// Set default settings if needed
|
|
|
|
|
user.Settings = {
|
|
|
|
|
userFromDatabase.Settings = {
|
|
|
|
|
currency: UserService.DEFAULT_CURRENCY,
|
|
|
|
|
updatedAt: new Date(),
|
|
|
|
|
userId: user?.id,
|
|
|
|
|
userId: userFromDatabase?.id,
|
|
|
|
|
viewMode: ViewMode.DEFAULT
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.configurationService.get('ENABLE_FEATURE_SUBSCRIPTION')) {
|
|
|
|
|
if (userFromDatabase?.Subscription?.length > 0) {
|
|
|
|
|
const latestSubscription = userFromDatabase.Subscription.reduce(
|
|
|
|
|
(a, b) => {
|
|
|
|
|
return new Date(a.expiresAt) > new Date(b.expiresAt) ? a : b;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
user.subscription = {
|
|
|
|
|
expiresAt: latestSubscription.expiresAt,
|
|
|
|
|
type: isBefore(new Date(), latestSubscription.expiresAt)
|
|
|
|
|
? SubscriptionType.Premium
|
|
|
|
|
: SubscriptionType.Basic
|
|
|
|
|
};
|
|
|
|
|
} else {
|
|
|
|
|
user.subscription = {
|
|
|
|
|
type: SubscriptionType.Basic
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return user;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|