@zahidzorbaz/tudun 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/domain/dto/calendar-event.d.ts +29 -0
  2. package/dist/domain/dto/calendar-event.js +2 -0
  3. package/dist/domain/dto/calendar-event.js.map +1 -0
  4. package/dist/domain/dto/contact.d.ts +26 -0
  5. package/dist/domain/dto/contact.js +2 -0
  6. package/dist/domain/dto/contact.js.map +1 -0
  7. package/dist/domain/dto/email.d.ts +36 -0
  8. package/dist/domain/dto/email.js +2 -0
  9. package/dist/domain/dto/email.js.map +1 -0
  10. package/dist/domain/dto/index.d.ts +4 -0
  11. package/dist/domain/dto/index.js +2 -0
  12. package/dist/domain/dto/index.js.map +1 -0
  13. package/dist/domain/dto/task.d.ts +25 -0
  14. package/dist/domain/dto/task.js +2 -0
  15. package/dist/domain/dto/task.js.map +1 -0
  16. package/dist/domain/ports/auth-service.d.ts +9 -0
  17. package/dist/domain/ports/auth-service.js +2 -0
  18. package/dist/domain/ports/auth-service.js.map +1 -0
  19. package/dist/domain/ports/calendar-service.d.ts +13 -0
  20. package/dist/domain/ports/calendar-service.js +2 -0
  21. package/dist/domain/ports/calendar-service.js.map +1 -0
  22. package/dist/domain/ports/contacts-service.d.ts +10 -0
  23. package/dist/domain/ports/contacts-service.js +2 -0
  24. package/dist/domain/ports/contacts-service.js.map +1 -0
  25. package/dist/domain/ports/gmail-service.d.ts +10 -0
  26. package/dist/domain/ports/gmail-service.js +2 -0
  27. package/dist/domain/ports/gmail-service.js.map +1 -0
  28. package/dist/domain/ports/index.d.ts +5 -0
  29. package/dist/domain/ports/index.js +2 -0
  30. package/dist/domain/ports/index.js.map +1 -0
  31. package/dist/domain/ports/tasks-service.d.ts +15 -0
  32. package/dist/domain/ports/tasks-service.js +2 -0
  33. package/dist/domain/ports/tasks-service.js.map +1 -0
  34. package/dist/infrastructure/config/app-config.d.ts +7 -0
  35. package/dist/infrastructure/config/app-config.js +14 -0
  36. package/dist/infrastructure/config/app-config.js.map +1 -0
  37. package/dist/infrastructure/google/auth.service.d.ts +21 -0
  38. package/dist/infrastructure/google/auth.service.js +196 -0
  39. package/dist/infrastructure/google/auth.service.js.map +1 -0
  40. package/dist/infrastructure/google/calendar.service.d.ts +19 -0
  41. package/dist/infrastructure/google/calendar.service.js +137 -0
  42. package/dist/infrastructure/google/calendar.service.js.map +1 -0
  43. package/dist/infrastructure/google/contacts.service.d.ts +17 -0
  44. package/dist/infrastructure/google/contacts.service.js +182 -0
  45. package/dist/infrastructure/google/contacts.service.js.map +1 -0
  46. package/dist/infrastructure/google/gmail.service.d.ts +17 -0
  47. package/dist/infrastructure/google/gmail.service.js +165 -0
  48. package/dist/infrastructure/google/gmail.service.js.map +1 -0
  49. package/dist/infrastructure/google/index.d.ts +5 -0
  50. package/dist/infrastructure/google/index.js +6 -0
  51. package/dist/infrastructure/google/index.js.map +1 -0
  52. package/dist/infrastructure/google/tasks.service.d.ts +20 -0
  53. package/dist/infrastructure/google/tasks.service.js +133 -0
  54. package/dist/infrastructure/google/tasks.service.js.map +1 -0
  55. package/dist/interface/cli/index.d.ts +2 -0
  56. package/dist/interface/cli/index.js +15 -0
  57. package/dist/interface/cli/index.js.map +1 -0
  58. package/dist/interface/mcp/server.d.ts +2 -0
  59. package/dist/interface/mcp/server.js +84 -0
  60. package/dist/interface/mcp/server.js.map +1 -0
  61. package/dist/interface/mcp/tools/authorize-google.d.ts +3 -0
  62. package/dist/interface/mcp/tools/authorize-google.js +20 -0
  63. package/dist/interface/mcp/tools/authorize-google.js.map +1 -0
  64. package/dist/interface/mcp/tools/complete-task.d.ts +3 -0
  65. package/dist/interface/mcp/tools/complete-task.js +19 -0
  66. package/dist/interface/mcp/tools/complete-task.js.map +1 -0
  67. package/dist/interface/mcp/tools/create-contact.d.ts +3 -0
  68. package/dist/interface/mcp/tools/create-contact.js +34 -0
  69. package/dist/interface/mcp/tools/create-contact.js.map +1 -0
  70. package/dist/interface/mcp/tools/create-event.d.ts +3 -0
  71. package/dist/interface/mcp/tools/create-event.js +32 -0
  72. package/dist/interface/mcp/tools/create-event.js.map +1 -0
  73. package/dist/interface/mcp/tools/create-task-list.d.ts +3 -0
  74. package/dist/interface/mcp/tools/create-task-list.js +18 -0
  75. package/dist/interface/mcp/tools/create-task-list.js.map +1 -0
  76. package/dist/interface/mcp/tools/create-task.d.ts +3 -0
  77. package/dist/interface/mcp/tools/create-task.js +27 -0
  78. package/dist/interface/mcp/tools/create-task.js.map +1 -0
  79. package/dist/interface/mcp/tools/delete-contact.d.ts +3 -0
  80. package/dist/interface/mcp/tools/delete-contact.js +20 -0
  81. package/dist/interface/mcp/tools/delete-contact.js.map +1 -0
  82. package/dist/interface/mcp/tools/delete-event.d.ts +3 -0
  83. package/dist/interface/mcp/tools/delete-event.js +20 -0
  84. package/dist/interface/mcp/tools/delete-event.js.map +1 -0
  85. package/dist/interface/mcp/tools/delete-task.d.ts +3 -0
  86. package/dist/interface/mcp/tools/delete-task.js +21 -0
  87. package/dist/interface/mcp/tools/delete-task.js.map +1 -0
  88. package/dist/interface/mcp/tools/get-event.d.ts +3 -0
  89. package/dist/interface/mcp/tools/get-event.js +18 -0
  90. package/dist/interface/mcp/tools/get-event.js.map +1 -0
  91. package/dist/interface/mcp/tools/get-status.d.ts +3 -0
  92. package/dist/interface/mcp/tools/get-status.js +38 -0
  93. package/dist/interface/mcp/tools/get-status.js.map +1 -0
  94. package/dist/interface/mcp/tools/get-task.d.ts +3 -0
  95. package/dist/interface/mcp/tools/get-task.js +19 -0
  96. package/dist/interface/mcp/tools/get-task.js.map +1 -0
  97. package/dist/interface/mcp/tools/list-contacts.d.ts +3 -0
  98. package/dist/interface/mcp/tools/list-contacts.js +18 -0
  99. package/dist/interface/mcp/tools/list-contacts.js.map +1 -0
  100. package/dist/interface/mcp/tools/list-emails.d.ts +3 -0
  101. package/dist/interface/mcp/tools/list-emails.js +24 -0
  102. package/dist/interface/mcp/tools/list-emails.js.map +1 -0
  103. package/dist/interface/mcp/tools/list-events.d.ts +3 -0
  104. package/dist/interface/mcp/tools/list-events.js +26 -0
  105. package/dist/interface/mcp/tools/list-events.js.map +1 -0
  106. package/dist/interface/mcp/tools/list-task-lists.d.ts +3 -0
  107. package/dist/interface/mcp/tools/list-task-lists.js +15 -0
  108. package/dist/interface/mcp/tools/list-task-lists.js.map +1 -0
  109. package/dist/interface/mcp/tools/list-tasks.d.ts +3 -0
  110. package/dist/interface/mcp/tools/list-tasks.js +25 -0
  111. package/dist/interface/mcp/tools/list-tasks.js.map +1 -0
  112. package/dist/interface/mcp/tools/read-email.d.ts +3 -0
  113. package/dist/interface/mcp/tools/read-email.js +18 -0
  114. package/dist/interface/mcp/tools/read-email.js.map +1 -0
  115. package/dist/interface/mcp/tools/search-contacts.d.ts +3 -0
  116. package/dist/interface/mcp/tools/search-contacts.js +18 -0
  117. package/dist/interface/mcp/tools/search-contacts.js.map +1 -0
  118. package/dist/interface/mcp/tools/send-email.d.ts +3 -0
  119. package/dist/interface/mcp/tools/send-email.js +30 -0
  120. package/dist/interface/mcp/tools/send-email.js.map +1 -0
  121. package/dist/interface/mcp/tools/update-contact.d.ts +3 -0
  122. package/dist/interface/mcp/tools/update-contact.js +33 -0
  123. package/dist/interface/mcp/tools/update-contact.js.map +1 -0
  124. package/dist/interface/mcp/tools/update-event.d.ts +3 -0
  125. package/dist/interface/mcp/tools/update-event.js +31 -0
  126. package/dist/interface/mcp/tools/update-event.js.map +1 -0
  127. package/dist/interface/mcp/tools/update-task.d.ts +3 -0
  128. package/dist/interface/mcp/tools/update-task.js +26 -0
  129. package/dist/interface/mcp/tools/update-task.js.map +1 -0
  130. package/dist/interface/mcp/types.d.ts +12 -0
  131. package/dist/interface/mcp/types.js +2 -0
  132. package/dist/interface/mcp/types.js.map +1 -0
  133. package/dist/shared/errors/index.d.ts +26 -0
  134. package/dist/shared/errors/index.js +46 -0
  135. package/dist/shared/errors/index.js.map +1 -0
  136. package/dist/shared/utils/html-page.d.ts +1 -0
  137. package/dist/shared/utils/html-page.js +9 -0
  138. package/dist/shared/utils/html-page.js.map +1 -0
  139. package/dist/shared/utils/index.d.ts +2 -0
  140. package/dist/shared/utils/index.js +3 -0
  141. package/dist/shared/utils/index.js.map +1 -0
  142. package/dist/shared/utils/open-browser.d.ts +1 -0
  143. package/dist/shared/utils/open-browser.js +10 -0
  144. package/dist/shared/utils/open-browser.js.map +1 -0
  145. package/package.json +43 -0
@@ -0,0 +1,29 @@
1
+ export interface CalendarEventInput {
2
+ title: string;
3
+ description?: string;
4
+ location?: string;
5
+ startTime: string;
6
+ endTime: string;
7
+ attendees?: string[];
8
+ timeZone?: string;
9
+ }
10
+ export interface CalendarEventResult {
11
+ id: string;
12
+ title: string;
13
+ description?: string;
14
+ location?: string;
15
+ htmlLink: string;
16
+ startTime: string;
17
+ endTime: string;
18
+ attendees?: string[];
19
+ status: string;
20
+ }
21
+ export interface CalendarEventListItem {
22
+ id: string;
23
+ title: string;
24
+ startTime: string;
25
+ endTime: string;
26
+ location?: string;
27
+ status: string;
28
+ htmlLink: string;
29
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=calendar-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-event.js","sourceRoot":"","sources":["../../../src/domain/dto/calendar-event.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ export interface ContactInput {
2
+ firstName: string;
3
+ lastName?: string;
4
+ phone?: string;
5
+ email?: string;
6
+ company?: string;
7
+ title?: string;
8
+ notes?: string;
9
+ groupName?: string;
10
+ }
11
+ export interface ContactResult {
12
+ resourceName: string;
13
+ name: string;
14
+ phone?: string;
15
+ email?: string;
16
+ company?: string;
17
+ title?: string;
18
+ groupName?: string;
19
+ }
20
+ export interface ContactListItem {
21
+ resourceName: string;
22
+ name: string;
23
+ phone?: string;
24
+ email?: string;
25
+ company?: string;
26
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact.js","sourceRoot":"","sources":["../../../src/domain/dto/contact.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ export interface EmailInput {
2
+ to: string[];
3
+ subject: string;
4
+ body: string;
5
+ cc?: string[];
6
+ bcc?: string[];
7
+ replyToMessageId?: string;
8
+ }
9
+ export interface EmailResult {
10
+ id: string;
11
+ threadId: string;
12
+ labelIds: string[];
13
+ }
14
+ export interface EmailListItem {
15
+ id: string;
16
+ threadId: string;
17
+ snippet: string;
18
+ from: string;
19
+ subject: string;
20
+ date: string;
21
+ labelIds: string[];
22
+ isUnread: boolean;
23
+ }
24
+ export interface EmailDetail {
25
+ id: string;
26
+ threadId: string;
27
+ from: string;
28
+ to: string[];
29
+ cc?: string[];
30
+ subject: string;
31
+ date: string;
32
+ body: string;
33
+ snippet: string;
34
+ labelIds: string[];
35
+ isUnread: boolean;
36
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../../../src/domain/dto/email.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export type { CalendarEventInput, CalendarEventResult, CalendarEventListItem, } from './calendar-event.js';
2
+ export type { TaskInput, TaskResult, TaskListInput, TaskListResult, } from './task.js';
3
+ export type { ContactInput, ContactResult, ContactListItem, } from './contact.js';
4
+ export type { EmailInput, EmailResult, EmailListItem, EmailDetail, } from './email.js';
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/dto/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ export interface TaskInput {
2
+ title: string;
3
+ notes?: string;
4
+ due?: string;
5
+ parent?: string;
6
+ }
7
+ export interface TaskResult {
8
+ id: string;
9
+ title: string;
10
+ notes?: string;
11
+ status: 'needsAction' | 'completed';
12
+ due?: string;
13
+ completed?: string;
14
+ parent?: string;
15
+ position: string;
16
+ updated: string;
17
+ }
18
+ export interface TaskListInput {
19
+ title: string;
20
+ }
21
+ export interface TaskListResult {
22
+ id: string;
23
+ title: string;
24
+ updated: string;
25
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../../src/domain/dto/task.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export interface IAuthService {
2
+ isAuthorized(): Promise<boolean>;
3
+ authorize(): Promise<{
4
+ success: boolean;
5
+ message: string;
6
+ }>;
7
+ getAccessToken(): Promise<string>;
8
+ getAuthorizedScopes(): Promise<string[]>;
9
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-service.js","sourceRoot":"","sources":["../../../src/domain/ports/auth-service.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { CalendarEventInput, CalendarEventResult, CalendarEventListItem } from '../dto/calendar-event.js';
2
+ export interface ICalendarService {
3
+ createEvent(input: CalendarEventInput): Promise<CalendarEventResult>;
4
+ listEvents(params: {
5
+ timeMin?: string;
6
+ timeMax?: string;
7
+ maxResults?: number;
8
+ query?: string;
9
+ }): Promise<CalendarEventListItem[]>;
10
+ getEvent(eventId: string): Promise<CalendarEventResult>;
11
+ updateEvent(eventId: string, input: Partial<CalendarEventInput>): Promise<CalendarEventResult>;
12
+ deleteEvent(eventId: string): Promise<void>;
13
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=calendar-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-service.js","sourceRoot":"","sources":["../../../src/domain/ports/calendar-service.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import type { ContactInput, ContactResult, ContactListItem } from '../dto/contact.js';
2
+ export interface IContactsService {
3
+ createContact(input: ContactInput): Promise<ContactResult>;
4
+ listContacts(params?: {
5
+ pageSize?: number;
6
+ }): Promise<ContactListItem[]>;
7
+ searchContacts(query: string): Promise<ContactListItem[]>;
8
+ updateContact(resourceName: string, input: Partial<ContactInput>): Promise<ContactResult>;
9
+ deleteContact(resourceName: string): Promise<void>;
10
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contacts-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts-service.js","sourceRoot":"","sources":["../../../src/domain/ports/contacts-service.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import type { EmailInput, EmailResult, EmailListItem, EmailDetail } from '../dto/email.js';
2
+ export interface IGmailService {
3
+ sendEmail(input: EmailInput): Promise<EmailResult>;
4
+ listEmails(params?: {
5
+ query?: string;
6
+ maxResults?: number;
7
+ labelIds?: string[];
8
+ }): Promise<EmailListItem[]>;
9
+ readEmail(messageId: string): Promise<EmailDetail>;
10
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gmail-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gmail-service.js","sourceRoot":"","sources":["../../../src/domain/ports/gmail-service.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export type { IAuthService } from './auth-service.js';
2
+ export type { ICalendarService } from './calendar-service.js';
3
+ export type { ITasksService } from './tasks-service.js';
4
+ export type { IContactsService } from './contacts-service.js';
5
+ export type { IGmailService } from './gmail-service.js';
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/ports/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { TaskInput, TaskResult, TaskListInput, TaskListResult } from '../dto/task.js';
2
+ export interface ITasksService {
3
+ createTask(taskListId: string, input: TaskInput): Promise<TaskResult>;
4
+ listTasks(taskListId: string, params?: {
5
+ showCompleted?: boolean;
6
+ showHidden?: boolean;
7
+ maxResults?: number;
8
+ }): Promise<TaskResult[]>;
9
+ getTask(taskListId: string, taskId: string): Promise<TaskResult>;
10
+ updateTask(taskListId: string, taskId: string, input: Partial<TaskInput>): Promise<TaskResult>;
11
+ deleteTask(taskListId: string, taskId: string): Promise<void>;
12
+ completeTask(taskListId: string, taskId: string): Promise<TaskResult>;
13
+ listTaskLists(): Promise<TaskListResult[]>;
14
+ createTaskList(input: TaskListInput): Promise<TaskListResult>;
15
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tasks-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks-service.js","sourceRoot":"","sources":["../../../src/domain/ports/tasks-service.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export interface AppConfig {
2
+ googleClientId: string;
3
+ googleClientSecret: string;
4
+ tokenPath: string;
5
+ defaultTimeZone: string;
6
+ }
7
+ export declare function loadConfig(): AppConfig;
@@ -0,0 +1,14 @@
1
+ export function loadConfig() {
2
+ const googleClientId = process.env.GOOGLE_CLIENT_ID;
3
+ const googleClientSecret = process.env.GOOGLE_CLIENT_SECRET;
4
+ if (!googleClientId || !googleClientSecret) {
5
+ throw new Error('GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET environment variables are required.');
6
+ }
7
+ return {
8
+ googleClientId,
9
+ googleClientSecret,
10
+ tokenPath: process.env.TOKEN_PATH ?? './data/google-token.json',
11
+ defaultTimeZone: process.env.DEFAULT_TIMEZONE ?? 'Europe/Istanbul',
12
+ };
13
+ }
14
+ //# sourceMappingURL=app-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-config.js","sourceRoot":"","sources":["../../../src/infrastructure/config/app-config.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,UAAU;IACxB,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACpD,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IAE5D,IAAI,CAAC,cAAc,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,cAAc;QACd,kBAAkB;QAClB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,0BAA0B;QAC/D,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,iBAAiB;KACnE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { IAuthService } from '../../domain/ports/auth-service.js';
2
+ export declare class GoogleAuthService implements IAuthService {
3
+ private readonly clientId;
4
+ private readonly clientSecret;
5
+ private readonly tokenPath;
6
+ private tokens;
7
+ private tokensLoaded;
8
+ constructor(clientId: string, clientSecret: string, tokenPath: string);
9
+ isAuthorized(): Promise<boolean>;
10
+ getAuthorizedScopes(): Promise<string[]>;
11
+ authorize(): Promise<{
12
+ success: boolean;
13
+ message: string;
14
+ }>;
15
+ getAccessToken(): Promise<string>;
16
+ private hasRequiredScopes;
17
+ private clearTokens;
18
+ private ensureTokensLoaded;
19
+ private saveTokens;
20
+ private exchangeCodeForTokens;
21
+ }
@@ -0,0 +1,196 @@
1
+ import { createServer as createHttpServer } from 'node:http';
2
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
+ import { existsSync } from 'node:fs';
4
+ import { dirname } from 'node:path';
5
+ import { openBrowser } from '../../shared/utils/open-browser.js';
6
+ import { htmlPage } from '../../shared/utils/html-page.js';
7
+ import { AuthError } from '../../shared/errors/index.js';
8
+ const AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth';
9
+ const TOKEN_URL = 'https://oauth2.googleapis.com/token';
10
+ const SCOPES = [
11
+ 'https://www.googleapis.com/auth/calendar.events',
12
+ 'https://www.googleapis.com/auth/tasks',
13
+ 'https://www.googleapis.com/auth/gmail.send',
14
+ 'https://www.googleapis.com/auth/gmail.readonly',
15
+ 'https://www.googleapis.com/auth/contacts',
16
+ ];
17
+ const AUTH_TIMEOUT_MS = 120_000;
18
+ const TOKEN_BUFFER_MS = 300_000;
19
+ export class GoogleAuthService {
20
+ clientId;
21
+ clientSecret;
22
+ tokenPath;
23
+ tokens = null;
24
+ tokensLoaded = false;
25
+ constructor(clientId, clientSecret, tokenPath) {
26
+ this.clientId = clientId;
27
+ this.clientSecret = clientSecret;
28
+ this.tokenPath = tokenPath;
29
+ }
30
+ async isAuthorized() {
31
+ await this.ensureTokensLoaded();
32
+ return this.tokens !== null && !!this.tokens.refresh_token && this.hasRequiredScopes();
33
+ }
34
+ async getAuthorizedScopes() {
35
+ await this.ensureTokensLoaded();
36
+ return this.tokens?.scopes ?? [];
37
+ }
38
+ async authorize() {
39
+ await this.ensureTokensLoaded();
40
+ if (this.tokens?.refresh_token && this.hasRequiredScopes()) {
41
+ return { success: true, message: 'Already authorized with Google.' };
42
+ }
43
+ // If scopes changed, clear old token to force re-auth
44
+ if (this.tokens?.refresh_token && !this.hasRequiredScopes()) {
45
+ await this.clearTokens();
46
+ }
47
+ return new Promise((resolve) => {
48
+ let resolved = false;
49
+ const httpServer = createHttpServer(async (req, res) => {
50
+ if (resolved)
51
+ return;
52
+ const url = new URL(req.url, 'http://localhost');
53
+ const code = url.searchParams.get('code');
54
+ const error = url.searchParams.get('error');
55
+ if (error) {
56
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
57
+ res.end(htmlPage('Yetkilendirme Basarisiz', 'Erisim reddedildi. Bu pencereyi kapatabilirsiniz.'));
58
+ resolved = true;
59
+ httpServer.close();
60
+ resolve({ success: false, message: `Authorization denied: ${error}` });
61
+ return;
62
+ }
63
+ if (code) {
64
+ const port = httpServer.address().port;
65
+ try {
66
+ await this.exchangeCodeForTokens(code, `http://localhost:${port}`);
67
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
68
+ res.end(htmlPage('Tudun Yetkilendirildi!', 'Google Calendar, Tasks, Gmail ve Contacts baglantisi basarili. Bu pencereyi kapatabilirsiniz.'));
69
+ resolved = true;
70
+ httpServer.close();
71
+ resolve({ success: true, message: 'Google successfully authorized. Token saved.' });
72
+ }
73
+ catch (err) {
74
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
75
+ res.end(htmlPage('Hata', 'Token alinamadi. Lutfen tekrar deneyin.'));
76
+ resolved = true;
77
+ httpServer.close();
78
+ resolve({ success: false, message: `Token exchange failed: ${err.message}` });
79
+ }
80
+ return;
81
+ }
82
+ res.writeHead(404);
83
+ res.end();
84
+ });
85
+ httpServer.listen(0, () => {
86
+ const port = httpServer.address().port;
87
+ const redirectUri = `http://localhost:${port}`;
88
+ const authUrl = new URL(AUTH_URL);
89
+ authUrl.searchParams.set('client_id', this.clientId);
90
+ authUrl.searchParams.set('redirect_uri', redirectUri);
91
+ authUrl.searchParams.set('response_type', 'code');
92
+ authUrl.searchParams.set('scope', SCOPES.join(' '));
93
+ authUrl.searchParams.set('access_type', 'offline');
94
+ authUrl.searchParams.set('prompt', 'consent');
95
+ openBrowser(authUrl.toString());
96
+ setTimeout(() => {
97
+ if (!resolved) {
98
+ resolved = true;
99
+ httpServer.close();
100
+ resolve({ success: false, message: 'Authorization timed out after 120 seconds.' });
101
+ }
102
+ }, AUTH_TIMEOUT_MS);
103
+ });
104
+ });
105
+ }
106
+ async getAccessToken() {
107
+ await this.ensureTokensLoaded();
108
+ if (!this.tokens?.refresh_token) {
109
+ throw new AuthError('Not authorized. Call authorize_google first.');
110
+ }
111
+ if (this.tokens.expires_at && Date.now() < this.tokens.expires_at - TOKEN_BUFFER_MS) {
112
+ return this.tokens.access_token;
113
+ }
114
+ const response = await fetch(TOKEN_URL, {
115
+ method: 'POST',
116
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
117
+ body: new URLSearchParams({
118
+ client_id: this.clientId,
119
+ client_secret: this.clientSecret,
120
+ refresh_token: this.tokens.refresh_token,
121
+ grant_type: 'refresh_token',
122
+ }),
123
+ });
124
+ if (!response.ok) {
125
+ const error = await response.text();
126
+ throw new AuthError(`Token refresh failed: ${error}`);
127
+ }
128
+ const data = (await response.json());
129
+ this.tokens.access_token = data.access_token;
130
+ this.tokens.expires_at = Date.now() + data.expires_in * 1000;
131
+ await this.saveTokens(this.tokens);
132
+ return data.access_token;
133
+ }
134
+ // ── Private helpers ──────────────────────────────────────────────
135
+ hasRequiredScopes() {
136
+ if (!this.tokens?.scopes)
137
+ return false;
138
+ return SCOPES.every((s) => this.tokens.scopes.includes(s));
139
+ }
140
+ async clearTokens() {
141
+ this.tokens = null;
142
+ this.tokensLoaded = true;
143
+ if (existsSync(this.tokenPath)) {
144
+ const { unlink } = await import('node:fs/promises');
145
+ await unlink(this.tokenPath);
146
+ }
147
+ }
148
+ async ensureTokensLoaded() {
149
+ if (this.tokensLoaded)
150
+ return;
151
+ try {
152
+ if (existsSync(this.tokenPath)) {
153
+ const data = await readFile(this.tokenPath, 'utf-8');
154
+ this.tokens = JSON.parse(data);
155
+ }
156
+ }
157
+ catch {
158
+ this.tokens = null;
159
+ }
160
+ this.tokensLoaded = true;
161
+ }
162
+ async saveTokens(tokens) {
163
+ this.tokens = tokens;
164
+ const dir = dirname(this.tokenPath);
165
+ if (!existsSync(dir)) {
166
+ await mkdir(dir, { recursive: true });
167
+ }
168
+ await writeFile(this.tokenPath, JSON.stringify(tokens, null, 2));
169
+ }
170
+ async exchangeCodeForTokens(code, redirectUri) {
171
+ const response = await fetch(TOKEN_URL, {
172
+ method: 'POST',
173
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
174
+ body: new URLSearchParams({
175
+ code,
176
+ client_id: this.clientId,
177
+ client_secret: this.clientSecret,
178
+ redirect_uri: redirectUri,
179
+ grant_type: 'authorization_code',
180
+ }),
181
+ });
182
+ if (!response.ok) {
183
+ const error = await response.text();
184
+ throw new AuthError(error);
185
+ }
186
+ const data = (await response.json());
187
+ await this.saveTokens({
188
+ access_token: data.access_token,
189
+ refresh_token: data.refresh_token,
190
+ token_type: data.token_type,
191
+ expires_at: Date.now() + data.expires_in * 1000,
192
+ scopes: data.scope.split(' '),
193
+ });
194
+ }
195
+ }
196
+ //# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../../src/infrastructure/google/auth.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { IAuthService } from '../../domain/ports/auth-service.js';
2
+ import type { ICalendarService } from '../../domain/ports/calendar-service.js';
3
+ import type { CalendarEventInput, CalendarEventResult, CalendarEventListItem } from '../../domain/dto/calendar-event.js';
4
+ export declare class GoogleCalendarService implements ICalendarService {
5
+ private readonly auth;
6
+ private readonly defaultTimeZone;
7
+ constructor(auth: IAuthService, defaultTimeZone: string);
8
+ createEvent(input: CalendarEventInput): Promise<CalendarEventResult>;
9
+ listEvents(params: {
10
+ timeMin?: string;
11
+ timeMax?: string;
12
+ maxResults?: number;
13
+ query?: string;
14
+ }): Promise<CalendarEventListItem[]>;
15
+ getEvent(eventId: string): Promise<CalendarEventResult>;
16
+ updateEvent(eventId: string, input: Partial<CalendarEventInput>): Promise<CalendarEventResult>;
17
+ deleteEvent(eventId: string): Promise<void>;
18
+ private mapEventResult;
19
+ }