@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.
- package/dist/domain/dto/calendar-event.d.ts +29 -0
- package/dist/domain/dto/calendar-event.js +2 -0
- package/dist/domain/dto/calendar-event.js.map +1 -0
- package/dist/domain/dto/contact.d.ts +26 -0
- package/dist/domain/dto/contact.js +2 -0
- package/dist/domain/dto/contact.js.map +1 -0
- package/dist/domain/dto/email.d.ts +36 -0
- package/dist/domain/dto/email.js +2 -0
- package/dist/domain/dto/email.js.map +1 -0
- package/dist/domain/dto/index.d.ts +4 -0
- package/dist/domain/dto/index.js +2 -0
- package/dist/domain/dto/index.js.map +1 -0
- package/dist/domain/dto/task.d.ts +25 -0
- package/dist/domain/dto/task.js +2 -0
- package/dist/domain/dto/task.js.map +1 -0
- package/dist/domain/ports/auth-service.d.ts +9 -0
- package/dist/domain/ports/auth-service.js +2 -0
- package/dist/domain/ports/auth-service.js.map +1 -0
- package/dist/domain/ports/calendar-service.d.ts +13 -0
- package/dist/domain/ports/calendar-service.js +2 -0
- package/dist/domain/ports/calendar-service.js.map +1 -0
- package/dist/domain/ports/contacts-service.d.ts +10 -0
- package/dist/domain/ports/contacts-service.js +2 -0
- package/dist/domain/ports/contacts-service.js.map +1 -0
- package/dist/domain/ports/gmail-service.d.ts +10 -0
- package/dist/domain/ports/gmail-service.js +2 -0
- package/dist/domain/ports/gmail-service.js.map +1 -0
- package/dist/domain/ports/index.d.ts +5 -0
- package/dist/domain/ports/index.js +2 -0
- package/dist/domain/ports/index.js.map +1 -0
- package/dist/domain/ports/tasks-service.d.ts +15 -0
- package/dist/domain/ports/tasks-service.js +2 -0
- package/dist/domain/ports/tasks-service.js.map +1 -0
- package/dist/infrastructure/config/app-config.d.ts +7 -0
- package/dist/infrastructure/config/app-config.js +14 -0
- package/dist/infrastructure/config/app-config.js.map +1 -0
- package/dist/infrastructure/google/auth.service.d.ts +21 -0
- package/dist/infrastructure/google/auth.service.js +196 -0
- package/dist/infrastructure/google/auth.service.js.map +1 -0
- package/dist/infrastructure/google/calendar.service.d.ts +19 -0
- package/dist/infrastructure/google/calendar.service.js +137 -0
- package/dist/infrastructure/google/calendar.service.js.map +1 -0
- package/dist/infrastructure/google/contacts.service.d.ts +17 -0
- package/dist/infrastructure/google/contacts.service.js +182 -0
- package/dist/infrastructure/google/contacts.service.js.map +1 -0
- package/dist/infrastructure/google/gmail.service.d.ts +17 -0
- package/dist/infrastructure/google/gmail.service.js +165 -0
- package/dist/infrastructure/google/gmail.service.js.map +1 -0
- package/dist/infrastructure/google/index.d.ts +5 -0
- package/dist/infrastructure/google/index.js +6 -0
- package/dist/infrastructure/google/index.js.map +1 -0
- package/dist/infrastructure/google/tasks.service.d.ts +20 -0
- package/dist/infrastructure/google/tasks.service.js +133 -0
- package/dist/infrastructure/google/tasks.service.js.map +1 -0
- package/dist/interface/cli/index.d.ts +2 -0
- package/dist/interface/cli/index.js +15 -0
- package/dist/interface/cli/index.js.map +1 -0
- package/dist/interface/mcp/server.d.ts +2 -0
- package/dist/interface/mcp/server.js +84 -0
- package/dist/interface/mcp/server.js.map +1 -0
- package/dist/interface/mcp/tools/authorize-google.d.ts +3 -0
- package/dist/interface/mcp/tools/authorize-google.js +20 -0
- package/dist/interface/mcp/tools/authorize-google.js.map +1 -0
- package/dist/interface/mcp/tools/complete-task.d.ts +3 -0
- package/dist/interface/mcp/tools/complete-task.js +19 -0
- package/dist/interface/mcp/tools/complete-task.js.map +1 -0
- package/dist/interface/mcp/tools/create-contact.d.ts +3 -0
- package/dist/interface/mcp/tools/create-contact.js +34 -0
- package/dist/interface/mcp/tools/create-contact.js.map +1 -0
- package/dist/interface/mcp/tools/create-event.d.ts +3 -0
- package/dist/interface/mcp/tools/create-event.js +32 -0
- package/dist/interface/mcp/tools/create-event.js.map +1 -0
- package/dist/interface/mcp/tools/create-task-list.d.ts +3 -0
- package/dist/interface/mcp/tools/create-task-list.js +18 -0
- package/dist/interface/mcp/tools/create-task-list.js.map +1 -0
- package/dist/interface/mcp/tools/create-task.d.ts +3 -0
- package/dist/interface/mcp/tools/create-task.js +27 -0
- package/dist/interface/mcp/tools/create-task.js.map +1 -0
- package/dist/interface/mcp/tools/delete-contact.d.ts +3 -0
- package/dist/interface/mcp/tools/delete-contact.js +20 -0
- package/dist/interface/mcp/tools/delete-contact.js.map +1 -0
- package/dist/interface/mcp/tools/delete-event.d.ts +3 -0
- package/dist/interface/mcp/tools/delete-event.js +20 -0
- package/dist/interface/mcp/tools/delete-event.js.map +1 -0
- package/dist/interface/mcp/tools/delete-task.d.ts +3 -0
- package/dist/interface/mcp/tools/delete-task.js +21 -0
- package/dist/interface/mcp/tools/delete-task.js.map +1 -0
- package/dist/interface/mcp/tools/get-event.d.ts +3 -0
- package/dist/interface/mcp/tools/get-event.js +18 -0
- package/dist/interface/mcp/tools/get-event.js.map +1 -0
- package/dist/interface/mcp/tools/get-status.d.ts +3 -0
- package/dist/interface/mcp/tools/get-status.js +38 -0
- package/dist/interface/mcp/tools/get-status.js.map +1 -0
- package/dist/interface/mcp/tools/get-task.d.ts +3 -0
- package/dist/interface/mcp/tools/get-task.js +19 -0
- package/dist/interface/mcp/tools/get-task.js.map +1 -0
- package/dist/interface/mcp/tools/list-contacts.d.ts +3 -0
- package/dist/interface/mcp/tools/list-contacts.js +18 -0
- package/dist/interface/mcp/tools/list-contacts.js.map +1 -0
- package/dist/interface/mcp/tools/list-emails.d.ts +3 -0
- package/dist/interface/mcp/tools/list-emails.js +24 -0
- package/dist/interface/mcp/tools/list-emails.js.map +1 -0
- package/dist/interface/mcp/tools/list-events.d.ts +3 -0
- package/dist/interface/mcp/tools/list-events.js +26 -0
- package/dist/interface/mcp/tools/list-events.js.map +1 -0
- package/dist/interface/mcp/tools/list-task-lists.d.ts +3 -0
- package/dist/interface/mcp/tools/list-task-lists.js +15 -0
- package/dist/interface/mcp/tools/list-task-lists.js.map +1 -0
- package/dist/interface/mcp/tools/list-tasks.d.ts +3 -0
- package/dist/interface/mcp/tools/list-tasks.js +25 -0
- package/dist/interface/mcp/tools/list-tasks.js.map +1 -0
- package/dist/interface/mcp/tools/read-email.d.ts +3 -0
- package/dist/interface/mcp/tools/read-email.js +18 -0
- package/dist/interface/mcp/tools/read-email.js.map +1 -0
- package/dist/interface/mcp/tools/search-contacts.d.ts +3 -0
- package/dist/interface/mcp/tools/search-contacts.js +18 -0
- package/dist/interface/mcp/tools/search-contacts.js.map +1 -0
- package/dist/interface/mcp/tools/send-email.d.ts +3 -0
- package/dist/interface/mcp/tools/send-email.js +30 -0
- package/dist/interface/mcp/tools/send-email.js.map +1 -0
- package/dist/interface/mcp/tools/update-contact.d.ts +3 -0
- package/dist/interface/mcp/tools/update-contact.js +33 -0
- package/dist/interface/mcp/tools/update-contact.js.map +1 -0
- package/dist/interface/mcp/tools/update-event.d.ts +3 -0
- package/dist/interface/mcp/tools/update-event.js +31 -0
- package/dist/interface/mcp/tools/update-event.js.map +1 -0
- package/dist/interface/mcp/tools/update-task.d.ts +3 -0
- package/dist/interface/mcp/tools/update-task.js +26 -0
- package/dist/interface/mcp/tools/update-task.js.map +1 -0
- package/dist/interface/mcp/types.d.ts +12 -0
- package/dist/interface/mcp/types.js +2 -0
- package/dist/interface/mcp/types.js.map +1 -0
- package/dist/shared/errors/index.d.ts +26 -0
- package/dist/shared/errors/index.js +46 -0
- package/dist/shared/errors/index.js.map +1 -0
- package/dist/shared/utils/html-page.d.ts +1 -0
- package/dist/shared/utils/html-page.js +9 -0
- package/dist/shared/utils/html-page.js.map +1 -0
- package/dist/shared/utils/index.d.ts +2 -0
- package/dist/shared/utils/index.js +3 -0
- package/dist/shared/utils/index.js.map +1 -0
- package/dist/shared/utils/open-browser.d.ts +1 -0
- package/dist/shared/utils/open-browser.js +10 -0
- package/dist/shared/utils/open-browser.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../../src/domain/dto/task.ts"],"names":[],"mappings":""}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"tasks-service.js","sourceRoot":"","sources":["../../../src/domain/ports/tasks-service.ts"],"names":[],"mappings":""}
|
|
@@ -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
|
+
}
|