hyper-tuner-cloud/src/hooks/useDb.ts

128 lines
3.5 KiB
TypeScript

import * as Sentry from '@sentry/browser';
import {
Models,
Query,
} from 'appwrite';
import { database } from '../appwrite';
import {
TuneDbData,
UsersBucket,
TuneDbDataPartial,
TuneDbDocument,
} from '../types/dbData';
import { databaseGenericError } from '../pages/auth/notifications';
import { fetchEnv } from '../utils/env';
const COLLECTION_ID_PUBLIC_TUNES = fetchEnv('VITE_APPWRITE_COLLECTION_ID_PUBLIC_TUNES');
const COLLECTION_ID_USERS_BUCKETS = fetchEnv('VITE_APPWRITE_COLLECTION_ID_USERS_BUCKETS');
const useDb = () => {
const updateTune = async (documentId: string, data: TuneDbDataPartial) => {
try {
await database.updateDocument(COLLECTION_ID_PUBLIC_TUNES, documentId, data);
return Promise.resolve();
} catch (error) {
Sentry.captureException(error);
console.error(error);
databaseGenericError(error as Error);
return Promise.reject(error);
}
};
const createTune = async (data: TuneDbData) => {
try {
const tune = await database.createDocument(
COLLECTION_ID_PUBLIC_TUNES,
'unique()',
data,
['role:all'],
[`user:${data.userId}`],
);
return Promise.resolve(tune);
} catch (error) {
Sentry.captureException(error);
console.error(error);
databaseGenericError(error as Error);
return Promise.reject(error);
}
};
const getTune = async (tuneId: string) => {
try {
const tune = await database.listDocuments(
COLLECTION_ID_PUBLIC_TUNES,
[Query.equal('tuneId', tuneId)],
1,
);
return Promise.resolve(tune.total > 0 ? tune.documents[0] as unknown as TuneDbDocument : null);
} catch (error) {
Sentry.captureException(error);
console.error(error);
databaseGenericError(error as Error);
return Promise.reject(error);
}
};
const getBucketId = async (userId: string) => {
try {
const buckets = await database.listDocuments(
COLLECTION_ID_USERS_BUCKETS,
[
Query.equal('userId', userId),
Query.equal('visibility', 'public'),
],
1,
);
if (buckets.total === 0) {
throw new Error('No public bucket found');
}
return Promise.resolve((buckets.documents[0] as unknown as UsersBucket)!.bucketId);
} catch (error) {
Sentry.captureException(error);
console.error(error);
databaseGenericError(error as Error);
return Promise.reject(error);
}
};
const searchTunes = async (search?: string) => {
// TODO: add pagination
const limit = 100;
try {
const list: Models.DocumentList<TuneDbDocument> = await (
search
? database.listDocuments(COLLECTION_ID_PUBLIC_TUNES, [Query.search('textSearch', search)], limit)
: database.listDocuments(COLLECTION_ID_PUBLIC_TUNES, [], limit)
);
return Promise.resolve(list);
} catch (error) {
Sentry.captureException(error);
console.error(error);
databaseGenericError(error as Error);
return Promise.reject(error);
}
};
return {
updateTune: (tuneId: string, data: TuneDbDataPartial): Promise<void> => updateTune(tuneId, data),
createTune: (data: TuneDbData): Promise<Models.Document> => createTune(data),
getTune: (tuneId: string): Promise<TuneDbDocument | null> => getTune(tuneId),
searchTunes: (search?: string): Promise<Models.DocumentList<TuneDbDocument>> => searchTunes(search),
getBucketId: (userId: string): Promise<string> => getBucketId(userId),
};
};
export default useDb;