|
- import {inject, injectable} from 'tsyringe'
- import * as sqlite from 'sqlite3'
- import {models} from '@tonality/library-common'
-
- @injectable()
- export class RingtoneRepository {
- private readonly database: sqlite.Database;
- constructor(
- @inject('DATABASE_LOCATION')
- DATABASE_LOCATION: string
- ) {
- this.database = new sqlite.Database(DATABASE_LOCATION)
- }
-
- async get(id: string): Promise<models.Ringtone> {
- return new Promise((resolve, reject) => {
- this.database.get(
- `
- SELECT *
- FROM ringtone
- WHERE id = ?;
- `,
- [id],
- (err, result) => {
- if (err) {
- reject(err)
- return
- }
- resolve(result)
- }
- )
- })
- }
-
- async browse(skip: number, take: number): Promise<models.Ringtone[]> {
- return new Promise((resolve, reject) => {
- this.database.all(
- `
- SELECT *
- FROM ringtone
- LIMIT ?
- OFFSET ?;
- `,
- [take, skip],
- (err, result) => {
- if (err) {
- reject(err)
- return
- }
-
- resolve(result)
- })
- })
- }
-
- async search(q: string): Promise<models.Ringtone[]> {
- return new Promise((resolve, reject) => {
- this.database.all(
- `
- SELECT *
- FROM ringtone r
- JOIN composer c ON r.composerId = c.id
- WHERE LOWER(r.name) LIKE ? ESCAPE '\';
- `,
- [`%${q.toLowerCase().replace('\\', '\\\\')}%`],
- (err, result) => {
- if (err) {
- reject(err)
- return
- }
- resolve(result)
- }
- )
- })
- }
-
- async create(data: Partial<models.Ringtone>): Promise<models.Ringtone> {
- return new Promise((resolve, reject) => {
-
- this.database.serialize(() => {
- this.database.run(
- `
- INSERT
- INTO ringtone
- VALUES (?, ?, ?, ?, ?, NULL, ?);
- `,
- [data.id, data.name, data.data, data.createdAt, data.updatedAt, data.composerId],
- (err) => {
- if (err) {
- reject(err)
- return
- }
- }
- )
- this.database.get(
- `
- SELECT *
- FROM ringtone
- WHERE id = ?;
- `,
- [data.id],
- (err, result) => {
- if (err) {
- reject(err)
- return
- }
- resolve(result)
- }
- )
- })
- })
- }
-
- async update(data: Partial<models.Ringtone>): Promise<models.Ringtone> {
- return new Promise((resolve, reject) => {
- this.database.serialize(() => {
- this.database.run(
- `
- UPDATE ringtone
- SET
- name = ?,
- data = ?,
- updatedAt = ?
- WHERE id = ?;
- `,
- [data.name, data.data, data.updatedAt, data.id],
- (err) => {
- if (err) {
- reject(err)
- return
- }
- }
- )
- this.database.get(
- `
- SELECT *
- FROM ringtone
- WHERE id = ?;
- `,
- [data.id],
- (err, result) => {
- if (err) {
- reject(err)
- return
- }
- console.log(result, data.id)
- resolve(result)
- }
- )
- })
- })
- }
-
- async softDelete(id: string, deletedAt: Date): Promise<models.Ringtone> {
- return new Promise((resolve, reject) => {
- this.database.serialize(() => {
- this.database.run(
- `
- UPDATE ringtone
- SET deletedAt = ?
- WHERE id = ?
- `,
- [deletedAt, id],
- (err) => {
- if (err) {
- reject(err)
- return
- }
- }
- )
- this.database.get(
- `
- SELECT *
- FROM ringtone
- WHERE id = ?;
- `,
- [id],
- (err, result) => {
- if (err) {
- reject(err)
- return
- }
- resolve(result)
- }
- )
- })
- })
- }
-
- async undoDelete(id: string): Promise<models.Ringtone> {
- return new Promise((resolve, reject) => {
- this.database.serialize(() => {
- this.database.run(
- `
- UPDATE ringtone
- SET deletedAt = NULL
- WHERE id = ?
- `,
- [id],
- (err) => {
- if (err) {
- reject(err)
- return
- }
- }
- )
- this.database.get(
- `
- SELECT *
- FROM ringtone
- WHERE id = ?;
- `,
- [id],
- (err, result) => {
- if (err) {
- reject(err)
- return
- }
- resolve(result)
- }
- )
- })
- })
- }
-
- async hardDelete(id: string): Promise<models.Ringtone> {
- return new Promise((resolve, reject) => {
- this.database.serialize(() => {
- this.database.get(
- `
- SELECT *
- FROM ringtone
- WHERE id = ?;
- `,
- [id],
- (err, result) => {
- if (err) {
- reject(err)
- return
- }
- resolve(result)
- }
- )
- this.database.run(
- `
- DELETE
- FROM ringtone
- WHERE id = ?
- `,
- [id],
- (err) => {
- if (err) {
- reject(err)
- return
- }
- }
- )
- })
- })
- }
- }
|