import { Injectable, inject } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; import { Attachment, BlacklistEntry, Contact, Draft, Folder, Mailbox, MailboxCreated, Message, Profile, ServerConfig } from './models'; /** The mail server REST API (same origin, /api). */ @Injectable({ providedIn: 'root' }) export class ApiService { private http = inject(HttpClient); config(): Observable { return this.http.get('/api/config'); } // profile me(): Observable { return this.http.get('/api/me'); } updateMe(displayName: string): Observable { return this.http.put('/api/me', { displayName }); } changePassword(currentPassword: string, newPassword: string): Observable { return this.http.put('/api/me/password', { currentPassword, newPassword }); } // mailboxes — administrators only mailboxes(): Observable { return this.http.get('/api/admin/mailboxes'); } createMailbox(email: string, displayName: string, password: string): Observable { return this.http.post('/api/admin/mailboxes', { email, displayName, password }); } newMailboxPassword(id: number): Observable { return this.http.post(`/api/admin/mailboxes/${id}/password`, {}); } setMailboxActive(id: number, active: boolean): Observable { return this.http.put(`/api/admin/mailboxes/${id}/active`, { active }); } // folders folders(): Observable { return this.http.get('/api/folders'); } createFolder(name: string): Observable { return this.http.post('/api/folders', { name }); } renameFolder(id: number, name: string): Observable { return this.http.put(`/api/folders/${id}`, { name }); } deleteFolder(id: number): Observable { return this.http.delete(`/api/folders/${id}`); } emptyFolder(id: number): Observable<{ deleted: number }> { return this.http.delete<{ deleted: number }>(`/api/folders/${id}/messages`); } // messages messages(folderId: number): Observable { return this.http.get('/api/messages', { params: { folderId } }); } search(folderId: number, keyword: string): Observable { return this.http.get('/api/messages/search', { params: { folderId, keyword } }); } message(id: number): Observable { return this.http.get(`/api/messages/${id}`); } updateMessage(id: number, change: { read?: boolean; flagged?: boolean; folderId?: number }): Observable { return this.http.patch(`/api/messages/${id}`, change); } deleteMessage(id: number): Observable { return this.http.delete(`/api/messages/${id}`); } // compose createDraft(draft: Draft): Observable { return this.http.post('/api/drafts', draft); } updateDraft(id: number, draft: Draft): Observable { return this.http.put(`/api/drafts/${id}`, draft); } send(draft: Draft, draftId: number | null): Observable { return this.http.post('/api/send', { ...draft, draftId }); } // attachments attachments(messageId: number): Observable { return this.http.get(`/api/messages/${messageId}/attachments`); } upload(messageId: number, file: File): Observable { const form = new FormData(); form.append('file', file, file.name); return this.http.post(`/api/messages/${messageId}/attachments`, form); } deleteAttachment(id: number): Observable { return this.http.delete(`/api/attachments/${id}`); } download(id: number): Observable { return this.http.get(`/api/attachments/${id}/download`, { responseType: 'blob' }); } // contacts contacts(): Observable { return this.http.get('/api/contacts'); } addContact(contact: Contact): Observable { return this.http.post('/api/contacts', contact); } updateContact(id: number, contact: Contact): Observable { return this.http.put(`/api/contacts/${id}`, contact); } deleteContact(id: number): Observable { return this.http.delete(`/api/contacts/${id}`); } // blacklist blacklist(): Observable { return this.http.get('/api/spam/blacklist'); } block(senderEmail: string, reason: string): Observable { return this.http.post('/api/spam/blacklist', { senderEmail, reason }); } unblock(senderEmail: string): Observable { return this.http.delete('/api/spam/blacklist', { params: { senderEmail } }); } }