|
|
@@ -1,74 +1,94 @@
|
|
|
import { Injectable } from '@angular/core';
|
|
|
-import Parse from 'parse';
|
|
|
+import * as Parse from 'parse';
|
|
|
+
|
|
|
+export interface FocusRecord {
|
|
|
+ id?: string;
|
|
|
+ duration: number;
|
|
|
+ category: string;
|
|
|
+ startTime: Date;
|
|
|
+ endTime: Date;
|
|
|
+ userId?: string;
|
|
|
+}
|
|
|
|
|
|
@Injectable({
|
|
|
providedIn: 'root'
|
|
|
})
|
|
|
export class FocusDataService {
|
|
|
- constructor() {}
|
|
|
-
|
|
|
- async getFocusRecords(): Promise<any[]> {
|
|
|
+
|
|
|
+ async addFocusRecord(record: FocusRecord): Promise<Parse.Object> {
|
|
|
try {
|
|
|
+ const currentUser = Parse.User.current();
|
|
|
+ if (!currentUser) {
|
|
|
+ throw new Error('No user logged in');
|
|
|
+ }
|
|
|
+
|
|
|
const FocusRecord = Parse.Object.extend('FocusRecord');
|
|
|
- const query = new Parse.Query(FocusRecord);
|
|
|
- query.descending('startTime');
|
|
|
- const results = await query.find();
|
|
|
-
|
|
|
- return results.map(record => ({
|
|
|
- id: record.id,
|
|
|
- category: record.get('category'),
|
|
|
- duration: record.get('duration'),
|
|
|
- startTime: record.get('startTime'),
|
|
|
- endTime: record.get('endTime')
|
|
|
- }));
|
|
|
+ const focusRecord = new FocusRecord();
|
|
|
+
|
|
|
+ // 设置记录数据
|
|
|
+ focusRecord.set({
|
|
|
+ duration: record.duration,
|
|
|
+ category: record.category,
|
|
|
+ startTime: record.startTime,
|
|
|
+ endTime: record.endTime,
|
|
|
+ user: currentUser
|
|
|
+ });
|
|
|
+
|
|
|
+ // 设置 ACL
|
|
|
+ const acl = new Parse.ACL();
|
|
|
+ acl.setPublicReadAccess(false);
|
|
|
+ acl.setPublicWriteAccess(false);
|
|
|
+ acl.setReadAccess(currentUser.id, true);
|
|
|
+ acl.setWriteAccess(currentUser.id, true);
|
|
|
+ focusRecord.setACL(acl);
|
|
|
+
|
|
|
+ return await focusRecord.save();
|
|
|
} catch (error) {
|
|
|
- console.error('获取专注记录失败:', error);
|
|
|
+ console.error('保存专注记录失败:', error);
|
|
|
throw error;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- async getTasks(): Promise<any[]> {
|
|
|
+ async getFocusRecords(): Promise<Parse.Object[]> {
|
|
|
try {
|
|
|
- const Task = Parse.Object.extend('Task');
|
|
|
- const query = new Parse.Query(Task);
|
|
|
+ const currentUser = Parse.User.current();
|
|
|
+ if (!currentUser) {
|
|
|
+ throw new Error('No user logged in');
|
|
|
+ }
|
|
|
+
|
|
|
+ const query = new Parse.Query('FocusRecord');
|
|
|
+ query.equalTo('user', currentUser);
|
|
|
query.descending('createdAt');
|
|
|
- const results = await query.find();
|
|
|
|
|
|
- return results.map(task => ({
|
|
|
- id: task.id,
|
|
|
- title: task.get('title'),
|
|
|
- category: task.get('category'),
|
|
|
- completed: task.get('completed'),
|
|
|
- createdAt: task.get('createdAt')
|
|
|
- }));
|
|
|
- } catch (error) {
|
|
|
- console.error('获取任务数据失败:', error);
|
|
|
- throw error;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- async addFocusRecord(record: any): Promise<Parse.Object> {
|
|
|
- try {
|
|
|
- const FocusRecord = Parse.Object.extend('FocusRecord');
|
|
|
- const newRecord = new FocusRecord();
|
|
|
+ // 添加调试日志
|
|
|
+ console.log('Querying records for user:', currentUser.id);
|
|
|
|
|
|
- newRecord.set('category', record.category);
|
|
|
- newRecord.set('duration', record.duration);
|
|
|
- newRecord.set('startTime', record.startTime);
|
|
|
- newRecord.set('endTime', record.endTime);
|
|
|
+ const results = await query.find();
|
|
|
+ console.log('Found records:', results.length);
|
|
|
|
|
|
- return await newRecord.save();
|
|
|
+ return results;
|
|
|
} catch (error) {
|
|
|
- console.error('保存专注记录失败:', error);
|
|
|
+ console.error('获取专注记录失败:', error);
|
|
|
throw error;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
async deleteFocusRecord(recordId: string): Promise<void> {
|
|
|
try {
|
|
|
- const FocusRecord = Parse.Object.extend('FocusRecord');
|
|
|
- const query = new Parse.Query(FocusRecord);
|
|
|
+ const currentUser = Parse.User.current();
|
|
|
+ if (!currentUser) {
|
|
|
+ throw new Error('No user logged in');
|
|
|
+ }
|
|
|
+
|
|
|
+ const query = new Parse.Query('FocusRecord');
|
|
|
const record = await query.get(recordId);
|
|
|
+
|
|
|
+ // 验证记录所有权
|
|
|
+ const recordUser = record.get('user');
|
|
|
+ if (recordUser.id !== currentUser.id) {
|
|
|
+ throw new Error('无权删除此记录');
|
|
|
+ }
|
|
|
+
|
|
|
await record.destroy();
|
|
|
} catch (error) {
|
|
|
console.error('删除专注记录失败:', error);
|
|
|
@@ -76,48 +96,86 @@ export class FocusDataService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- async addTask(task: any): Promise<string> {
|
|
|
+ // 获取今日专注统计
|
|
|
+ async getTodayStats(): Promise<{ totalDuration: number; recordCount: number }> {
|
|
|
try {
|
|
|
- const Task = Parse.Object.extend('Task');
|
|
|
- const newTask = new Task();
|
|
|
-
|
|
|
- newTask.set('title', task.title);
|
|
|
- newTask.set('category', task.category);
|
|
|
- newTask.set('completed', task.completed || false);
|
|
|
+ const currentUser = Parse.User.current();
|
|
|
+ if (!currentUser) {
|
|
|
+ throw new Error('No user logged in');
|
|
|
+ }
|
|
|
+
|
|
|
+ const today = new Date();
|
|
|
+ today.setHours(0, 0, 0, 0);
|
|
|
+
|
|
|
+ const query = new Parse.Query('FocusRecord');
|
|
|
+ query.equalTo('user', currentUser);
|
|
|
+ query.greaterThanOrEqualTo('startTime', today);
|
|
|
|
|
|
- const result = await newTask.save();
|
|
|
- return result.id;
|
|
|
+ const records = await query.find();
|
|
|
+ const totalDuration = records.reduce((sum, record) => sum + record.get('duration'), 0);
|
|
|
+
|
|
|
+ return {
|
|
|
+ totalDuration,
|
|
|
+ recordCount: records.length
|
|
|
+ };
|
|
|
} catch (error) {
|
|
|
- console.error('保存任务失败:', error);
|
|
|
+ console.error('获取今日统计失败:', error);
|
|
|
throw error;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- async updateTask(taskId: string, updates: any): Promise<void> {
|
|
|
+ // 获取指定日期范围的统计
|
|
|
+ async getStatsForDateRange(startDate: Date, endDate: Date): Promise<{ totalDuration: number; recordCount: number }> {
|
|
|
try {
|
|
|
- const Task = Parse.Object.extend('Task');
|
|
|
- const query = new Parse.Query(Task);
|
|
|
- const task = await query.get(taskId);
|
|
|
-
|
|
|
- Object.keys(updates).forEach(key => {
|
|
|
- task.set(key, updates[key]);
|
|
|
- });
|
|
|
+ const currentUser = Parse.User.current();
|
|
|
+ if (!currentUser) {
|
|
|
+ throw new Error('No user logged in');
|
|
|
+ }
|
|
|
+
|
|
|
+ const query = new Parse.Query('FocusRecord');
|
|
|
+ query.equalTo('user', currentUser);
|
|
|
+ query.greaterThanOrEqualTo('startTime', startDate);
|
|
|
+ query.lessThan('startTime', endDate);
|
|
|
|
|
|
- await task.save();
|
|
|
+ const records = await query.find();
|
|
|
+ const totalDuration = records.reduce((sum, record) => sum + record.get('duration'), 0);
|
|
|
+
|
|
|
+ return {
|
|
|
+ totalDuration,
|
|
|
+ recordCount: records.length
|
|
|
+ };
|
|
|
} catch (error) {
|
|
|
- console.error('更新任务失败:', error);
|
|
|
+ console.error('获取日期范围统计失败:', error);
|
|
|
throw error;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- async deleteTask(taskId: string): Promise<void> {
|
|
|
+ // 获取按类别分组的统计
|
|
|
+ async getStatsByCategory(): Promise<{ [category: string]: { totalDuration: number; recordCount: number } }> {
|
|
|
try {
|
|
|
- const Task = Parse.Object.extend('Task');
|
|
|
- const query = new Parse.Query(Task);
|
|
|
- const task = await query.get(taskId);
|
|
|
- await task.destroy();
|
|
|
+ const currentUser = Parse.User.current();
|
|
|
+ if (!currentUser) {
|
|
|
+ throw new Error('No user logged in');
|
|
|
+ }
|
|
|
+
|
|
|
+ const query = new Parse.Query('FocusRecord');
|
|
|
+ query.equalTo('user', currentUser);
|
|
|
+
|
|
|
+ const records = await query.find();
|
|
|
+ const stats: { [category: string]: { totalDuration: number; recordCount: number } } = {};
|
|
|
+
|
|
|
+ records.forEach(record => {
|
|
|
+ const category = record.get('category');
|
|
|
+ if (!stats[category]) {
|
|
|
+ stats[category] = { totalDuration: 0, recordCount: 0 };
|
|
|
+ }
|
|
|
+ stats[category].totalDuration += record.get('duration');
|
|
|
+ stats[category].recordCount += 1;
|
|
|
+ });
|
|
|
+
|
|
|
+ return stats;
|
|
|
} catch (error) {
|
|
|
- console.error('删除任务失败:', error);
|
|
|
+ console.error('获取类别统计失败:', error);
|
|
|
throw error;
|
|
|
}
|
|
|
}
|