diff --git a/src/app/core/chat/entity/member.ts b/src/app/core/chat/entity/member.ts index e69de29bb..d45a45199 100644 --- a/src/app/core/chat/entity/member.ts +++ b/src/app/core/chat/entity/member.ts @@ -0,0 +1,33 @@ +import { z } from "zod"; + +export const MemberEntitySchema = z.object({ + $roomIdUserId: z.string().optional(), + id: z.string().optional(), // useless + roomId: z.string(), + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string(), + userPhoto: z.string().nullable(), + joinAt: z.string(), + status: z.string().optional(), // useless + isAdmin: z.boolean() +}) + +export type IMember = z.infer + + +export class MemberEntity implements IMember { + id: typeof MemberEntitySchema._type.id + roomId: typeof MemberEntitySchema._type.roomId + wxUserId: typeof MemberEntitySchema._type.wxUserId + wxFullName: typeof MemberEntitySchema._type.wxFullName + wxeMail: typeof MemberEntitySchema._type.wxeMail + userPhoto: typeof MemberEntitySchema._type.userPhoto + joinAt: typeof MemberEntitySchema._type.joinAt + status: typeof MemberEntitySchema._type.status + isAdmin: typeof MemberEntitySchema._type.isAdmin + + hasPhoto() { + return typeof this.userPhoto == 'string' + } +} diff --git a/src/app/core/chat/repository/user-photo/user-photo-remote-repository.ts b/src/app/core/chat/repository/user-photo/user-photo-remote-repository.ts new file mode 100644 index 000000000..9e20ffa80 --- /dev/null +++ b/src/app/core/chat/repository/user-photo/user-photo-remote-repository.ts @@ -0,0 +1,13 @@ +import { HttpResult, IHttPReturn } from "src/app/infra/http/type" +import { UserPhotoGetByIdInputSchema } from "src/app/module/chat/domain/use-case/user-photo/user-photo-get-by-id-use-case.service" +import { z } from "zod" + +export const IGetUserPhotoByAttachmentIdInputSchema = z.object({ + attachmentId: z.string(), +}) + +export type IGetUserPhotoByAttachmentId = z.infer + +export abstract class IUserPhotoRemoteRepository { + abstract getUserPhotoByAttachmentId(input: IGetUserPhotoByAttachmentId): IHttPReturn +} diff --git a/src/app/infra/database/dexie/instance/chat/schema/user-foto.ts b/src/app/infra/database/dexie/instance/chat/schema/user-foto.ts index fff41734b..047a4cb65 100644 --- a/src/app/infra/database/dexie/instance/chat/schema/user-foto.ts +++ b/src/app/infra/database/dexie/instance/chat/schema/user-foto.ts @@ -2,9 +2,9 @@ import { EntityTable } from 'Dexie'; import { z } from 'zod'; export const UserPhotoTableSchema = z.object({ - wxUserId: z.string(), - blob: z.instanceof(Blob), - attachmentId: z.string() + wxUserId: z.number(), + file: z.string(), + attachmentId: z.string().nullable() }) export type UserPhotoTable = z.infer diff --git a/src/app/infra/database/dexie/service.ts b/src/app/infra/database/dexie/service.ts index c36720a2c..297d37994 100644 --- a/src/app/infra/database/dexie/service.ts +++ b/src/app/infra/database/dexie/service.ts @@ -36,7 +36,7 @@ chatDatabase.version(1).stores({ attachment: AttachmentTableColumn, distribution: DistributionTableColumn, bold:BoldTableColumn, - userPhotoTable: UserPhotoTableColumn + userPhoto: UserPhotoTableColumn }); chatDatabase.message.mapToClass(MessageEntity) diff --git a/src/app/infra/http/type.ts b/src/app/infra/http/type.ts index 072e888b4..cae486b71 100644 --- a/src/app/infra/http/type.ts +++ b/src/app/infra/http/type.ts @@ -1,4 +1,5 @@ -import { HttpHeaders, HttpParams } from '@angular/common/http'; +import { HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http'; +import { Result } from 'neverthrow'; export interface Options { headers?: HttpHeaders @@ -12,3 +13,5 @@ export interface HttpResult { url: string; method: string } + +export type IHttPReturn = Promise, HttpErrorResponse>> \ No newline at end of file diff --git a/src/app/module/chat/chat.module.ts b/src/app/module/chat/chat.module.ts index aff0dca43..7918f9ea4 100644 --- a/src/app/module/chat/chat.module.ts +++ b/src/app/module/chat/chat.module.ts @@ -37,6 +37,10 @@ import { DistributionService } from './domain/service/distribution.service' import { BoldLocalRepository } from './data/repository/bold/bold-local-repository'; import { IBoldLocalRepository } from 'src/app/core/chat/repository/bold/bold-local-repository'; import { RoomLastMessageService } from 'src/app/module/chat/domain/service/room-last-message.service' +import { IUserPhotoLocalRepository } from 'src/app/core/chat/repository/user-photo/user-photo-local-repository'; +import { UserPhotoLocalRepository } from './data/repository/user-foto/user-photo-local-repository.service'; +import { IUserPhotoRemoteRepository } from 'src/app/core/chat/repository/user-photo/user-photo-remote-repository'; +import { UserPhotoRemoteRepositoryService } from './data/repository/user-foto/user-photo-remote-repository.service'; @NgModule({ imports: [HttpModule], providers: [ @@ -100,6 +104,16 @@ import { RoomLastMessageService } from 'src/app/module/chat/domain/service/room- { provide: IBoldLocalRepository, useClass: BoldLocalRepository + }, + // user-photo + { + provide: IUserPhotoLocalRepository, + useClass: UserPhotoLocalRepository + }, + // + { + provide: IUserPhotoRemoteRepository, + useClass: UserPhotoRemoteRepositoryService } ], declarations: [], diff --git a/src/app/module/chat/data/repository/user-foto/user-photo-local-repository.service.ts b/src/app/module/chat/data/repository/user-foto/user-photo-local-repository.service.ts new file mode 100644 index 000000000..4a9f9ef38 --- /dev/null +++ b/src/app/module/chat/data/repository/user-foto/user-photo-local-repository.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core'; +import Dexie, { PromiseExtended } from 'Dexie'; +import { IUserPhotoLocalRepository } from 'src/app/core/chat/repository/user-photo/user-photo-local-repository'; +import { UserPhotoTable, UserPhotoTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/user-foto'; +import { chatDatabase } from 'src/app/infra/database/dexie/service'; +import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; + +@Injectable({ + providedIn: 'root' +}) +export class UserPhotoLocalRepository extends DexieRepository implements IUserPhotoLocalRepository { + constructor() { + super(chatDatabase.userPhoto, UserPhotoTableSchema) + } +} diff --git a/src/app/module/chat/data/repository/user-foto/user-photo-remote-repository.service.spec.ts b/src/app/module/chat/data/repository/user-foto/user-photo-remote-repository.service.spec.ts deleted file mode 100644 index 3d52cfe7a..000000000 --- a/src/app/module/chat/data/repository/user-foto/user-photo-remote-repository.service.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { TestBed } from '@angular/core/testing'; - -import { UserPhotoRemoteRepositoryService } from './user-photo-remote-repository.service'; - -describe('UserPhotoRemoteRepositoryService', () => { - let service: UserPhotoRemoteRepositoryService; - - beforeEach(() => { - TestBed.configureTestingModule({}); - service = TestBed.inject(UserPhotoRemoteRepositoryService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); -}); diff --git a/src/app/module/chat/data/repository/user-foto/user-photo-remote-repository.service.ts b/src/app/module/chat/data/repository/user-foto/user-photo-remote-repository.service.ts index 437316670..5cf6e3fd4 100644 --- a/src/app/module/chat/data/repository/user-foto/user-photo-remote-repository.service.ts +++ b/src/app/module/chat/data/repository/user-foto/user-photo-remote-repository.service.ts @@ -1,15 +1,24 @@ import { Injectable } from '@angular/core'; -import Dexie, { PromiseExtended } from 'Dexie'; -import { IUserPhotoLocalRepository } from 'src/app/core/chat/repository/user-photo/user-photo-local-repository'; -import { UserPhotoTable, UserPhotoTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/user-foto'; -import { chatDatabase } from 'src/app/infra/database/dexie/service'; -import { DexieRepository } from 'src/app/infra/repository/dexie/dexie-repository.service'; +import { IGetUserPhotoByAttachmentId, IGetUserPhotoByAttachmentIdInputSchema, IUserPhotoRemoteRepository } from 'src/app/core/chat/repository/user-photo/user-photo-remote-repository'; +import { HttpAdapter } from 'src/app/infra/http/adapter'; +import { SafeValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; +import { environment } from 'src/environments/environment'; +import { z } from 'zod'; @Injectable({ providedIn: 'root' }) -export class UserPhotoRemoteRepository extends DexieRepository implements IUserPhotoLocalRepository { - constructor() { - super(chatDatabase.userPhoto, UserPhotoTableSchema) +export class UserPhotoRemoteRepositoryService implements IUserPhotoRemoteRepository{ + + constructor( + private http: HttpAdapter + ) { } + + @SafeValidateSchema(IGetUserPhotoByAttachmentIdInputSchema, 'GET/UserAuthentication/GetPhoto?UserPhoto=') + getUserPhotoByAttachmentId(input: IGetUserPhotoByAttachmentId) { + const geturl = environment.apiURL + `UserAuthentication/GetPhoto?UserPhoto=${input.attachmentId}`; + + return this.http.get(geturl) } + } diff --git a/src/app/module/chat/domain/chat-service.service.ts b/src/app/module/chat/domain/chat-service.service.ts index 7b1955bd7..36f3c8048 100644 --- a/src/app/module/chat/domain/chat-service.service.ts +++ b/src/app/module/chat/domain/chat-service.service.ts @@ -41,7 +41,8 @@ import { MessageMarkAsReadInput } from "src/app/module/chat/domain/use-case/mess import { BoldRemoveByRoomIdInput, BoldRemoveByRoomIdService } from 'src/app/module/chat/domain/use-case/bold/bold-remove-by-room-id.service'; import { MemberListHttpSyncUseCase } from 'src/app/module/chat/domain/use-case/member/member-list-http-sync-use-case.ts.service' import { RoomBoldSyncUseCaseService } from 'src/app/module/chat/domain/use-case/room/room-bold-sync-use-case.service' -import { RoomSetLastMessageService } from 'src/app/module/chat/domain/use-case/room/room-set-last-message.service' +import { RoomSetLastMessageService } from 'src/app/module/chat/domain/use-case/room/room-set-last-message.service'; +import { IUserPhotoGetByIdInput, UserPhotoGetByIdUseCase } from 'src/app/module/chat/domain/use-case/user-photo/user-photo-get-by-id-use-case.service' export const InstanceId = uuidv4(); @Injectable({ @@ -84,7 +85,8 @@ export class ChatServiceService { private BoldRemoveByRoomIdService: BoldRemoveByRoomIdService, private MemberListHttpSyncUseCase: MemberListHttpSyncUseCase, // dont remove private RoomBoldSyncUseCaseService: RoomBoldSyncUseCaseService, // dont remove - private RoomSetLastMessageService: RoomSetLastMessageService // dont remove + private RoomSetLastMessageService: RoomSetLastMessageService, // dont remove + private UserPhotoGetByIdUseCase: UserPhotoGetByIdUseCase ) { this.MessageSocketRepositoryService.listenToDeleteMessages() .pipe() @@ -155,6 +157,10 @@ export class ChatServiceService { return this.MessageDeleteLiveUseCaseService.execute(params) } + getUserPhoto(input: IUserPhotoGetByIdInput) { + return this.UserPhotoGetByIdUseCase.execute(input) + } + reactToMessage(input: MessageReactionInput) { return this.MessageReactionUseCaseService.execute(input); } diff --git a/src/app/module/chat/domain/use-case/user-photo/user-photo-get-by-id-use-case.service.ts b/src/app/module/chat/domain/use-case/user-photo/user-photo-get-by-id-use-case.service.ts new file mode 100644 index 000000000..c1b5b62e3 --- /dev/null +++ b/src/app/module/chat/domain/use-case/user-photo/user-photo-get-by-id-use-case.service.ts @@ -0,0 +1,49 @@ +import { Injectable } from '@angular/core'; +import { IUserPhotoLocalRepository } from 'src/app/core/chat/repository/user-photo/user-photo-local-repository'; +import { IUserPhotoRemoteRepository } from 'src/app/core/chat/repository/user-photo/user-photo-remote-repository'; +import { UserPhotoTableSchema } from 'src/app/infra/database/dexie/instance/chat/schema/user-foto'; +import { z } from 'zod'; + +export const UserPhotoGetByIdInputSchema = UserPhotoTableSchema.pick({ + attachmentId: true, + wxUserId: true, +}) + +export type IUserPhotoGetByIdInput = z.infer + +@Injectable({ + providedIn: 'root' +}) +export class UserPhotoGetByIdUseCase { + + constructor( + private userPhotoLocalRepository: IUserPhotoLocalRepository, + private userPhotoRemoteRepository: IUserPhotoRemoteRepository + ) { } + + async execute(input: IUserPhotoGetByIdInput) { + + const result = await this.userPhotoLocalRepository.findOne({wxUserId: input.wxUserId}) + if(result.isOk() && result.value) { + return result.map(e => { + return e.file + }) + } else if(result.isOk() && !result.value) { + const remoteResult = await this.userPhotoRemoteRepository.getUserPhotoByAttachmentId({attachmentId: input.attachmentId}) + + if(remoteResult.isOk()) { + this.userPhotoLocalRepository.insert({ + wxUserId: input.wxUserId, + file: remoteResult.value.data, + attachmentId: input.attachmentId + }) + } + + return remoteResult.map(e => { + return e.data + }) + + } + + } +} diff --git a/src/app/ui/chat/chat.page.ts b/src/app/ui/chat/chat.page.ts index d9fa0a0f2..81a06155a 100644 --- a/src/app/ui/chat/chat.page.ts +++ b/src/app/ui/chat/chat.page.ts @@ -71,9 +71,6 @@ export class ChatPage implements OnInit { RoomSelected!: RoomViewModel; - private worker: SharedWorker; - private port: MessagePort; - constructor( private modalController: ModalController, private timeService: TimeService, @@ -105,25 +102,9 @@ export class ChatPage implements OnInit { this.boldTable = distributionObject }) - this.worker = new SharedWorker('shared-worker.js'); - // this.worker.port.start() - this.port = this.worker.port; - - this.port.onmessage = (event) => { - console.log('Received from worker:', event.data); - } - - //this.port.postMessage('hello'); } - // Method to update the room list - // updateRoomList(newRoomList: { id: string, name: string }[]): void { - // this.roomListSubject.next(newRoomList); - // } - // Fetch all items using useLiveQuery - - updatemessage(sortedRooms) { this.rooms = sortedRooms @@ -358,7 +339,6 @@ export class ChatPage implements OnInit { openMessagesPage(roomId) { - this.port.postMessage('hello'); // this.chatService.refreshtoken(); this.roomId = roomId; this.RoomSelected = this.rooms.filter(e => e.id == roomId)[0] diff --git a/src/app/ui/chat/component/messages/messages.page.html b/src/app/ui/chat/component/messages/messages.page.html index 54d1a2610..c6a415fec 100644 --- a/src/app/ui/chat/component/messages/messages.page.html +++ b/src/app/ui/chat/component/messages/messages.page.html @@ -9,7 +9,7 @@
-