Ringtone app
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

262 lines
4.5 KiB

  1. import {inject, injectable} from 'tsyringe'
  2. import * as sqlite from 'sqlite3'
  3. import {models} from '@tonality/library-common'
  4. @injectable()
  5. export class RingtoneRepository {
  6. private readonly database: sqlite.Database;
  7. constructor(
  8. @inject('DATABASE_LOCATION')
  9. DATABASE_LOCATION: string
  10. ) {
  11. this.database = new sqlite.Database(DATABASE_LOCATION)
  12. }
  13. async get(id: string): Promise<models.Ringtone> {
  14. return new Promise((resolve, reject) => {
  15. this.database.get(
  16. `
  17. SELECT *
  18. FROM ringtone
  19. WHERE id = ?;
  20. `,
  21. [id],
  22. (err, result) => {
  23. if (err) {
  24. reject(err)
  25. return
  26. }
  27. resolve(result)
  28. }
  29. )
  30. })
  31. }
  32. async browse(skip: number, take: number): Promise<models.Ringtone[]> {
  33. return new Promise((resolve, reject) => {
  34. this.database.all(
  35. `
  36. SELECT *
  37. FROM ringtone
  38. LIMIT ?
  39. OFFSET ?;
  40. `,
  41. [take, skip],
  42. (err, result) => {
  43. if (err) {
  44. reject(err)
  45. return
  46. }
  47. resolve(result)
  48. })
  49. })
  50. }
  51. async search(q: string): Promise<models.Ringtone[]> {
  52. return new Promise((resolve, reject) => {
  53. this.database.all(
  54. `
  55. SELECT *
  56. FROM ringtone r
  57. JOIN composer c ON r.composerId = c.id
  58. WHERE LOWER(r.name) LIKE ? ESCAPE '\';
  59. `,
  60. [`%${q.toLowerCase().replace('\\', '\\\\')}%`],
  61. (err, result) => {
  62. if (err) {
  63. reject(err)
  64. return
  65. }
  66. resolve(result)
  67. }
  68. )
  69. })
  70. }
  71. async create(data: Partial<models.Ringtone>): Promise<models.Ringtone> {
  72. return new Promise((resolve, reject) => {
  73. this.database.serialize(() => {
  74. this.database.run(
  75. `
  76. INSERT
  77. INTO ringtone
  78. VALUES (?, ?, ?, ?, ?, NULL, ?);
  79. `,
  80. [data.id, data.name, data.data, data.createdAt, data.updatedAt, data.composerId],
  81. (err) => {
  82. if (err) {
  83. reject(err)
  84. return
  85. }
  86. }
  87. )
  88. this.database.get(
  89. `
  90. SELECT *
  91. FROM ringtone
  92. WHERE id = ?;
  93. `,
  94. [data.id],
  95. (err, result) => {
  96. if (err) {
  97. reject(err)
  98. return
  99. }
  100. resolve(result)
  101. }
  102. )
  103. })
  104. })
  105. }
  106. async update(data: Partial<models.Ringtone>): Promise<models.Ringtone> {
  107. return new Promise((resolve, reject) => {
  108. this.database.serialize(() => {
  109. this.database.run(
  110. `
  111. UPDATE ringtone
  112. SET
  113. name = ?,
  114. data = ?,
  115. updatedAt = ?
  116. WHERE id = ?;
  117. `,
  118. [data.name, data.data, data.updatedAt, data.id],
  119. (err) => {
  120. if (err) {
  121. reject(err)
  122. return
  123. }
  124. }
  125. )
  126. this.database.get(
  127. `
  128. SELECT *
  129. FROM ringtone
  130. WHERE id = ?;
  131. `,
  132. [data.id],
  133. (err, result) => {
  134. if (err) {
  135. reject(err)
  136. return
  137. }
  138. console.log(result, data.id)
  139. resolve(result)
  140. }
  141. )
  142. })
  143. })
  144. }
  145. async softDelete(id: string, deletedAt: Date): Promise<models.Ringtone> {
  146. return new Promise((resolve, reject) => {
  147. this.database.serialize(() => {
  148. this.database.run(
  149. `
  150. UPDATE ringtone
  151. SET deletedAt = ?
  152. WHERE id = ?
  153. `,
  154. [deletedAt, id],
  155. (err) => {
  156. if (err) {
  157. reject(err)
  158. return
  159. }
  160. }
  161. )
  162. this.database.get(
  163. `
  164. SELECT *
  165. FROM ringtone
  166. WHERE id = ?;
  167. `,
  168. [id],
  169. (err, result) => {
  170. if (err) {
  171. reject(err)
  172. return
  173. }
  174. resolve(result)
  175. }
  176. )
  177. })
  178. })
  179. }
  180. async undoDelete(id: string): Promise<models.Ringtone> {
  181. return new Promise((resolve, reject) => {
  182. this.database.serialize(() => {
  183. this.database.run(
  184. `
  185. UPDATE ringtone
  186. SET deletedAt = NULL
  187. WHERE id = ?
  188. `,
  189. [id],
  190. (err) => {
  191. if (err) {
  192. reject(err)
  193. return
  194. }
  195. }
  196. )
  197. this.database.get(
  198. `
  199. SELECT *
  200. FROM ringtone
  201. WHERE id = ?;
  202. `,
  203. [id],
  204. (err, result) => {
  205. if (err) {
  206. reject(err)
  207. return
  208. }
  209. resolve(result)
  210. }
  211. )
  212. })
  213. })
  214. }
  215. async hardDelete(id: string): Promise<models.Ringtone> {
  216. return new Promise((resolve, reject) => {
  217. this.database.serialize(() => {
  218. this.database.get(
  219. `
  220. SELECT *
  221. FROM ringtone
  222. WHERE id = ?;
  223. `,
  224. [id],
  225. (err, result) => {
  226. if (err) {
  227. reject(err)
  228. return
  229. }
  230. resolve(result)
  231. }
  232. )
  233. this.database.run(
  234. `
  235. DELETE
  236. FROM ringtone
  237. WHERE id = ?
  238. `,
  239. [id],
  240. (err) => {
  241. if (err) {
  242. reject(err)
  243. return
  244. }
  245. }
  246. )
  247. })
  248. })
  249. }
  250. }