diff --git a/internal/database/chapter.go b/internal/database/chapter.go index bfec341..fd627ea 100644 --- a/internal/database/chapter.go +++ b/internal/database/chapter.go @@ -1,7 +1,8 @@ package database type Chapter struct { - Id int `gorm:"primary_key;AUTO_INCREMENT"` + Id int `gorm:"primary_key;autoIncrement;"` + ChapterId int Url string Name string Number string @@ -11,7 +12,7 @@ type Chapter struct { func NewChapter(id int, mangaId int, url string, name string, number string, timeStampUnix int64) Chapter { return Chapter{ - Id: id, + ChapterId: id, Url: url, Name: name, Number: number, diff --git a/internal/database/database.go b/internal/database/database.go index 6609dae..fec288c 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -54,6 +54,6 @@ func (dbMgr *Manager) Delete(mangaId int) { } func (dbMgr *Manager) createDatabaseIfNotExists() error { - err := dbMgr.Db.AutoMigrate(&Manga{}, &Chapter{}, &Setting{}) + err := dbMgr.Db.AutoMigrate(&MangaDefinition{}, &User{}, &Manga{}, &Chapter{}, &Setting{}) return err } diff --git a/internal/database/manga.go b/internal/database/manga.go index d96a22a..26b3c88 100644 --- a/internal/database/manga.go +++ b/internal/database/manga.go @@ -1,17 +1,26 @@ package database -type Manga struct { +type MangaDefinition struct { Id int `gorm:"primary_key;AUTO_INCREMENT"` Title string TimeStampUnix int64 Thumbnail []byte LastChapterNum string - Chapters []Chapter + // Chapters []Chapter //`gorm:"foreignkey:MangaID"` } -func NewManga(id int, title string, timeStampUnix int64) Manga { - return Manga{ +type Manga struct { + Id int `gorm:"primary_key;AUTO_INCREMENT"` + MangaDefinitionId int + Definition MangaDefinition `gorm:"foreignKey:MangaDefinitionId"` + UserId int + TimeStampUnix int64 + Chapters []Chapter `gorm:"foreignKey:MangaId"` +} + +func NewMangaDefinition(id int, title string, timeStampUnix int64) MangaDefinition { + return MangaDefinition{ Id: id, Title: title, TimeStampUnix: timeStampUnix, @@ -21,20 +30,20 @@ func NewManga(id int, title string, timeStampUnix int64) Manga { // GetLatestChapter TODO: Cache this somehow func (m *Manga) GetLatestChapter() (*Chapter, bool) { - highest := int64(0) - index := 0 - for i, chapter := range m.Chapters { - if chapter.MangaId == m.Id && highest < chapter.TimeStampUnix { - highest = chapter.TimeStampUnix - index = i - } - } + // highest := int64(0) + // index := 0 + // for i, chapter := range m.Chapters { + // if chapter.MangaId == m.Manga.Id && highest < chapter.TimeStampUnix { + // highest = chapter.TimeStampUnix + // index = i + // } + // } - if highest == 0 { - return nil, false - } + // if highest == 0 { + return nil, false + // } - return &m.Chapters[index], true + // return &m.Chapters[index], true //result := db.Where("manga.id = ?", m.Id).Order("TimeStampUnix desc").Take(&chapter) //if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) { diff --git a/internal/database/user.go b/internal/database/user.go new file mode 100644 index 0000000..deadb5b --- /dev/null +++ b/internal/database/user.go @@ -0,0 +1,18 @@ +package database + +type User struct { + Id int `gorm:"primary_key;AUTO_INCREMENT"` + DisplayName string + LoginName string + PwdHash []byte + Salt []byte + Mangas []Manga `gorm:"foreignKey:UserId"` +} + +// type UserManga struct { +// Id int `gorm:"primary_key;AUTO_INCREMENT"` +// DisplayName string +// Manga Manga +// User User +// // Chapters []Chapter `gorm:"ForeignKey:ChapterId,UserId;References:Id,UserId"` +// } diff --git a/internal/server/handler.go b/internal/server/handler.go index 5a1da94..03f8581 100644 --- a/internal/server/handler.go +++ b/internal/server/handler.go @@ -38,7 +38,7 @@ func (s *Server) HandleNew(w http.ResponseWriter, r *http.Request) { func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) { tmpl := template.Must(view.GetViewTemplate(view.Menu)) var all []*database.Manga - _ = s.DbMgr.Db.Preload("Chapters").Find(&all) + _ = s.DbMgr.Db.Preload("Chapters").Where("user_id = ?", 1).Find(&all) l := len(all) mangaViewModels := make([]view.MangaViewModel, l) counter := 0 @@ -57,7 +57,7 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) { //TODO: Change all this to be more performant for _, manga := range all { - title := cases.Title(language.English, cases.Compact).String(strings.Replace(manga.Title, "-", " ", -1)) + title := cases.Title(language.English, cases.Compact).String(strings.Replace(manga.Definition.Title, "-", " ", -1)) t1 := time.Now().UnixNano() @@ -78,30 +78,29 @@ func (s *Server) HandleMenu(w http.ResponseWriter, _ *http.Request) { // This is very slow // TODO: put this into own Method - if manga.LastChapterNum == "" { + if manga.Definition.LastChapterNum == "" { err, updated := s.UpdateLatestAvailableChapter(manga) if err != nil { fmt.Println(err) } if updated { - s.DbMgr.Db.Save(manga) + s.DbMgr.Db.Save(manga.Definition) } } t2 = time.Now().UnixNano() titNs += t2 - t1 - latestChapter, ok := manga.GetLatestChapter() if !ok { continue } mangaViewModels[counter] = view.MangaViewModel{ - ID: manga.Id, + ID: manga.Definition.Id, Title: title, Number: latestChapter.Number, - LastNumber: manga.LastChapterNum, + LastNumber: manga.Definition.LastChapterNum, // I Hate this time Format... 15 = hh, 04 = mm, 02 = DD, 01 = MM, 06 == YY LastTime: time.Unix(manga.TimeStampUnix, 0).Format("15:04 (02-01-06)"), Url: latestChapter.Url, @@ -214,10 +213,10 @@ func (s *Server) HandleCurrent(w http.ResponseWriter, _ *http.Request) { fmt.Println(err) } - var manga database.Manga + var manga database.MangaDefinition result := s.DbMgr.Db.First(&manga, mangaId) if result.Error != nil && errors.Is(result.Error, gorm.ErrRecordNotFound) { - manga = database.NewManga(mangaId, title, time.Now().Unix()) + manga = database.NewMangaDefinition(mangaId, title, time.Now().Unix()) } else { manga.TimeStampUnix = time.Now().Unix() } diff --git a/internal/server/server.go b/internal/server/server.go index a0e9532..582b3f8 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -212,9 +212,9 @@ func (s *Server) LoadCurr() { } func (s *Server) UpdateLatestAvailableChapter(manga *database.Manga) (error, bool) { - fmt.Printf("Updating Manga: %s\n", manga.Title) + fmt.Printf("Updating Manga: %s\n", manga.Definition.Title) - l, err := s.Provider.GetChapterList("/title/" + strconv.Itoa(manga.Id)) + l, err := s.Provider.GetChapterList("/title/" + strconv.Itoa(manga.Definition.Id)) if err != nil { return err, false } @@ -227,16 +227,16 @@ func (s *Server) UpdateLatestAvailableChapter(manga *database.Manga) (error, boo chapterNumberStr := strings.Replace(c, "ch_", "", 1) - if manga.LastChapterNum == chapterNumberStr { + if manga.Definition.LastChapterNum == chapterNumberStr { return nil, false } else { - manga.LastChapterNum = chapterNumberStr + manga.Definition.LastChapterNum = chapterNumberStr return nil, true } } func (s *Server) LoadThumbnail(manga *database.Manga) (path string, updated bool, err error) { - strId := strconv.Itoa(manga.Id) + strId := strconv.Itoa(manga.Definition.Id) s.Mutex.Lock() defer s.Mutex.Unlock() @@ -244,8 +244,8 @@ func (s *Server) LoadThumbnail(manga *database.Manga) (path string, updated bool return strId, false, nil } - if manga.Thumbnail != nil { - s.ImageBuffers[strId] = manga.Thumbnail + if manga.Definition.Thumbnail != nil { + s.ImageBuffers[strId] = manga.Definition.Thumbnail return strId, false, nil } @@ -257,7 +257,7 @@ func (s *Server) LoadThumbnail(manga *database.Manga) (path string, updated bool if err != nil { return "", false, err } - manga.Thumbnail = ram + manga.Definition.Thumbnail = ram s.ImageBuffers[strId] = ram return strId, true, nil }