Files
calories-tracker/src/appwrite.ts
T

334 lines
9.2 KiB
TypeScript
Raw Normal View History

2025-10-30 13:18:01 -03:00
import { Client, Account, Databases, Query, ID } from 'appwrite';
import { DailyTotalCalories, FoodStorage, UserSettings, SharedDay } from './types';
2025-06-12 18:30:11 -03:00
// Initialize Appwrite client
const client = new Client();
client
2025-06-13 21:03:36 -03:00
.setEndpoint(import.meta.env.VITE_APPWRITE_ENDPOINT)
.setProject("684ac3bf000ee8950f5a");
2025-06-12 18:30:11 -03:00
// Initialize services
export const account = new Account(client);
export const databases = new Databases(client);
// Configuration constants
2025-06-13 21:03:36 -03:00
export const DATABASE_ID = import.meta.env.VITE_APPWRITE_DBID
export const FOOD_ENTRIES_COLLECTION_ID = import.meta.env.VITE_APPWRITE_FOODENTRIESID
export const USER_SETTINGS_COLLECTION_ID = import.meta.env.VITE_APPWRITE_USERSETTINGSID
2025-09-04 17:12:14 -03:00
export const MONTHLY_CALORIES_COLLECTION_ID = import.meta.env.VITE_APPWRITE_MONTLYCALORIESID
2025-10-30 13:18:01 -03:00
export const SHARED_DAYS_COLLECTION_ID = import.meta.env.VITE_APPWRITE_SHAREDDAYSID
2025-06-12 18:30:11 -03:00
// Auth helper functions
export class AppwriteAuth {
// Register new user
static async register(email: string, password: string, name: string) {
try {
const response = await account.create('unique()', email, password, name);
console.debug('User registered:', response);
return response;
} catch (error) {
console.error('Registration error:', error);
throw error;
}
}
// Login user
static async login(email: string, password: string) {
try {
const session = await account.createEmailPasswordSession(email, password);
console.debug('User logged in:', session);
return session;
} catch (error) {
console.error('Login error:', error);
throw error;
}
}
// Logout user
static async logout() {
try {
await account.deleteSession('current');
console.debug('User logged out');
} catch (error) {
console.error('Logout error:', error);
throw error;
}
}
// Get current user
static async getCurrentUser() {
try {
const user = await account.get();
return user;
} catch (error) {
console.error('Get user error:', error);
return null;
}
}
// Check if user is logged in
static async isLoggedIn() {
try {
await account.get();
return true;
} catch {
return false;
}
}
}
// Database helper functions
export class AppwriteDB {
// Save food entry
static async saveFoodEntry(entryData: FoodStorage) {
try {
const response = await databases.createDocument(
DATABASE_ID,
FOOD_ENTRIES_COLLECTION_ID,
'unique()',
{
...entryData,
userId: (await account.get()).$id,
}
);
2025-06-12 18:52:44 -03:00
console.debug('Food entry saved:', response);
2025-06-12 18:30:11 -03:00
return response;
} catch (error) {
console.error('Save food entry error:', error);
throw error;
}
}
2025-09-04 12:51:43 -03:00
// Upadte food entry
static async updateFoodEntry(documentId: string, entryData: Partial<FoodStorage>) {
try {
const response = await databases.updateDocument(
DATABASE_ID,
FOOD_ENTRIES_COLLECTION_ID,
documentId,
{
...entryData,
userId: (await account.get()).$id,
}
);
console.debug('Food entry updated:', response);
return response;
} catch (error) {
console.error('Update food entry error:', error);
throw error;
}
}
2025-06-13 19:18:31 -03:00
// Save food entry
static async saveUserSettings(userSettings: UserSettings) {
try {
const response = await databases.createDocument(
DATABASE_ID,
USER_SETTINGS_COLLECTION_ID,
'unique()',
{
...userSettings,
userId: (await account.get()).$id,
}
);
console.debug('User settings saved:', response);
return response;
} catch (error) {
console.error('Save user settings error:', error);
throw error;
}
}
2025-06-12 18:30:11 -03:00
// Get user's food entries for a specific date
static async getFoodEntries(date: Date) {
try {
const user = await account.get();
2025-06-13 21:25:24 -03:00
const localDateTime = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();
2025-06-12 18:30:11 -03:00
const response = await databases.listDocuments(
DATABASE_ID,
FOOD_ENTRIES_COLLECTION_ID,
[
Query.equal('userId', user.$id),
2025-06-13 21:25:24 -03:00
Query.equal('date', localDateTime.split('T')[0]),
2025-10-30 11:51:39 -03:00
Query.limit(50)
2025-06-12 18:30:11 -03:00
]
);
console.debug('Food entries retrieved:', response);
return response.documents;
} catch (error) {
console.error('Get food entries error:', error);
throw error;
}
}
2025-09-04 17:12:14 -03:00
// Get all calories for a particular date
static async getMonthlyCalories(date: Date) {
try {
const user = await account.get();
const localDateTime = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();
const response = await databases.listDocuments(
DATABASE_ID,
MONTHLY_CALORIES_COLLECTION_ID,
[
Query.equal('userId', user.$id),
Query.startsWith('date', localDateTime.substring(0, 7)),
2025-10-30 11:51:39 -03:00
Query.limit(40)
2025-09-04 17:12:14 -03:00
]
);
console.debug('Food entries retrieved:', response);
return response.documents;
} catch (error) {
console.error('Get all calories for month error:', error);
throw error;
}
}
static async createMonthlyCaloryForDay(date: Date, totalCalories: number) {
try {
const localDateTime = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();
const response = await databases.createDocument(
DATABASE_ID,
MONTHLY_CALORIES_COLLECTION_ID ,
'unique()',
{
userId: (await account.get()).$id,
date: localDateTime.substring(0, 10),
totalCalories: totalCalories
}
);
console.debug('User settings saved:', response);
return response;
} catch (error) {
console.error('Save user settings error:', error);
throw error;
}
}
static async updateMonthlyCaloryForDay(id: string, date: Date, totalCalories: number) {
try {
const localDateTime = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();
const response = await databases.updateDocument(
DATABASE_ID,
MONTHLY_CALORIES_COLLECTION_ID ,
id,
{
userId: (await account.get()).$id,
date: localDateTime.substring(0, 10),
totalCalories: totalCalories
}
);
console.debug('User settings saved:', response);
return response;
} catch (error) {
console.error('Save user settings error:', error);
throw error;
}
}
2025-06-13 19:18:31 -03:00
// get user's settings
static async getUserSettings() {
try {
const user = await account.get();
const response = await databases.listDocuments(
DATABASE_ID,
USER_SETTINGS_COLLECTION_ID,
[
Query.equal('userId', user.$id),
]
);
console.debug('User settings retrieved:', response);
return response.documents;
} catch (error) {
console.error('Get user settings error:', error);
throw error;
}
}
static async deleteUserSettings(documentId: string) {
try {
await databases.deleteDocument(
DATABASE_ID,
USER_SETTINGS_COLLECTION_ID,
documentId
);
console.debug('User settings deleted:', documentId);
} catch (error) {
console.error('Delete user settings error:', error);
throw error;
}
}
2025-06-12 18:30:11 -03:00
// Delete food entry
static async deleteFoodEntry(documentId: string) {
try {
await databases.deleteDocument(
DATABASE_ID,
FOOD_ENTRIES_COLLECTION_ID,
documentId
);
console.debug('Food entry deleted:', documentId);
} catch (error) {
console.error('Delete food entry error:', error);
throw error;
}
}
2025-10-30 13:18:01 -03:00
// Create shared day snapshot
static async createSharedDay(date: Date, foodEntries: FoodStorage[]) {
try {
const user = await account.get();
const shareId = ID.unique();
const localDateTime = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();
const response = await databases.createDocument(
DATABASE_ID,
SHARED_DAYS_COLLECTION_ID,
'unique()',
{
shareId: shareId,
userId: user.$id,
userName: user.name,
date: localDateTime.split('T')[0],
foodEntries: JSON.stringify(foodEntries),
createdAt: new Date().toISOString()
}
);
console.debug('Shared day created:', response);
return response;
} catch (error) {
console.error('Create shared day error:', error);
throw error;
}
}
// Get shared day by share ID
static async getSharedDay(shareId: string) {
try {
const response = await databases.listDocuments(
DATABASE_ID,
SHARED_DAYS_COLLECTION_ID,
[
Query.equal('shareId', shareId),
Query.limit(1)
]
);
if (response.documents.length === 0) {
throw new Error('Shared day not found');
}
console.debug('Shared day retrieved:', response.documents[0]);
return response.documents[0];
} catch (error) {
console.error('Get shared day error:', error);
throw error;
}
}
2025-06-12 18:30:11 -03:00
}