mirror of
https://github.com/immich-app/immich.git
synced 2025-02-11 01:18:24 -05:00
feat(server): asset_user table
This commit is contained in:
parent
da580d4685
commit
7277ea3d7a
5 changed files with 77 additions and 14 deletions
28
server/src/db.d.ts
vendored
28
server/src/db.d.ts
vendored
|
@ -3,21 +3,16 @@
|
||||||
* Please do not edit it manually.
|
* Please do not edit it manually.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type { ColumnType } from "kysely";
|
import type { ColumnType } from 'kysely';
|
||||||
|
|
||||||
export type ArrayType<T> = ArrayTypeImpl<T> extends (infer U)[]
|
export type ArrayType<T> = ArrayTypeImpl<T> extends (infer U)[] ? U[] : ArrayTypeImpl<T>;
|
||||||
? U[]
|
|
||||||
: ArrayTypeImpl<T>;
|
|
||||||
|
|
||||||
export type ArrayTypeImpl<T> = T extends ColumnType<infer S, infer I, infer U>
|
export type ArrayTypeImpl<T> = T extends ColumnType<infer S, infer I, infer U> ? ColumnType<S[], I[], U[]> : T[];
|
||||||
? ColumnType<S[], I[], U[]>
|
|
||||||
: T[];
|
|
||||||
|
|
||||||
export type AssetsStatusEnum = "active" | "deleted" | "trashed";
|
export type AssetsStatusEnum = 'active' | 'deleted' | 'trashed';
|
||||||
|
|
||||||
export type Generated<T> = T extends ColumnType<infer S, infer I, infer U>
|
export type Generated<T> =
|
||||||
? ColumnType<S, I | undefined, U>
|
T extends ColumnType<infer S, infer I, infer U> ? ColumnType<S, I | undefined, U> : ColumnType<T, T | undefined, T>;
|
||||||
: ColumnType<T, T | undefined, T>;
|
|
||||||
|
|
||||||
export type Int8 = ColumnType<string, bigint | number | string, bigint | number | string>;
|
export type Int8 = ColumnType<string, bigint | number | string, bigint | number | string>;
|
||||||
|
|
||||||
|
@ -33,7 +28,7 @@ export type JsonPrimitive = boolean | number | string | null;
|
||||||
|
|
||||||
export type JsonValue = JsonArray | JsonObject | JsonPrimitive;
|
export type JsonValue = JsonArray | JsonObject | JsonPrimitive;
|
||||||
|
|
||||||
export type Sourcetype = "exif" | "machine-learning";
|
export type Sourcetype = 'exif' | 'machine-learning';
|
||||||
|
|
||||||
export type Timestamp = ColumnType<Date, Date | string, Date | string>;
|
export type Timestamp = ColumnType<Date, Date | string, Date | string>;
|
||||||
|
|
||||||
|
@ -154,6 +149,12 @@ export interface AssetStack {
|
||||||
primaryAssetId: string;
|
primaryAssetId: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface AssetUser {
|
||||||
|
assetId: string;
|
||||||
|
createdAt: Timestamp;
|
||||||
|
userId: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface Audit {
|
export interface Audit {
|
||||||
action: string;
|
action: string;
|
||||||
createdAt: Generated<Timestamp>;
|
createdAt: Generated<Timestamp>;
|
||||||
|
@ -413,6 +414,7 @@ export interface DB {
|
||||||
asset_files: AssetFiles;
|
asset_files: AssetFiles;
|
||||||
asset_job_status: AssetJobStatus;
|
asset_job_status: AssetJobStatus;
|
||||||
asset_stack: AssetStack;
|
asset_stack: AssetStack;
|
||||||
|
asset_user: AssetUser;
|
||||||
assets: Assets;
|
assets: Assets;
|
||||||
audit: Audit;
|
audit: Audit;
|
||||||
exif: Exif;
|
exif: Exif;
|
||||||
|
@ -438,6 +440,6 @@ export interface DB {
|
||||||
tags_closure: TagsClosure;
|
tags_closure: TagsClosure;
|
||||||
user_metadata: UserMetadata;
|
user_metadata: UserMetadata;
|
||||||
users: Users;
|
users: Users;
|
||||||
"vectors.pg_vector_index_stat": VectorsPgVectorIndexStat;
|
'vectors.pg_vector_index_stat': VectorsPgVectorIndexStat;
|
||||||
version_history: VersionHistory;
|
version_history: VersionHistory;
|
||||||
}
|
}
|
||||||
|
|
22
server/src/entities/asset-user.entity.ts
Normal file
22
server/src/entities/asset-user.entity.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import { AssetEntity } from 'src/entities/asset.entity';
|
||||||
|
import { UserEntity } from 'src/entities/user.entity';
|
||||||
|
import { Column, Entity, Index, ManyToOne, PrimaryColumn } from 'typeorm';
|
||||||
|
|
||||||
|
@Entity('asset_user')
|
||||||
|
@Index('IDX_assetId_userId', ['assetId', 'userId'])
|
||||||
|
export class AssetUserEntity {
|
||||||
|
@PrimaryColumn()
|
||||||
|
assetId!: string;
|
||||||
|
|
||||||
|
@ManyToOne(() => AssetEntity, { onDelete: 'CASCADE', onUpdate: 'CASCADE', nullable: false })
|
||||||
|
asset!: AssetEntity;
|
||||||
|
|
||||||
|
@PrimaryColumn()
|
||||||
|
userId!: string;
|
||||||
|
|
||||||
|
@ManyToOne(() => UserEntity, { onDelete: 'CASCADE', onUpdate: 'CASCADE', nullable: false })
|
||||||
|
user!: UserEntity;
|
||||||
|
|
||||||
|
@Column()
|
||||||
|
createdAt!: Date;
|
||||||
|
}
|
|
@ -5,6 +5,7 @@ import { APIKeyEntity } from 'src/entities/api-key.entity';
|
||||||
import { AssetFaceEntity } from 'src/entities/asset-face.entity';
|
import { AssetFaceEntity } from 'src/entities/asset-face.entity';
|
||||||
import { AssetFileEntity } from 'src/entities/asset-files.entity';
|
import { AssetFileEntity } from 'src/entities/asset-files.entity';
|
||||||
import { AssetJobStatusEntity } from 'src/entities/asset-job-status.entity';
|
import { AssetJobStatusEntity } from 'src/entities/asset-job-status.entity';
|
||||||
|
import { AssetUserEntity } from 'src/entities/asset-user.entity';
|
||||||
import { AssetEntity } from 'src/entities/asset.entity';
|
import { AssetEntity } from 'src/entities/asset.entity';
|
||||||
import { AuditEntity } from 'src/entities/audit.entity';
|
import { AuditEntity } from 'src/entities/audit.entity';
|
||||||
import { ExifEntity } from 'src/entities/exif.entity';
|
import { ExifEntity } from 'src/entities/exif.entity';
|
||||||
|
@ -34,6 +35,7 @@ export const entities = [
|
||||||
AssetEntity,
|
AssetEntity,
|
||||||
AssetFaceEntity,
|
AssetFaceEntity,
|
||||||
AssetFileEntity,
|
AssetFileEntity,
|
||||||
|
AssetUserEntity,
|
||||||
AssetJobStatusEntity,
|
AssetJobStatusEntity,
|
||||||
AuditEntity,
|
AuditEntity,
|
||||||
ExifEntity,
|
ExifEntity,
|
||||||
|
|
20
server/src/migrations/1738099775096-AddAssetUserTable.ts
Normal file
20
server/src/migrations/1738099775096-AddAssetUserTable.ts
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||||
|
|
||||||
|
export class AddAssetUserTable1738099775096 implements MigrationInterface {
|
||||||
|
name = 'AddAssetUserTable1738099775096'
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`CREATE TABLE "asset_user" ("assetId" uuid NOT NULL, "userId" uuid NOT NULL, "createdAt" TIMESTAMP NOT NULL, CONSTRAINT "PK_f3d7f17ab93d60e007282726058" PRIMARY KEY ("assetId", "userId"))`);
|
||||||
|
await queryRunner.query(`CREATE INDEX "IDX_assetId_userId" ON "asset_user" ("assetId", "userId") `);
|
||||||
|
await queryRunner.query(`ALTER TABLE "asset_user" ADD CONSTRAINT "FK_07c8478e0936e78b553aaeceedb" FOREIGN KEY ("assetId") REFERENCES "assets"("id") ON DELETE CASCADE ON UPDATE CASCADE`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "asset_user" ADD CONSTRAINT "FK_85e2ef24493bdf649dfdfb769a2" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE`);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.query(`ALTER TABLE "asset_user" DROP CONSTRAINT "FK_85e2ef24493bdf649dfdfb769a2"`);
|
||||||
|
await queryRunner.query(`ALTER TABLE "asset_user" DROP CONSTRAINT "FK_07c8478e0936e78b553aaeceedb"`);
|
||||||
|
await queryRunner.query(`DROP INDEX "public"."IDX_assetId_userId"`);
|
||||||
|
await queryRunner.query(`DROP TABLE "asset_user"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -81,7 +81,24 @@ export class AssetRepository implements IAssetRepository {
|
||||||
}
|
}
|
||||||
|
|
||||||
create(asset: Insertable<Assets>): Promise<AssetEntity> {
|
create(asset: Insertable<Assets>): Promise<AssetEntity> {
|
||||||
return this.db.insertInto('assets').values(asset).returningAll().executeTakeFirst() as any as Promise<AssetEntity>;
|
return this.db.transaction().execute(async (tx) => {
|
||||||
|
const newAsset = (await tx
|
||||||
|
.insertInto('assets')
|
||||||
|
.values(asset)
|
||||||
|
.returningAll()
|
||||||
|
.executeTakeFirst()) as any as AssetEntity;
|
||||||
|
|
||||||
|
await tx
|
||||||
|
.insertInto('asset_user')
|
||||||
|
.values({
|
||||||
|
assetId: newAsset.id,
|
||||||
|
userId: newAsset.ownerId,
|
||||||
|
createdAt: new Date(),
|
||||||
|
})
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
return newAsset;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@GenerateSql({ params: [DummyValue.UUID, { day: 1, month: 1 }] })
|
@GenerateSql({ params: [DummyValue.UUID, { day: 1, month: 1 }] })
|
||||||
|
|
Loading…
Add table
Reference in a new issue