Browse Source
Feature/add user id to tag database schema (#3837)
* Add user id to tag database schema
* Update changelog
pull/3838/head
Thomas Kaul
4 months ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with
71 additions and
20 deletions
-
CHANGELOG.md
-
apps/api/src/app/info/info.service.ts
-
apps/api/src/app/platform/platform.controller.ts
-
apps/api/src/app/tag/tag.controller.ts
-
apps/api/src/app/tag/tag.service.ts
-
apps/api/src/app/user/user.service.ts
-
apps/api/src/services/tag/tag.service.ts
-
apps/client/src/app/components/admin-platform/admin-platform.component.ts
-
apps/client/src/app/components/admin-tag/admin-tag.component.html
-
apps/client/src/app/components/admin-tag/admin-tag.component.ts
-
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts
-
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
-
libs/common/src/lib/permissions.ts
-
package.json
-
prisma/migrations/20240928171744_added_user_to_tag/migration.sql
-
prisma/schema.prisma
|
|
@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 |
|
|
|
|
|
|
|
## Unreleased |
|
|
|
|
|
|
|
### Added |
|
|
|
|
|
|
|
- Added read `permissions` to the `Platform` model |
|
|
|
- Added read `permissions` to the `Tag` model |
|
|
|
- Added `userId` to the `Tag` database schema |
|
|
|
|
|
|
|
### Changed |
|
|
|
|
|
|
|
- Considered the availability of the date range selector in the assistant per view |
|
|
@ -17,6 +23,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 |
|
|
|
- Upgraded `prisma` from version `5.19.1` to `5.20.0` |
|
|
|
- Upgraded `webpack-bundle-analyzer` from version `4.10.1` to `4.10.2` |
|
|
|
|
|
|
|
### Fixed |
|
|
|
|
|
|
|
- Fixed the content height of the create or update platform dialog in the admin control |
|
|
|
- Fixed the content height of the create or update tag dialog in the admin control |
|
|
|
|
|
|
|
## 2.110.0 - 2024-09-24 |
|
|
|
|
|
|
|
### Changed |
|
|
|
|
|
@ -114,7 +114,7 @@ export class InfoService { |
|
|
|
}), |
|
|
|
this.getStatistics(), |
|
|
|
this.getSubscriptions(), |
|
|
|
this.tagService.get() |
|
|
|
this.tagService.getPublic() |
|
|
|
]); |
|
|
|
|
|
|
|
if (isUserSignupEnabled) { |
|
|
|
|
|
@ -26,6 +26,7 @@ export class PlatformController { |
|
|
|
public constructor(private readonly platformService: PlatformService) {} |
|
|
|
|
|
|
|
@Get() |
|
|
|
@HasPermission(permissions.readPlatforms) |
|
|
|
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) |
|
|
|
public async getPlatforms() { |
|
|
|
return this.platformService.getPlatformsWithAccountCount(); |
|
|
|
|
|
@ -26,6 +26,7 @@ export class TagController { |
|
|
|
public constructor(private readonly tagService: TagService) {} |
|
|
|
|
|
|
|
@Get() |
|
|
|
@HasPermission(permissions.readTags) |
|
|
|
@UseGuards(AuthGuard('jwt'), HasPermissionGuard) |
|
|
|
public async getTags() { |
|
|
|
return this.tagService.getTagsWithActivityCount(); |
|
|
|
|
|
@ -56,10 +56,11 @@ export class TagService { |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
return tagsWithOrderCount.map(({ _count, id, name }) => { |
|
|
|
return tagsWithOrderCount.map(({ _count, id, name, userId }) => { |
|
|
|
return { |
|
|
|
id, |
|
|
|
name, |
|
|
|
userId, |
|
|
|
activityCount: _count.orders |
|
|
|
}; |
|
|
|
}); |
|
|
|
|
|
@ -70,7 +70,7 @@ export class UserService { |
|
|
|
}, |
|
|
|
where: { userId: id } |
|
|
|
}), |
|
|
|
this.tagService.getByUser(id) |
|
|
|
this.tagService.getInUseByUser(id) |
|
|
|
]); |
|
|
|
|
|
|
|
let systemMessage: SystemMessage; |
|
|
|
|
|
@ -6,15 +6,18 @@ import { Injectable } from '@nestjs/common'; |
|
|
|
export class TagService { |
|
|
|
public constructor(private readonly prismaService: PrismaService) {} |
|
|
|
|
|
|
|
public async get() { |
|
|
|
public async getPublic() { |
|
|
|
return this.prismaService.tag.findMany({ |
|
|
|
orderBy: { |
|
|
|
name: 'asc' |
|
|
|
}, |
|
|
|
where: { |
|
|
|
userId: null |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
public async getByUser(userId: string) { |
|
|
|
public async getInUseByUser(userId: string) { |
|
|
|
return this.prismaService.tag.findMany({ |
|
|
|
orderBy: { |
|
|
|
name: 'asc' |
|
|
|
|
|
@ -139,7 +139,7 @@ export class AdminPlatformComponent implements OnInit, OnDestroy { |
|
|
|
url: null |
|
|
|
} |
|
|
|
}, |
|
|
|
height: this.deviceType === 'mobile' ? '97.5vh' : '80vh', |
|
|
|
height: this.deviceType === 'mobile' ? '97.5vh' : undefined, |
|
|
|
width: this.deviceType === 'mobile' ? '100vw' : '50rem' |
|
|
|
}); |
|
|
|
|
|
|
@ -176,7 +176,7 @@ export class AdminPlatformComponent implements OnInit, OnDestroy { |
|
|
|
url |
|
|
|
} |
|
|
|
}, |
|
|
|
height: this.deviceType === 'mobile' ? '97.5vh' : '80vh', |
|
|
|
height: this.deviceType === 'mobile' ? '97.5vh' : undefined, |
|
|
|
width: this.deviceType === 'mobile' ? '100vw' : '50rem' |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
@ -34,6 +34,20 @@ |
|
|
|
</td> |
|
|
|
</ng-container> |
|
|
|
|
|
|
|
<ng-container matColumnDef="userId"> |
|
|
|
<th |
|
|
|
*matHeaderCellDef |
|
|
|
class="px-1" |
|
|
|
mat-header-cell |
|
|
|
mat-sort-header="userId" |
|
|
|
> |
|
|
|
<ng-container i18n>User</ng-container> |
|
|
|
</th> |
|
|
|
<td *matCellDef="let element" class="px-1" mat-cell> |
|
|
|
<span class="text-monospace">{{ element.userId }}</span> |
|
|
|
</td> |
|
|
|
</ng-container> |
|
|
|
|
|
|
|
<ng-container matColumnDef="activities"> |
|
|
|
<th |
|
|
|
*matHeaderCellDef |
|
|
|
|
|
@ -36,7 +36,7 @@ export class AdminTagComponent implements OnInit, OnDestroy { |
|
|
|
|
|
|
|
public dataSource: MatTableDataSource<Tag> = new MatTableDataSource(); |
|
|
|
public deviceType: string; |
|
|
|
public displayedColumns = ['name', 'activities', 'actions']; |
|
|
|
public displayedColumns = ['name', 'userId', 'activities', 'actions']; |
|
|
|
public tags: Tag[]; |
|
|
|
|
|
|
|
private unsubscribeSubject = new Subject<void>(); |
|
|
@ -138,7 +138,7 @@ export class AdminTagComponent implements OnInit, OnDestroy { |
|
|
|
name: null |
|
|
|
} |
|
|
|
}, |
|
|
|
height: this.deviceType === 'mobile' ? '97.5vh' : '80vh', |
|
|
|
height: this.deviceType === 'mobile' ? '97.5vh' : undefined, |
|
|
|
width: this.deviceType === 'mobile' ? '100vw' : '50rem' |
|
|
|
}); |
|
|
|
|
|
|
@ -174,7 +174,7 @@ export class AdminTagComponent implements OnInit, OnDestroy { |
|
|
|
name |
|
|
|
} |
|
|
|
}, |
|
|
|
height: this.deviceType === 'mobile' ? '97.5vh' : '80vh', |
|
|
|
height: this.deviceType === 'mobile' ? '97.5vh' : undefined, |
|
|
|
width: this.deviceType === 'mobile' ? '100vw' : '50rem' |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
@ -158,10 +158,10 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { |
|
|
|
{ id: this.data.symbol, type: 'SYMBOL' } |
|
|
|
]; |
|
|
|
|
|
|
|
this.tagsAvailable = tags.map(({ id, name }) => { |
|
|
|
this.tagsAvailable = tags.map((tag) => { |
|
|
|
return { |
|
|
|
id, |
|
|
|
name: translate(name) |
|
|
|
...tag, |
|
|
|
name: translate(tag.name) |
|
|
|
}; |
|
|
|
}); |
|
|
|
|
|
|
@ -320,10 +320,10 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { |
|
|
|
this.sectors = {}; |
|
|
|
this.SymbolProfile = SymbolProfile; |
|
|
|
|
|
|
|
this.tags = tags.map(({ id, name }) => { |
|
|
|
this.tags = tags.map((tag) => { |
|
|
|
return { |
|
|
|
id, |
|
|
|
name: translate(name) |
|
|
|
...tag, |
|
|
|
name: translate(tag.name) |
|
|
|
}; |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
@ -81,10 +81,10 @@ export class CreateOrUpdateActivityDialog implements OnDestroy { |
|
|
|
this.currencies = currencies; |
|
|
|
this.defaultDateFormat = getDateFormatString(this.locale); |
|
|
|
this.platforms = platforms; |
|
|
|
this.tagsAvailable = tags.map(({ id, name }) => { |
|
|
|
this.tagsAvailable = tags.map((tag) => { |
|
|
|
return { |
|
|
|
id, |
|
|
|
name: translate(name) |
|
|
|
...tag, |
|
|
|
name: translate(tag.name) |
|
|
|
}; |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
@ -31,6 +31,8 @@ export const permissions = { |
|
|
|
enableSubscriptionInterstitial: 'enableSubscriptionInterstitial', |
|
|
|
enableSystemMessage: 'enableSystemMessage', |
|
|
|
impersonateAllUsers: 'impersonateAllUsers', |
|
|
|
readPlatforms: 'readPlatforms', |
|
|
|
readTags: 'readTags', |
|
|
|
reportDataGlitch: 'reportDataGlitch', |
|
|
|
toggleReadOnlyMode: 'toggleReadOnlyMode', |
|
|
|
updateAccount: 'updateAccount', |
|
|
@ -64,6 +66,8 @@ export function getPermissions(aRole: Role): string[] { |
|
|
|
permissions.deletePlatform, |
|
|
|
permissions.deleteTag, |
|
|
|
permissions.deleteUser, |
|
|
|
permissions.readPlatforms, |
|
|
|
permissions.readTags, |
|
|
|
permissions.updateAccount, |
|
|
|
permissions.updateAuthDevice, |
|
|
|
permissions.updateOrder, |
|
|
|
|
|
@ -37,6 +37,7 @@ |
|
|
|
"ng": "nx", |
|
|
|
"nx": "nx", |
|
|
|
"postinstall": "prisma generate", |
|
|
|
"prisma": "prisma", |
|
|
|
"replace-placeholders-in-build": "node ./replace.build.js", |
|
|
|
"start": "node dist/apps/api/main", |
|
|
|
"start:client": "nx run client:copy-assets && nx run client:serve --configuration=development-en --hmr -o", |
|
|
|
|
|
@ -0,0 +1,11 @@ |
|
|
|
-- DropIndex |
|
|
|
DROP INDEX "Tag_name_key"; |
|
|
|
|
|
|
|
-- AlterTable |
|
|
|
ALTER TABLE "Tag" ADD COLUMN "userId" TEXT; |
|
|
|
|
|
|
|
-- CreateIndex |
|
|
|
CREATE UNIQUE INDEX "Tag_name_userId_key" ON "Tag"("name", "userId"); |
|
|
|
|
|
|
|
-- AddForeignKey |
|
|
|
ALTER TABLE "Tag" ADD CONSTRAINT "Tag_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; |
|
|
@ -213,9 +213,12 @@ model Subscription { |
|
|
|
|
|
|
|
model Tag { |
|
|
|
id String @id @default(uuid()) |
|
|
|
name String @unique |
|
|
|
name String |
|
|
|
orders Order[] |
|
|
|
userId String? |
|
|
|
User User? @relation(fields: [userId], onDelete: Cascade, references: [id]) |
|
|
|
|
|
|
|
@@unique([name, userId]) |
|
|
|
@@index([name]) |
|
|
|
} |
|
|
|
|
|
|
@ -236,6 +239,7 @@ model User { |
|
|
|
Order Order[] |
|
|
|
Settings Settings? |
|
|
|
Subscription Subscription[] |
|
|
|
Tag Tag[] |
|
|
|
|
|
|
|
@@index([accessToken]) |
|
|
|
@@index([createdAt]) |
|
|
|