diff --git a/package-lock.json b/package-lock.json index 2b94937bc..30ff5ce28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -134,6 +134,7 @@ "crypto-js": "^4.0.0", "date-fns": "^2.17.0", "depd": "^2.0.0", + "dexie": "^4.0.7", "dompurify": "^3.0.6", "dotenv": "^10.0.0", "duration": "^0.2.2", @@ -14678,6 +14679,11 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1094867.tgz", "integrity": "sha512-pmMDBKiRVjh0uKK6CT1WqZmM3hBVSgD+N2MrgyV1uNizAZMw4tx6i/RTc+/uCsKSCmg0xXx7arCP/OFcIwTsiQ==" }, + "node_modules/dexie": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/dexie/-/dexie-4.0.7.tgz", + "integrity": "sha512-M+Lo6rk4pekIfrc2T0o2tvVJwL6EAAM/B78DNfb8aaxFVoI1f8/rz5KTxuAnApkwqTSuxx7T5t0RKH7qprapGg==" + }, "node_modules/di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -54906,6 +54912,11 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1094867.tgz", "integrity": "sha512-pmMDBKiRVjh0uKK6CT1WqZmM3hBVSgD+N2MrgyV1uNizAZMw4tx6i/RTc+/uCsKSCmg0xXx7arCP/OFcIwTsiQ==" }, + "dexie": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/dexie/-/dexie-4.0.7.tgz", + "integrity": "sha512-M+Lo6rk4pekIfrc2T0o2tvVJwL6EAAM/B78DNfb8aaxFVoI1f8/rz5KTxuAnApkwqTSuxx7T5t0RKH7qprapGg==" + }, "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", diff --git a/package.json b/package.json index fd3289c9f..bc8a06a70 100644 --- a/package.json +++ b/package.json @@ -150,6 +150,7 @@ "crypto-js": "^4.0.0", "date-fns": "^2.17.0", "depd": "^2.0.0", + "dexie": "^4.0.7", "dompurify": "^3.0.6", "dotenv": "^10.0.0", "duration": "^0.2.2", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index e323446a4..414e5574b 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -96,7 +96,7 @@ import { DeplomaOptionsPageModule } from './shared/popover/deploma-options/deplo import { DiplomaOptionsPage } from './shared/popover/deploma-options/deploma-options.page'; import { ImageCropperModule } from 'ngx-image-cropper'; import { createAction, createReducer, on, StoreModule } from '@ngrx/store'; -import { chatReducer } from './services/Repositorys/chat/data-source/room-memory-data-source'; +import { chatReducer } from './services/Repositorys/chat/data-source/room/room-memory-data-source'; // import { ServiceWorkerModule } from '@angular/service-worker'; // import { AngularFireModule } from '@angular/fire'; // import { AngularFireMessagingModule } from '@angular/fire/messaging'; diff --git a/src/app/pages/chat/chat.page.html b/src/app/pages/chat/chat.page.html index 01bb8d57a..1a7bdf713 100644 --- a/src/app/pages/chat/chat.page.html +++ b/src/app/pages/chat/chat.page.html @@ -15,9 +15,6 @@
-
-

Current Count Object: {{ count$ | async | json }}

+ + + + Conversas + + + Grupos + + + -
-

{{ item.key }}: {{ item.value | json }}

-
- - +
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ {{room.roomName}} +
+
+
+
+
+ +
+ +
+
+
+
+ + +
+ +
+ + +
+
+
+
+

{{group.name.split('-').join(' ')}}

+
+
{{group.duration }}
+
{{group.countDownTime }}
+
+
+
{{group.lastMessage.u.name}} : {{group.lastMessage.msg}}
+
{{group.userThatIsTyping}} está escrever ...
+
+
+
+
+
+
+ + +
-
Current Count: {{ count$ | async }}
- - - - ; + items$!: Observable; constructor( @@ -134,12 +136,13 @@ export class ChatPage implements OnInit { private RochetChatConnectorService: RochetChatConnectorService, private zone: NgZone, public RouteService: RouteService, - private store: Store<{ chat: RoomRemoteDataSourceState }> + private store: Store<{ chat: RoomRemoteDataSourceState }>, + private RoomRepositoryService: RoomRepositoryService ) { this.count$ = store.select('chat'); - this.headers = new HttpHeaders();; + this.headers = new HttpHeaders(); window.onresize = (event) => { if (window.innerWidth > 701) { this.modalController.dismiss(); @@ -159,8 +162,12 @@ export class ChatPage implements OnInit { } + // Fetch all items using useLiveQuery + ngOnInit() { + this.items$ = this.RoomRepositoryService.getItemsLive() + this.segment = "Contactos"; this.authService.userData$.subscribe((res: any) => { diff --git a/src/app/pages/events/events.page.ts b/src/app/pages/events/events.page.ts index 4f55b4ee9..53ecb16d3 100644 --- a/src/app/pages/events/events.page.ts +++ b/src/app/pages/events/events.page.ts @@ -71,7 +71,6 @@ export class EventsPage implements OnInit { agendaColor = '' - filterName: 'Para hoje' | 'Novos'| 'Lidos'| 'Não lidos'| 'OverdueTasks' | 'Todos' = 'Não lidos' showSearch = true; searchSubject: string = ''; @@ -81,7 +80,6 @@ export class EventsPage implements OnInit { delete(): void; } - count$: Observable; constructor( diff --git a/src/app/services/Repositorys/chat/data-source/message/message-remote-data-source.service.ts b/src/app/services/Repositorys/chat/data-source/message/message-remote-data-source.service.ts index 03c2e3d3f..6ff649ca8 100644 --- a/src/app/services/Repositorys/chat/data-source/message/message-remote-data-source.service.ts +++ b/src/app/services/Repositorys/chat/data-source/message/message-remote-data-source.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { HttpService } from 'src/app/services/http.service'; import { MessageOutPutDTO } from '../../dto/message/messageOutputDTO'; import { MessageListInputDTO } from '../../dto/message/messageListInputDTO'; +import { DataSourceReturn } from '../../../type'; @Injectable({ @@ -13,7 +14,6 @@ export class MessageRemoteDataSourceService { constructor(private httpService: HttpService) {} - async sendMessage(message: any) { return await this.httpService.post(`${this.baseUrl}/Messages`, message); } @@ -22,7 +22,7 @@ export class MessageRemoteDataSourceService { return await this.httpService.post(`${this.baseUrl}/Messages/${id}/React`, reaction); } - async getMessagesFromRoom(id: MessageListInputDTO) { - return await this.httpService.get(`${this.baseUrl}/Room/${id}/Messages`); + async getMessagesFromRoom(id: MessageListInputDTO): DataSourceReturn { + return await this.httpService.get(`${this.baseUrl}/Room/${id}/Messages`); } } diff --git a/src/app/services/Repositorys/chat/data-source/room-memory-data-source.ts b/src/app/services/Repositorys/chat/data-source/room/room-memory-data-source.ts similarity index 100% rename from src/app/services/Repositorys/chat/data-source/room-memory-data-source.ts rename to src/app/services/Repositorys/chat/data-source/room/room-memory-data-source.ts diff --git a/src/app/services/Repositorys/chat/data-source/room-remote-data-source.service.ts b/src/app/services/Repositorys/chat/data-source/room/room-remote-data-source.service.ts similarity index 54% rename from src/app/services/Repositorys/chat/data-source/room-remote-data-source.service.ts rename to src/app/services/Repositorys/chat/data-source/room/room-remote-data-source.service.ts index 6c1467e92..518bb3514 100644 --- a/src/app/services/Repositorys/chat/data-source/room-remote-data-source.service.ts +++ b/src/app/services/Repositorys/chat/data-source/room/room-remote-data-source.service.ts @@ -1,10 +1,12 @@ import { Injectable } from '@angular/core'; -import { ok, err, Result } from 'neverthrow'; +import { Result } from 'neverthrow'; import { HttpService } from 'src/app/services/http.service'; -import { RoomListOutPutDTO } from '../dto/roomListOutputDTO'; -import { RoomListInputDTO } from '../dto/roomInputDTO'; -import { RoomOutPutDTO } from '../dto/roomOutputDTO'; -import { AddMemberToRoomInputDTO } from '../dto/addMemberToRoomInputDto'; +import { RoomListOutPutDTO } from '../../dto/room/roomListOutputDTO'; +import { RoomInputDTO, RoomInputDTOSchema } from '../../dto/room/roomInputDTO'; +import { RoomOutPutDTO } from '../../dto/room/roomOutputDTO'; +import { AddMemberToRoomInputDTO, AddMemberToRoomInputDTOSchema } from '../../dto/room/addMemberToRoomInputDto'; +import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; +import { DataSourceReturn } from '../../../type'; @Injectable({ providedIn: 'root' @@ -15,16 +17,10 @@ export class RoomRemoteDataSourceService { constructor(private httpService: HttpService) {} - async sendMessage(message: any): Promise> { - return await this.httpService.post(`${this.baseUrl}/Messages`, message); - } - async reactToMessage(id: string, reaction: any): Promise> { - return await this.httpService.post(`${this.baseUrl}/Messages/${id}/React`, reaction); - } - - async createRoom(data: RoomListInputDTO): Promise> { - return await this.httpService.post(`${this.baseUrl}/Room`, data); + @ValidateSchema(RoomInputDTOSchema) + async createRoom(data: RoomInputDTO): DataSourceReturn { + return await this.httpService.post(`${this.baseUrl}/Room`, data); } async getRoomList(): Promise> { @@ -43,7 +39,8 @@ export class RoomRemoteDataSourceService { return await this.httpService.delete(`${this.baseUrl}/Room/${id}`); } - async addMemberToRoom(data: AddMemberToRoomInputDTO) { + @ValidateSchema(AddMemberToRoomInputDTOSchema) + async addMemberToRoom(data: AddMemberToRoomInputDTO): DataSourceReturn { return await this.httpService.post(`${this.baseUrl}/Room/${data.id}/Member`, data.member); } @@ -51,7 +48,4 @@ export class RoomRemoteDataSourceService { return await this.httpService.delete(`${this.baseUrl}/Room/${id}/Member`); } - async getMessagesFromRoom(id: string): Promise> { - return await this.httpService.get(`${this.baseUrl}/Room/${id}/Messages`); - } } diff --git a/src/app/services/Repositorys/chat/data-source/room/rooom-local-data-source.service.ts b/src/app/services/Repositorys/chat/data-source/room/rooom-local-data-source.service.ts new file mode 100644 index 000000000..63f7b4433 --- /dev/null +++ b/src/app/services/Repositorys/chat/data-source/room/rooom-local-data-source.service.ts @@ -0,0 +1,94 @@ +import { Injectable } from '@angular/core'; +import { AddMemberToRoomInputDTO } from '../../dto/room/addMemberToRoomInputDto'; +import { RoomListOutPutDTO } from '../../dto/room/roomListOutputDTO'; +import { Dexie, EntityTable, liveQuery } from 'Dexie'; +import { err, ok } from 'neverthrow'; +import { Observable } from 'rxjs'; +import { RoomOutPutDTO } from '../../dto/room/roomOutputDTO'; +import { z } from 'zod'; + + + +const tableSchema = z.object({ + id: z.string(), + roomName: z.string(), + createdBy: z.any(), + createdAt: z.any(), + expirationDate: z.any(), + roomType: z.any() +}) +export type Table = z.infer + +// Database declaration (move this to its own module also) +export const roomDataSource = new Dexie('FriendDatabase') as Dexie & { + room: EntityTable; +}; + +roomDataSource.version(1).stores({ + room: '++id, createdBy, roomName, roomType, expirationDate' +}); + +@Injectable({ + providedIn: 'root' +}) +export class RoomLocalDataSourceService { + + private baseUrl = 'https://gdapi-dev.dyndns.info/stage/api/v2/Chat'; // Your base URL + + constructor() {} + + + async createRoom(data: RoomOutPutDTO) { + + const roomData = { + createdBy: { + wxUserId: 0, + wxFullName: "", + wxeMail: "", + userPhoto: "" + }, + roomName: data.data.roomName, + id: data.data.id, + roomType: 21, + expirationDate: '', + } + + try { + const result = await roomDataSource.room.add(roomData) + return ok(result) + } catch (e) { + return err(false) + } + + } + + async getRoomList() { + + } + + async getRoom(id: string){ + + } + + async updateRoom(id: string, room: any) { + + } + + async deleteRoom(id: string){ + + } + + async addMemberToRoom(data: AddMemberToRoomInputDTO) { + + } + + async removeMemberFromRoom(id: string, member: any){ + + } + + getItemsLive(): Observable { + return liveQuery(() => roomDataSource.room.toArray()) as any; + } + +} + diff --git a/src/app/services/Repositorys/chat/data-source/rooom-local-data-srource.ts b/src/app/services/Repositorys/chat/data-source/rooom-local-data-srource.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/app/services/Repositorys/chat/dto/message/messageListInputDTO.ts b/src/app/services/Repositorys/chat/dto/message/messageListInputDTO.ts new file mode 100644 index 000000000..f69ff3a2b --- /dev/null +++ b/src/app/services/Repositorys/chat/dto/message/messageListInputDTO.ts @@ -0,0 +1,7 @@ +import { z } from "zod" + +const MessageListInputDTOSchema = z.object({ + roomId: z.string(), +}); + +export type MessageListInputDTO = z.infer diff --git a/src/app/services/Repositorys/chat/dto/message/messageOutputDTO.ts b/src/app/services/Repositorys/chat/dto/message/messageOutputDTO.ts new file mode 100644 index 000000000..c1a1c27ec --- /dev/null +++ b/src/app/services/Repositorys/chat/dto/message/messageOutputDTO.ts @@ -0,0 +1,20 @@ +import { z } from "zod" + +const MessageOutPutDTOSchema = z.object({ + id: z.string(), + sender: z.object({ + wxUserId: z.number(), + wxFullName: z.string(), + wxeMail: z.string().email(), + userPhoto: z.string() + }), + message: z.string().datetime(), + messageType: z.string().datetime(), + sentAt: z.number(), + deliverAt: z.any(), + canEdit: z.any(), + oneShot: z.any(), + requireUnlock: z.any() +}); + +export type MessageOutPutDTO = z.infer diff --git a/src/app/services/Repositorys/chat/dto/addMemberToRoomInputDto.ts b/src/app/services/Repositorys/chat/dto/room/addMemberToRoomInputDto.ts similarity index 100% rename from src/app/services/Repositorys/chat/dto/addMemberToRoomInputDto.ts rename to src/app/services/Repositorys/chat/dto/room/addMemberToRoomInputDto.ts diff --git a/src/app/services/Repositorys/chat/dto/outPut.ts b/src/app/services/Repositorys/chat/dto/room/outPut.ts similarity index 100% rename from src/app/services/Repositorys/chat/dto/outPut.ts rename to src/app/services/Repositorys/chat/dto/room/outPut.ts diff --git a/src/app/services/Repositorys/chat/dto/roomInputDTO.ts b/src/app/services/Repositorys/chat/dto/room/roomInputDTO.ts similarity index 56% rename from src/app/services/Repositorys/chat/dto/roomInputDTO.ts rename to src/app/services/Repositorys/chat/dto/room/roomInputDTO.ts index 25f5ffcb8..b626b20b9 100644 --- a/src/app/services/Repositorys/chat/dto/roomInputDTO.ts +++ b/src/app/services/Repositorys/chat/dto/room/roomInputDTO.ts @@ -1,6 +1,6 @@ import { z } from "zod"; -export const RoomListInputDTOSchema = z.object({ +export const RoomInputDTOSchema = z.object({ roomName: z.string(), createdBy: z.number(), roomType: z.number(), @@ -8,4 +8,4 @@ export const RoomListInputDTOSchema = z.object({ }); -export type RoomListInputDTO = z.infer +export type RoomInputDTO = z.infer diff --git a/src/app/services/Repositorys/chat/dto/roomListOutputDTO.ts b/src/app/services/Repositorys/chat/dto/room/roomListOutputDTO.ts similarity index 68% rename from src/app/services/Repositorys/chat/dto/roomListOutputDTO.ts rename to src/app/services/Repositorys/chat/dto/room/roomListOutputDTO.ts index 4a9447c44..a3733e46a 100644 --- a/src/app/services/Repositorys/chat/dto/roomListOutputDTO.ts +++ b/src/app/services/Repositorys/chat/dto/room/roomListOutputDTO.ts @@ -7,7 +7,7 @@ const CreatedBySchema = z.object({ userPhoto: z.string() }); -const RoomListOutPutDTOSchema = z.object({ +const RoomListItemOutPutDTOSchema = z.object({ id: z.string(), roomName: z.string(), createdBy: CreatedBySchema, @@ -15,7 +15,8 @@ const RoomListOutPutDTOSchema = z.object({ expirationDate: z.string().datetime(), roomType: z.number() }); +export type RoomListItemOutPutDTO = z.infer - +const RoomListOutPutDTOSchema = z.array(RoomListItemOutPutDTOSchema); export type RoomListOutPutDTO = z.infer diff --git a/src/app/services/Repositorys/chat/dto/roomOutputDTO.ts b/src/app/services/Repositorys/chat/dto/room/roomOutputDTO.ts similarity index 51% rename from src/app/services/Repositorys/chat/dto/roomOutputDTO.ts rename to src/app/services/Repositorys/chat/dto/room/roomOutputDTO.ts index da74f600d..044caa260 100644 --- a/src/app/services/Repositorys/chat/dto/roomOutputDTO.ts +++ b/src/app/services/Repositorys/chat/dto/room/roomOutputDTO.ts @@ -3,7 +3,14 @@ import { z } from "zod"; const RoomOutPutDTOSchema = z.object({ success: z.string(), message: z.string(), - data: z.any() + data: z.object({ + id: z.string(), + roomName: z.string(), + createdBy: z.any(), + createdAt: z.date(), + expirationDate: z.date(), + roomType: z.any() + }) }); export type RoomOutPutDTO = z.infer diff --git a/src/app/services/Repositorys/chat/repository/message-respository.service.ts b/src/app/services/Repositorys/chat/repository/message-respository.service.ts index 6cf73c419..0e11c7e38 100644 --- a/src/app/services/Repositorys/chat/repository/message-respository.service.ts +++ b/src/app/services/Repositorys/chat/repository/message-respository.service.ts @@ -1,4 +1,7 @@ import { Injectable } from '@angular/core'; +import { MessageRemoteDataSourceService } from '../data-source/message/message-remote-data-source.service'; +import { MessageLiveDataSourceService } from '../data-source/message/message-live-data-source.service'; +import { MessageListInputDTO } from '../dto/message/messageListInputDTO'; @Injectable({ providedIn: 'root' @@ -6,5 +9,17 @@ import { Injectable } from '@angular/core'; export class MessageRepositoryService { constructor( - ) { } + private messageRemoteDataSourceService: MessageRemoteDataSourceService, + private messageLiveDataSourceService: MessageLiveDataSourceService + ) {} + + async sendMessage() { + // const result = this.messageRemoteDataSourceService.sendMessage() + } + + async getMessagesFromRoom(data: MessageListInputDTO) { + const result = await this.messageRemoteDataSourceService.getMessagesFromRoom(data) + + return result + } } diff --git a/src/app/services/Repositorys/chat/repository/room-repository.service.ts b/src/app/services/Repositorys/chat/repository/room-repository.service.ts index d8a9fb3b7..4d7a27781 100644 --- a/src/app/services/Repositorys/chat/repository/room-repository.service.ts +++ b/src/app/services/Repositorys/chat/repository/room-repository.service.ts @@ -1,12 +1,10 @@ import { Injectable } from '@angular/core'; -import { RoomRemoteDataSourceService } from '../data-source/room-remote-data-source.service' -import { RoomListInputDTO, RoomListInputDTOSchema } from '../dto/roomInputDTO'; -import { IRepositoryReturn } from '../../type'; -import { ValidateSchema } from 'src/app/services/decorators/validate-schema.decorator'; -import { addRoom, RoomRemoteDataSourceState } from '../data-source/room-memory-data-source'; +import { RoomRemoteDataSourceService } from '../data-source/room/room-remote-data-source.service' +import { RoomInputDTO } from '../dto/room/roomInputDTO';; +import { addRoom, RoomRemoteDataSourceState } from '../data-source/room/room-memory-data-source'; import { Store } from '@ngrx/store'; -import { AddMemberToRoomInputDTO, AddMemberToRoomInputDTOSchema } from '../dto/addMemberToRoomInputDto'; -import { RoomOutPutDTO } from '../dto/roomOutputDTO'; +import { AddMemberToRoomInputDTO } from '../dto/room/addMemberToRoomInputDto'; +import { RoomLocalDataSourceService } from '../data-source/room/rooom-local-data-source.service'; @Injectable({ providedIn: 'root' @@ -15,15 +13,19 @@ export class RoomRepositoryService { constructor( private roomRemoteDataSourceService: RoomRemoteDataSourceService, - private roomMemoryDataSourceService: Store + private roomMemoryDataSourceService: Store, + private roomLocalDataSourceService: RoomLocalDataSourceService ) { } - list() { - this.roomRemoteDataSourceService.getRoomList() + async list() { + const result = await this.roomRemoteDataSourceService.getRoomList() + return result } - @ValidateSchema(RoomListInputDTOSchema) - async create(data: RoomListInputDTO): IRepositoryReturn { + async create(data: RoomInputDTO) { + + this.list() + const result = await this.roomRemoteDataSourceService.createRoom(data) if(result.isOk()) { @@ -32,15 +34,21 @@ export class RoomRepositoryService { timestamp: 0, roomName: data.roomName })) + + this.roomLocalDataSourceService.createRoom(result.value) } return result } - @ValidateSchema(AddMemberToRoomInputDTOSchema) - async addMemberToRoom(data: AddMemberToRoomInputDTO): IRepositoryReturn { + + async addMemberToRoom(data: AddMemberToRoomInputDTO) { const result = await this.roomRemoteDataSourceService.addMemberToRoom(data) return result } + + getItemsLive() { + return this.roomLocalDataSourceService.getItemsLive() + } } diff --git a/src/app/services/Repositorys/chat/repository/user-respository.service.ts b/src/app/services/Repositorys/chat/repository/user-respository.service.ts deleted file mode 100644 index e2b6292e4..000000000 --- a/src/app/services/Repositorys/chat/repository/user-respository.service.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable({ - providedIn: 'root' -}) -export class UserRepositoryService { - - constructor() { } -} diff --git a/src/app/services/Repositorys/type.ts b/src/app/services/Repositorys/type.ts index f849abdba..0e64a9457 100644 --- a/src/app/services/Repositorys/type.ts +++ b/src/app/services/Repositorys/type.ts @@ -2,4 +2,4 @@ import { HttpErrorResponse } from "@angular/common/http"; import { Result } from "neverthrow"; import { ZodError } from "zod"; -export type IRepositoryReturn = Promise> +export type DataSourceReturn = Promise> diff --git a/src/app/shared/chat/new-group/new-group.page.ts b/src/app/shared/chat/new-group/new-group.page.ts index eb9a41ae1..7ea4afe40 100644 --- a/src/app/shared/chat/new-group/new-group.page.ts +++ b/src/app/shared/chat/new-group/new-group.page.ts @@ -173,7 +173,7 @@ export class NewGroupPage implements OnInit{ async createGroup1() { const result = await this.roomRepositoryService.create({ roomName: this.groupName, - createdBy: 0, + createdBy: SessionStore.user.UserId, roomType: 0, expirationDate: null })