Feature/add user id to tag database schema (#3837)
* Add user id to tag database schema * Update changelog
This commit is contained in:
parent
e8f0d2bb14
commit
85cc72627b
11
CHANGELOG.md
11
CHANGELOG.md
@ -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])
|
||||
|
Loading…
x
Reference in New Issue
Block a user