| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500 |
- package model
- import (
- "crawler/config"
- "crawler/service"
- "database/sql"
- "encoding/json"
- "errors"
- "fmt"
- "log"
- "reflect"
- "strconv"
- "strings"
- )
- type MovieListModel struct {
- SearchMovieListParams
- SearchMovieList
- MovieListInfo
- Director
- Company
- MovieListTable
- }
- // 영화 목록 검색 변수
- type SearchMovieListParams struct {
- Key string `form:"key" url:"key" binding:"required"`
- CurPage int `form:"curPage" url:"curPage"`
- ItemPerPage int `form:"itemPerPage" url:"itemPerPage,omitempty"`
- MovieNm string `form:"movieNm" url:"movieNm,omitempty"`
- DirectorNm string `form:"directorNm" url:"directorNm,omitempty"`
- OpenStartDt int `form:"openStartDt" url:"openStartDt,omitempty"`
- OpenEndDt int `form:"openEndDt" url:"openEndDt,omitempty"`
- PrdtStartYear int `form:"prdtStartYear" url:"prdtStartYear,omitempty"`
- PrdtEndYear int `form:"prdtEndYear" url:"prdtEndYear,omitempty"`
- RepNationCd string `form:"repNationCd" url:"repNationCd,omitempty"`
- MovieTypeCd string `form:"movieTypeCd" url:"movieTypeCd,omitempty"`
- }
- type SearchMovieList struct {
- MovieListResult struct {
- TotCnt int `json:"totCnt"`
- Source string `json:"source"`
- MovieList []MovieListInfo `json:"movieList"`
- } `json:"movieListResult"`
- }
- type MovieListInfo struct {
- MovieCd string `json:"movieCd"`
- MovieNm string `json:"movieNm"`
- MovieNmEn string `json:"movieNmEn"`
- PrdtYear string `json:"prdtYear"`
- OpenDt string `json:"openDt"`
- TypeNm string `json:"typeNm"`
- PrdtStatNm string `json:"prdtStatNm"`
- NationAlt string `json:"nationAlt"`
- GenreAlt string `json:"genreAlt"`
- RepNationNm string `json:"repNationNm"`
- RepGenreNm string `json:"repGenreNm"`
- Directors []Director `json:"directors,omitempty"`
- Companys []Company `json:"companys,omitempty"`
- }
- type Director struct {
- PeopleNm string `json:"peopleNm,omitempty"`
- }
- type Company struct {
- CompanyCd string `json:"companyCd,omitempty"`
- CompanyNm string `json:"companyNm,omitempty"`
- }
- type MovieListTable struct {
- MovieID int
- MovieCd string
- MovieNm *string
- MovieNmEn *string
- PrdtYear *int
- OpenDt *int
- TypeNm *string
- PrdtStatNm *string
- NationAlt *string
- GenreAlt *string
- RepNationNm *string
- RepGenreNm *string
- Directors *string
- Companys *string
- UpdatedAt *string
- CreatedAt string
- Detail *MovieDetailTable
- }
- func (this *MovieListModel) Total() int {
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = "SELECT COUNT(*) FROM tb_movie;"
- total = 0
- )
- err := conn.QueryRow(query).Scan(&total)
- if err != nil {
- db.SetErrorLog(err, query)
- return total
- }
- db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select total movie")
- return total
- }
- func (this *MovieListModel) List(ids string) ([]MovieListTable, error) {
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = fmt.Sprintf("SELECT * FROM tb_movie WHERE id IN (%s) ORDER BY open_dt DESC;", ids)
- list = make([]MovieListTable, 0)
- )
- rows, err := conn.Query(query)
- if err != nil && err != sql.ErrNoRows {
- db.SetErrorLog(err, query)
- return list, err
- }
- defer rows.Close()
- for rows.Next() {
- var row MovieListTable
- if err = rows.Scan(
- &row.MovieID, &row.MovieCd, &row.MovieNm, &row.MovieNmEn, &row.PrdtYear, &row.OpenDt, &row.TypeNm,
- &row.PrdtStatNm, &row.NationAlt, &row.GenreAlt, &row.RepNationNm, &row.RepGenreNm,
- &row.Directors, &row.Companys, &row.UpdatedAt, &row.CreatedAt); err != nil {
- return list, err
- }
- list = append(list, row)
- }
- if err = rows.Err(); err != nil {
- return list, err
- }
- db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select movie daily")
- return list, nil
- }
- func (this *MovieListModel) Insert(list []MovieListInfo) error {
- if len(list) <= 0 {
- return nil
- }
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = `
- INSERT INTO tb_movie (
- movie_cd, movie_nm, movie_nm_en, prdt_year, open_dt,
- type_nm, prdt_stat_nm, nation_alt, genre_alt, rep_nation_nm,
- rep_genre_nm, directors, companys, updated_at, created_at
- )
- VALUES
- `
- vals = []interface{}{}
- dup string
- )
- for _, row := range list {
- query += `(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, NOW()),`
- data := this.DataFilter(row)
- vals = append(vals,
- data.MovieCd, data.MovieNm, data.MovieNmEn, data.PrdtYear, data.OpenDt,
- data.TypeNm, data.PrdtStatNm, data.NationAlt, data.GenreAlt, data.RepNationNm,
- data.RepGenreNm, data.Directors, data.Companys)
- dup += `movie_cd = VALUES(movie_cd), movie_nm = VALUES(movie_nm), movie_nm_en = VALUES(movie_nm_en),
- prdt_year = VALUES(prdt_year), open_dt = VALUES(open_dt), type_nm = VALUES(type_nm),
- prdt_stat_nm = VALUES(prdt_stat_nm), nation_alt = VALUES(nation_alt), genre_alt = VALUES(genre_alt),
- rep_nation_nm = VALUES(rep_nation_nm), rep_genre_nm = VALUES(rep_genre_nm), directors = VALUES(directors),
- companys = VALUES(companys), updated_at = NOW(),`
- }
- query = query[0 : len(query)-1]
- dup = dup[0 : len(dup)-1]
- query += `ON DUPLICATE KEY UPDATE ` + dup
- stmt, err := conn.Prepare(query)
- if err != nil {
- db.SetErrorLog(err, query)
- return err
- }
- defer stmt.Close()
- _, err = stmt.Exec(vals...)
- if err != nil {
- db.SetErrorLog(err, query)
- return err
- }
- db.SetGeneralLog(config.GL_ACTION_WRITE, query, "insert movie list")
- return nil
- }
- func (this *MovieListModel) IsExists(movieCd string) bool {
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = "SELECT IF(COUNT(*) <= 0, 0, 1) AS `exists` FROM tb_movie WHERE movie_cd = ?;"
- exists = false
- )
- err := conn.QueryRow(query, movieCd).Scan(&exists)
- if err != nil {
- db.SetErrorLog(err, query)
- return exists
- }
- db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select exists movie")
- return exists
- }
- func (this *MovieListModel) Update(list []MovieListInfo) error {
- if len(list) <= 0 {
- return nil
- }
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = `
- UPDATE tb_movie SET
- movie_nm = ?, movie_nm_en = ?, prdt_year = ?, open_dt = ?,
- type_nm = ?, prdt_stat_nm = ?, nation_alt = ?, genre_alt = ?,
- rep_nation_nm = ?, rep_genre_nm = ?, directors = ?, companys = ?,
- updated_at = NOW()
- WHERE movie_cd = ?
- `
- )
- for _, row := range list {
- data := this.DataFilter(row)
- _, err := conn.Exec(query,
- data.MovieNm, data.MovieNmEn, data.PrdtYear, data.OpenDt,
- data.TypeNm, data.PrdtStatNm, data.NationAlt, data.GenreAlt, data.RepNationNm,
- data.RepGenreNm, data.Directors, data.Companys, data.MovieCd)
- if err != nil {
- db.SetErrorLog(err, query)
- return err
- }
- }
- db.SetGeneralLog(config.GL_ACTION_MODIFY, query, "update movie list")
- return nil
- }
- func (this *MovieListModel) Replace(info MovieListInfo) error {
- if reflect.ValueOf(info).IsZero() {
- return nil
- }
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = `
- INSERT tb_movie SET
- movie_cd = ?, movie_nm = ?, movie_nm_en = ?, prdt_year = ?, open_dt = ?,
- type_nm = ?, prdt_stat_nm = ?, nation_alt = ?, genre_alt = ?,
- rep_nation_nm = ?, rep_genre_nm = ?, directors = ?, companys = ?,
- created_at = NOW()
- ON DUPLICATE KEY UPDATE
- movie_nm = VALUES(movie_nm), movie_nm_en = VALUES(movie_nm_en), prdt_year = VALUES(prdt_year), open_dt = VALUES(open_dt),
- type_nm = VALUES(type_nm), prdt_stat_nm = VALUES(prdt_stat_nm), nation_alt = VALUES(nation_alt), genre_alt = VALUES(genre_alt),
- rep_nation_nm = VALUES(rep_nation_nm), rep_genre_nm = VALUES(rep_genre_nm), directors = VALUES(directors), companys = VALUES(companys),
- updated_at = NOW();
- `
- )
- data := this.DataFilter(info)
- _, err := conn.Exec(query,
- data.MovieCd, data.MovieNm, data.MovieNmEn, data.PrdtYear, data.OpenDt,
- data.TypeNm, data.PrdtStatNm, data.NationAlt, data.GenreAlt, data.RepNationNm,
- data.RepGenreNm, data.Directors, data.Companys)
- if err != nil {
- db.SetErrorLog(err, query)
- return err
- }
- db.SetGeneralLog(config.GL_ACTION_MODIFY, query, "replace movie list")
- return nil
- }
- // 영화 기본 정보에 없는 고유 코드 조회
- func (this *MovieListModel) MovieInfoExcludeCodes() []string {
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- 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);`
- code []string
- )
- rows, err := conn.Query(query)
- if err != nil && err != sql.ErrNoRows {
- db.SetErrorLog(err, query)
- return code
- }
- defer rows.Close()
- for rows.Next() {
- var cd string
- if err := rows.Scan(&cd); err != nil {
- log.Fatal(err)
- }
- code = append(code, cd)
- }
- db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select movie_cd list")
- return code
- }
- // 영화 상세 정보에 없는 고유 코드 조회
- func (this *MovieListModel) MovieDetailExcludeCodes() []string {
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- //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);`
- //query = `SELECT movie_cd FROM tb_movie ORDER BY movie_id ASC`
- query = `SELECT m.movie_cd
- FROM tb_movie AS m
- JOIN tb_movie_detail AS d ON d.movie_cd = m.movie_cd
- WHERE (d.main_img IS NULL OR d.main_img = '') OR (d.thumb_img IS NULL OR d.thumb_img = '');
- `
- code []string
- )
- rows, err := conn.Query(query)
- if err != nil && err != sql.ErrNoRows {
- db.SetErrorLog(err, query)
- return code
- }
- defer rows.Close()
- for rows.Next() {
- var cd string
- if err := rows.Scan(&cd); err != nil {
- log.Fatal(err)
- }
- code = append(code, cd)
- }
- db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select movie_cd list")
- return code
- }
- func (this *MovieListModel) DataFilter(row MovieListInfo) MovieListTable {
- var result MovieListTable
- result.MovieCd = row.MovieCd
- if row.MovieNm != "" {
- result.MovieNm = &row.MovieNm
- } else {
- result.MovieNm = nil
- }
- if row.MovieNmEn != "" {
- result.MovieNmEn = &row.MovieNmEn
- } else {
- result.MovieNmEn = nil
- }
- if row.PrdtYear != "" {
- prdtYear, _ := strconv.Atoi(row.PrdtYear)
- result.PrdtYear = &prdtYear
- } else {
- result.PrdtYear = nil
- }
- if row.OpenDt != "" {
- openDt, _ := strconv.Atoi(row.OpenDt)
- result.OpenDt = &openDt
- } else {
- result.OpenDt = nil
- }
- if row.TypeNm != "" {
- result.TypeNm = &row.TypeNm
- } else {
- result.TypeNm = nil
- }
- if row.PrdtStatNm != "" {
- result.PrdtStatNm = &row.PrdtStatNm
- } else {
- result.PrdtStatNm = nil
- }
- if row.NationAlt != "" {
- result.NationAlt = &row.NationAlt
- } else {
- result.NationAlt = nil
- }
- if row.GenreAlt != "" {
- result.GenreAlt = &row.GenreAlt
- } else {
- result.GenreAlt = nil
- }
- if row.RepNationNm != "" {
- result.RepNationNm = &row.RepNationNm
- } else {
- result.RepNationNm = nil
- }
- if row.RepGenreNm != "" {
- result.RepGenreNm = &row.RepGenreNm
- } else {
- result.RepGenreNm = nil
- }
- if len(row.Directors) > 0 {
- directors, _ := json.Marshal(row.Directors)
- s := string(directors)
- result.Directors = &s
- } else {
- result.Directors = nil
- }
- if len(row.Companys) > 0 {
- companys, _ := json.Marshal(row.Companys)
- s := string(companys)
- result.Companys = &s
- } else {
- result.Companys = nil
- }
- return result
- }
- func (this *MovieListModel) MakeParams(req SearchMovieListParams) (string, error) {
- params, err := json.Marshal(MovieListParams{
- CurPage: req.CurPage,
- ItemPerPage: req.ItemPerPage,
- MovieNm: req.MovieNm,
- DirectorNm: req.DirectorNm,
- OpenStartDt: req.OpenStartDt,
- OpenEndDt: req.OpenEndDt,
- PrdtStartYear: req.PrdtStartYear,
- PrdtEndYear: req.PrdtEndYear,
- RepNationCd: req.RepNationCd,
- MovieTypeCd: req.MovieTypeCd,
- })
- return string(params), err
- }
- func (this *MovieListModel) LastInsertIDs(movieCDs []string) (string, error) {
- if movieCDs == nil {
- return "", errors.New("날짜를 지정해주세요.")
- }
- var (
- db = service.DB_MOVIEW
- conn = db.SQLDB
- query = fmt.Sprintf("SELECT id FROM tb_movie WHERE movie_cd IN(%s);",
- strings.Join(strings.Split(strings.Repeat("?", len(movieCDs)), ""), ", "))
- params = make([]interface{}, 0)
- ids = make([]string, 0)
- )
- for _, movieCd := range movieCDs {
- params = append(params, movieCd)
- }
- rows, err := conn.Query(query, params...)
- if err != nil && err != sql.ErrNoRows {
- db.SetErrorLog(err, query)
- return "", err
- }
- for rows.Next() {
- var id string
- if err = rows.Scan(&id); err != nil {
- return "", err
- }
- ids = append(ids, id)
- }
- if err = rows.Err(); err != nil {
- return "", err
- }
- db.SetGeneralLog(config.GL_ACTION_SELECT, query, "select ids movie list")
- return strings.Join(ids, ","), nil
- }
|