Table of Contents

Class ConversationService

Namespace
UsluzionicaServer.Services
Assembly
UsluzionicaServer.dll
public sealed class ConversationService
Inheritance
ConversationService
Inherited Members

Constructors

ConversationService(AppDbContext, UserManager<ApplicationUser>, MessageEncryption, OnlineTracker, NotificationService, BlockService, ILogger<ConversationService>)

Methods

EnsureExistsAsync(string, string, CancellationToken)

Osigurava da razgovor između dvoje ljudi postoji, i ništa više.

Odvojeno od GetOrCreateAsync(string, string) namerno. Taj metod služi korisniku koji je pritisnuo „Poruka": proverava blokadu, traži primaoca preko UserManager-a i sastavlja pun DTO za ekran. Ovde ništa od toga ne treba — razgovor se pravi kao propratni efekat rezervacije, pozivalac je već proverio i blokadu i postojanje oba naloga, a DTO nema ko da prikaže.

Ne baca izuzetak ni u jednom slučaju. Razgovor je pogodnost uz rezervaciju, a rezervacija je ono što korisnik zapravo traži — ako pravljenje razgovora zakaže, rezervacija svejedno mora da prođe.

GetConversationsAsync(string)

Vraća sve konverzacije prijavljenog korisnika, sortirane od najnovije. Prikazuje "drugog" korisnika, preview zadnje poruke i broj nepročitanih.

GetMessagesAsync(int, string, int, int)

Vraća paginovanu istoriju poruka, sortirane od NAJSTARIJE (hronološki). Svaki tekst je dekriptovan pre vraćanja klijentu.

GetOrCreateAsync(string, string)

Kreira konverzaciju između dva korisnika ako ne postoji. Ako već postoji → vraća tu istu.

User1Id/User2Id se normalizuju (manji ID ide na User1) kako bi UNIQUE index na (User1Id, User2Id) radio ispravno bez obzira ko inicira razgovor.

GetUnreadConversationIdsAsync(string)

ID-jevi razgovora u kojima korisnika čeka bar jedna nepročitana poruka.

Vraća ID-jeve, a ne samo broj, zato što klijent mora da održava taj skup: kad se razgovor otvori, njegov ID se izbacuje, a kad stigne poruka kroz SignalR, dodaje se. Sa golim brojem klijent ne bi znao da li nova poruka dolazi iz razgovora koji se već broji ili iz novog, pa bi badge brojao poruke umesto razgovora.

Razgovori sa blokiranima se izostavljaju — isto pravilo kao u GetConversationsAsync(string), jer badge ne sme da broji ono što se na listi uopšte ne vidi.

MarkAsReadAsync(int, string)

Označava sve poruke u konverzaciji kao pročitane za trenutnog korisnika. Ažurira samo poruke koje su DRUGI korisnik poslao (ne sopstvene).

SendMessageAsync(int, string, string)

REST verzija slanja poruke — koristiti ako SignalR nije dostupan. Enkriptuje tekst, snima u bazu, vraća DTO sa dekriptovanim tekstom.