movie.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. package model
  2. import (
  3. "crawler/config"
  4. "crawler/service"
  5. "database/sql"
  6. "encoding/json"
  7. "errors"
  8. "fmt"
  9. "log"
  10. "reflect"
  11. "strconv"
  12. "strings"
  13. )
  14. type MovieListModel struct {
  15. SearchMovieListParams
  16. SearchMovieList
  17. MovieListInfo
  18. Director
  19. Company
  20. MovieListTable
  21. }
  22. // 영화 목록 검색 변수
  23. type SearchMovieListParams struct {
  24. Key string `form:"key" url:"key" binding:"required"`
  25. CurPage int `form:"curPage" url:"curPage"`
  26. ItemPerPage int `form:"itemPerPage" url:"itemPerPage,omitempty"`
  27. MovieNm string `form:"movieNm" url:"movieNm,omitempty"`
  28. DirectorNm string `form:"directorNm" url:"directorNm,omitempty"`
  29. OpenStartDt int `form:"openStartDt" url:"openStartDt,omitempty"`
  30. OpenEndDt int `form:"openEndDt" url:"openEndDt,omitempty"`
  31. PrdtStartYear int `form:"prdtStartYear" url:"prdtStartYear,omitempty"`
  32. PrdtEndYear int `form:"prdtEndYear" url:"prdtEndYear,omitempty"`
  33. RepNationCd string `form:"repNationCd" url:"repNationCd,omitempty"`
  34. MovieTypeCd string `form:"movieTypeCd" url:"movieTypeCd,omitempty"`
  35. }
  36. type SearchMovieList struct {
  37. MovieListResult struct {
  38. TotCnt int `json:"totCnt"`
  39. Source string `json:"source"`
  40. MovieList []MovieListInfo `json:"movieList"`
  41. } `json:"movieListResult"`
  42. }
  43. type MovieListInfo struct {
  44. MovieCd string `json:"movieCd"`
  45. MovieNm string `json:"movieNm"`
  46. MovieNmEn string `json:"movieNmEn"`
  47. PrdtYear string `json:"prdtYear"`
  48. OpenDt string `json:"openDt"`
  49. TypeNm string `json:"typeNm"`
  50. PrdtStatNm string `json:"prdtStatNm"`
  51. NationAlt string `json:"nationAlt"`
  52. GenreAlt string `json:"genreAlt"`
  53. RepNationNm string `json:"repNationNm"`
  54. RepGenreNm string `json:"repGenreNm"`
  55. Directors []Director `json:"directors,omitempty"`
  56. Companys []Company `json:"companys,omitempty"`
  57. }
  58. type Director struct {
  59. PeopleNm string `json:"peopleNm,omitempty"`
  60. }
  61. type Company struct {
  62. CompanyCd string `json:"companyCd,omitempty"`
  63. CompanyNm string `json:"companyNm,omitempty"`
  64. }
  65. type MovieListTable struct {
  66. MovieID int
  67. MovieCd string
  68. MovieNm *string
  69. MovieNmEn *string
  70. PrdtYear *int
  71. OpenDt *int
  72. TypeNm *string
  73. PrdtStatNm *string
  74. NationAlt *string
  75. GenreAlt *string
  76. RepNationNm *string
  77. RepGenreNm *string
  78. Directors *string
  79. Companys *string
  80. UpdatedAt *string
  81. CreatedAt string
  82. Detail *MovieDetailTable
  83. }
  84. func (this *MovieListModel) Total() int {
  85. var (
  86. db = service.DB_MOVIEW
  87. conn = db.SQLDB
  88. query = "SELECT COUNT(*) FROM tb_movie;"
  89. total = 0
  90. )
  91. err := conn.QueryRow(query).Scan(&total)
  92. if err != nil {
  93. db.SetErrorLog(err, query)
  94. return total
  95. }
  96. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select total movie")
  97. return total
  98. }
  99. func (this *MovieListModel) List(ids string) ([]MovieListTable, error) {
  100. var (
  101. db = service.DB_MOVIEW
  102. conn = db.SQLDB
  103. query = fmt.Sprintf("SELECT * FROM tb_movie WHERE id IN (%s) ORDER BY open_dt DESC;", ids)
  104. list = make([]MovieListTable, 0)
  105. )
  106. rows, err := conn.Query(query)
  107. if err != nil && err != sql.ErrNoRows {
  108. db.SetErrorLog(err, query)
  109. return list, err
  110. }
  111. defer rows.Close()
  112. for rows.Next() {
  113. var row MovieListTable
  114. if err = rows.Scan(
  115. &row.MovieID, &row.MovieCd, &row.MovieNm, &row.MovieNmEn, &row.PrdtYear, &row.OpenDt, &row.TypeNm,
  116. &row.PrdtStatNm, &row.NationAlt, &row.GenreAlt, &row.RepNationNm, &row.RepGenreNm,
  117. &row.Directors, &row.Companys, &row.UpdatedAt, &row.CreatedAt); err != nil {
  118. return list, err
  119. }
  120. list = append(list, row)
  121. }
  122. if err = rows.Err(); err != nil {
  123. return list, err
  124. }
  125. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select movie daily")
  126. return list, nil
  127. }
  128. func (this *MovieListModel) Insert(list []MovieListInfo) error {
  129. if len(list) <= 0 {
  130. return nil
  131. }
  132. var (
  133. db = service.DB_MOVIEW
  134. conn = db.SQLDB
  135. query = `
  136. INSERT INTO tb_movie (
  137. movie_cd, movie_nm, movie_nm_en, prdt_year, open_dt,
  138. type_nm, prdt_stat_nm, nation_alt, genre_alt, rep_nation_nm,
  139. rep_genre_nm, directors, companys, updated_at, created_at
  140. )
  141. VALUES
  142. `
  143. vals = []interface{}{}
  144. dup string
  145. )
  146. for _, row := range list {
  147. query += `(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, NOW()),`
  148. data := this.DataFilter(row)
  149. vals = append(vals,
  150. data.MovieCd, data.MovieNm, data.MovieNmEn, data.PrdtYear, data.OpenDt,
  151. data.TypeNm, data.PrdtStatNm, data.NationAlt, data.GenreAlt, data.RepNationNm,
  152. data.RepGenreNm, data.Directors, data.Companys)
  153. dup += `movie_cd = VALUES(movie_cd), movie_nm = VALUES(movie_nm), movie_nm_en = VALUES(movie_nm_en),
  154. prdt_year = VALUES(prdt_year), open_dt = VALUES(open_dt), type_nm = VALUES(type_nm),
  155. prdt_stat_nm = VALUES(prdt_stat_nm), nation_alt = VALUES(nation_alt), genre_alt = VALUES(genre_alt),
  156. rep_nation_nm = VALUES(rep_nation_nm), rep_genre_nm = VALUES(rep_genre_nm), directors = VALUES(directors),
  157. companys = VALUES(companys), updated_at = NOW(),`
  158. }
  159. query = query[0 : len(query)-1]
  160. dup = dup[0 : len(dup)-1]
  161. query += `ON DUPLICATE KEY UPDATE ` + dup
  162. stmt, err := conn.Prepare(query)
  163. if err != nil {
  164. db.SetErrorLog(err, query)
  165. return err
  166. }
  167. defer stmt.Close()
  168. _, err = stmt.Exec(vals...)
  169. if err != nil {
  170. db.SetErrorLog(err, query)
  171. return err
  172. }
  173. db.SetGeneralLog(config.GL_ACTION_WRITE, query, "insert movie list")
  174. return nil
  175. }
  176. func (this *MovieListModel) IsExists(movieCd string) bool {
  177. var (
  178. db = service.DB_MOVIEW
  179. conn = db.SQLDB
  180. query = "SELECT IF(COUNT(*) <= 0, 0, 1) AS `exists` FROM tb_movie WHERE movie_cd = ?;"
  181. exists = false
  182. )
  183. err := conn.QueryRow(query, movieCd).Scan(&exists)
  184. if err != nil {
  185. db.SetErrorLog(err, query)
  186. return exists
  187. }
  188. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select exists movie")
  189. return exists
  190. }
  191. func (this *MovieListModel) Update(list []MovieListInfo) error {
  192. if len(list) <= 0 {
  193. return nil
  194. }
  195. var (
  196. db = service.DB_MOVIEW
  197. conn = db.SQLDB
  198. query = `
  199. UPDATE tb_movie SET
  200. movie_nm = ?, movie_nm_en = ?, prdt_year = ?, open_dt = ?,
  201. type_nm = ?, prdt_stat_nm = ?, nation_alt = ?, genre_alt = ?,
  202. rep_nation_nm = ?, rep_genre_nm = ?, directors = ?, companys = ?,
  203. updated_at = NOW()
  204. WHERE movie_cd = ?
  205. `
  206. )
  207. for _, row := range list {
  208. data := this.DataFilter(row)
  209. _, err := conn.Exec(query,
  210. data.MovieNm, data.MovieNmEn, data.PrdtYear, data.OpenDt,
  211. data.TypeNm, data.PrdtStatNm, data.NationAlt, data.GenreAlt, data.RepNationNm,
  212. data.RepGenreNm, data.Directors, data.Companys, data.MovieCd)
  213. if err != nil {
  214. db.SetErrorLog(err, query)
  215. return err
  216. }
  217. }
  218. db.SetGeneralLog(config.GL_ACTION_MODIFY, query, "update movie list")
  219. return nil
  220. }
  221. func (this *MovieListModel) Replace(info MovieListInfo) error {
  222. if reflect.ValueOf(info).IsZero() {
  223. return nil
  224. }
  225. var (
  226. db = service.DB_MOVIEW
  227. conn = db.SQLDB
  228. query = `
  229. INSERT tb_movie SET
  230. movie_cd = ?, movie_nm = ?, movie_nm_en = ?, prdt_year = ?, open_dt = ?,
  231. type_nm = ?, prdt_stat_nm = ?, nation_alt = ?, genre_alt = ?,
  232. rep_nation_nm = ?, rep_genre_nm = ?, directors = ?, companys = ?,
  233. created_at = NOW()
  234. ON DUPLICATE KEY UPDATE
  235. movie_nm = VALUES(movie_nm), movie_nm_en = VALUES(movie_nm_en), prdt_year = VALUES(prdt_year), open_dt = VALUES(open_dt),
  236. type_nm = VALUES(type_nm), prdt_stat_nm = VALUES(prdt_stat_nm), nation_alt = VALUES(nation_alt), genre_alt = VALUES(genre_alt),
  237. rep_nation_nm = VALUES(rep_nation_nm), rep_genre_nm = VALUES(rep_genre_nm), directors = VALUES(directors), companys = VALUES(companys),
  238. updated_at = NOW();
  239. `
  240. )
  241. data := this.DataFilter(info)
  242. _, err := conn.Exec(query,
  243. data.MovieCd, data.MovieNm, data.MovieNmEn, data.PrdtYear, data.OpenDt,
  244. data.TypeNm, data.PrdtStatNm, data.NationAlt, data.GenreAlt, data.RepNationNm,
  245. data.RepGenreNm, data.Directors, data.Companys)
  246. if err != nil {
  247. db.SetErrorLog(err, query)
  248. return err
  249. }
  250. db.SetGeneralLog(config.GL_ACTION_MODIFY, query, "replace movie list")
  251. return nil
  252. }
  253. // 영화 기본 정보에 없는 고유 코드 조회
  254. func (this *MovieListModel) MovieInfoExcludeCodes() []string {
  255. var (
  256. db = service.DB_MOVIEW
  257. conn = db.SQLDB
  258. query = `SELECT movie_cd FROM tb_movie WHERE NOT EXISTS(SELECT movie_cd FROM tb_movie_info WHERE tb_movie.movie_cd = tb_movie_info.movie_cd);`
  259. code []string
  260. )
  261. rows, err := conn.Query(query)
  262. if err != nil && err != sql.ErrNoRows {
  263. db.SetErrorLog(err, query)
  264. return code
  265. }
  266. defer rows.Close()
  267. for rows.Next() {
  268. var cd string
  269. if err := rows.Scan(&cd); err != nil {
  270. log.Fatal(err)
  271. }
  272. code = append(code, cd)
  273. }
  274. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select movie_cd list")
  275. return code
  276. }
  277. // 영화 상세 정보에 없는 고유 코드 조회
  278. func (this *MovieListModel) MovieDetailExcludeCodes() []string {
  279. var (
  280. db = service.DB_MOVIEW
  281. conn = db.SQLDB
  282. //query = `SELECT movie_cd FROM tb_movie WHERE NOT EXISTS(SELECT movie_cd FROM tb_movie_detail WHERE tb_movie_detail.movie_cd = tb_movie.movie_cd);`
  283. //query = `SELECT movie_cd FROM tb_movie ORDER BY movie_id ASC`
  284. query = `SELECT m.movie_cd
  285. FROM tb_movie AS m
  286. JOIN tb_movie_detail AS d ON d.movie_cd = m.movie_cd
  287. WHERE (d.main_img IS NULL OR d.main_img = '') OR (d.thumb_img IS NULL OR d.thumb_img = '');
  288. `
  289. code []string
  290. )
  291. rows, err := conn.Query(query)
  292. if err != nil && err != sql.ErrNoRows {
  293. db.SetErrorLog(err, query)
  294. return code
  295. }
  296. defer rows.Close()
  297. for rows.Next() {
  298. var cd string
  299. if err := rows.Scan(&cd); err != nil {
  300. log.Fatal(err)
  301. }
  302. code = append(code, cd)
  303. }
  304. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select movie_cd list")
  305. return code
  306. }
  307. func (this *MovieListModel) DataFilter(row MovieListInfo) MovieListTable {
  308. var result MovieListTable
  309. result.MovieCd = row.MovieCd
  310. if row.MovieNm != "" {
  311. result.MovieNm = &row.MovieNm
  312. } else {
  313. result.MovieNm = nil
  314. }
  315. if row.MovieNmEn != "" {
  316. result.MovieNmEn = &row.MovieNmEn
  317. } else {
  318. result.MovieNmEn = nil
  319. }
  320. if row.PrdtYear != "" {
  321. prdtYear, _ := strconv.Atoi(row.PrdtYear)
  322. result.PrdtYear = &prdtYear
  323. } else {
  324. result.PrdtYear = nil
  325. }
  326. if row.OpenDt != "" {
  327. openDt, _ := strconv.Atoi(row.OpenDt)
  328. result.OpenDt = &openDt
  329. } else {
  330. result.OpenDt = nil
  331. }
  332. if row.TypeNm != "" {
  333. result.TypeNm = &row.TypeNm
  334. } else {
  335. result.TypeNm = nil
  336. }
  337. if row.PrdtStatNm != "" {
  338. result.PrdtStatNm = &row.PrdtStatNm
  339. } else {
  340. result.PrdtStatNm = nil
  341. }
  342. if row.NationAlt != "" {
  343. result.NationAlt = &row.NationAlt
  344. } else {
  345. result.NationAlt = nil
  346. }
  347. if row.GenreAlt != "" {
  348. result.GenreAlt = &row.GenreAlt
  349. } else {
  350. result.GenreAlt = nil
  351. }
  352. if row.RepNationNm != "" {
  353. result.RepNationNm = &row.RepNationNm
  354. } else {
  355. result.RepNationNm = nil
  356. }
  357. if row.RepGenreNm != "" {
  358. result.RepGenreNm = &row.RepGenreNm
  359. } else {
  360. result.RepGenreNm = nil
  361. }
  362. if len(row.Directors) > 0 {
  363. directors, _ := json.Marshal(row.Directors)
  364. s := string(directors)
  365. result.Directors = &s
  366. } else {
  367. result.Directors = nil
  368. }
  369. if len(row.Companys) > 0 {
  370. companys, _ := json.Marshal(row.Companys)
  371. s := string(companys)
  372. result.Companys = &s
  373. } else {
  374. result.Companys = nil
  375. }
  376. return result
  377. }
  378. func (this *MovieListModel) MakeParams(req SearchMovieListParams) (string, error) {
  379. params, err := json.Marshal(MovieListParams{
  380. CurPage: req.CurPage,
  381. ItemPerPage: req.ItemPerPage,
  382. MovieNm: req.MovieNm,
  383. DirectorNm: req.DirectorNm,
  384. OpenStartDt: req.OpenStartDt,
  385. OpenEndDt: req.OpenEndDt,
  386. PrdtStartYear: req.PrdtStartYear,
  387. PrdtEndYear: req.PrdtEndYear,
  388. RepNationCd: req.RepNationCd,
  389. MovieTypeCd: req.MovieTypeCd,
  390. })
  391. return string(params), err
  392. }
  393. func (this *MovieListModel) LastInsertIDs(movieCDs []string) (string, error) {
  394. if movieCDs == nil {
  395. return "", errors.New("날짜를 지정해주세요.")
  396. }
  397. var (
  398. db = service.DB_MOVIEW
  399. conn = db.SQLDB
  400. query = fmt.Sprintf("SELECT id FROM tb_movie WHERE movie_cd IN(%s);",
  401. strings.Join(strings.Split(strings.Repeat("?", len(movieCDs)), ""), ", "))
  402. params = make([]interface{}, 0)
  403. ids = make([]string, 0)
  404. )
  405. for _, movieCd := range movieCDs {
  406. params = append(params, movieCd)
  407. }
  408. rows, err := conn.Query(query, params...)
  409. if err != nil && err != sql.ErrNoRows {
  410. db.SetErrorLog(err, query)
  411. return "", err
  412. }
  413. for rows.Next() {
  414. var id string
  415. if err = rows.Scan(&id); err != nil {
  416. return "", err
  417. }
  418. ids = append(ids, id)
  419. }
  420. if err = rows.Err(); err != nil {
  421. return "", err
  422. }
  423. db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select ids movie list")
  424. return strings.Join(ids, ","), nil
  425. }