From 0dd81e68d43d0b682c704697b79419d4871134f1 Mon Sep 17 00:00:00 2001 From: Erik Winter Date: Mon, 25 Dec 2023 09:21:00 +0100 Subject: [PATCH] import a movie from tmdb --- client/emdb.go | 37 ++++++++++++++++++++++++++++ cmd/terminal-client/tui/basemodel.go | 5 +++- cmd/terminal-client/tui/tabset.go | 12 +++++++++ cmd/terminal-client/tui/tabtmdb.go | 22 +++++++++++++++-- cmd/terminal-client/tui/tui.go | 1 + 5 files changed, 74 insertions(+), 3 deletions(-) diff --git a/client/emdb.go b/client/emdb.go index abb00e9..cb9547f 100644 --- a/client/emdb.go +++ b/client/emdb.go @@ -1,6 +1,7 @@ package client import ( + "bytes" "encoding/json" "fmt" "io" @@ -50,3 +51,39 @@ func (e *EMDB) GetMovies() ([]model.Movie, error) { return movies, nil } + +func (e *EMDB) AddMovie(movie model.Movie) (model.Movie, error) { + body, err := json.Marshal(movie) + if err != nil { + return model.Movie{}, err + } + + url := fmt.Sprintf("%s/movie", e.baseURL) + req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(body)) + if err != nil { + return model.Movie{}, err + } + req.Header.Add("Authorization", e.apiKey) + + resp, err := e.c.Do(req) + if err != nil { + return model.Movie{}, err + } + + if resp.StatusCode != http.StatusOK { + return model.Movie{}, fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + newBody, err := io.ReadAll(resp.Body) + if err != nil { + return model.Movie{}, err + } + defer resp.Body.Close() + + var newMovie model.Movie + if err := json.Unmarshal(newBody, &newMovie); err != nil { + return model.Movie{}, err + } + + return newMovie, nil +} diff --git a/cmd/terminal-client/tui/basemodel.go b/cmd/terminal-client/tui/basemodel.go index 4b1cc33..07014cd 100644 --- a/cmd/terminal-client/tui/basemodel.go +++ b/cmd/terminal-client/tui/basemodel.go @@ -62,7 +62,7 @@ func (m baseModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { var emdbTab, tmdbTab tea.Model emdbTab, cmd = NewTabEMDB(m.emdb, m.logger) cmds = append(cmds, cmd) - tmdbTab, cmd = NewTabTMDB(m.tmdb, m.logger) + tmdbTab, cmd = NewTabTMDB(m.emdb, m.tmdb, m.logger) cmds = append(cmds, cmd) m.tabs.AddTab("emdb", "EMDB", emdbTab) m.tabs.AddTab("tmdb", "TMDB", tmdbTab) @@ -75,6 +75,9 @@ func (m baseModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { Height: m.contentSize.Height, } cmds = append(cmds, m.tabs.Update(tabSize)) + case NewMovie: + m.Log(fmt.Sprintf("imported movie %s", msg.m.Title)) + cmd = m.tabs.Update(msg) case error: m.Log(fmt.Sprintf("ERROR: %s", msg.Error())) default: diff --git a/cmd/terminal-client/tui/tabset.go b/cmd/terminal-client/tui/tabset.go index 816cd13..60a2759 100644 --- a/cmd/terminal-client/tui/tabset.go +++ b/cmd/terminal-client/tui/tabset.go @@ -43,6 +43,15 @@ func (t *TabSet) Previous() { } } +func (t *TabSet) Select(name string) { + for i, n := range t.order { + if n == name { + t.active = i + return + } + } +} + func (t *TabSet) Update(msg tea.Msg) tea.Cmd { var cmd tea.Cmd var cmds []tea.Cmd @@ -54,6 +63,9 @@ func (t *TabSet) Update(msg tea.Msg) tea.Cmd { cmds = append(cmds, cmd) } t.size = msg.(TabSizeMsgType) + //case ImportMovieMsg: + // t.Select("emdb") + // t.tabs["emdb"], cmd = t.tabs["emdb"].Update(msg) default: name := t.order[t.active] t.tabs[name], cmd = t.tabs[name].Update(msg) diff --git a/cmd/terminal-client/tui/tabtmdb.go b/cmd/terminal-client/tui/tabtmdb.go index 3fb3b7b..cd63c3e 100644 --- a/cmd/terminal-client/tui/tabtmdb.go +++ b/cmd/terminal-client/tui/tabtmdb.go @@ -10,16 +10,18 @@ import ( ) type tabTMDB struct { + emdb *client.EMDB + tmdb *client.TMDB initialized bool focused string searchInput textinput.Model searchResults list.Model - tmdb *client.TMDB logger *Logger } -func NewTabTMDB(tmdb *client.TMDB, logger *Logger) (tea.Model, tea.Cmd) { +func NewTabTMDB(emdb *client.EMDB, tmdb *client.TMDB, logger *Logger) (tea.Model, tea.Cmd) { m := tabTMDB{ + emdb: emdb, tmdb: tmdb, logger: logger, } @@ -50,6 +52,11 @@ func (m tabTMDB) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmds = append(cmds, SearchTMDB(m.tmdb, m.searchInput.Value())) m.searchInput.Blur() m.Log("search tmdb...") + case "result": + movie := m.searchResults.SelectedItem().(Movie) + m.Log(fmt.Sprintf("selected movie %s", movie.Title)) + cmds = append(cmds, ImportMovie(m.emdb, movie)) + } } case Movies: @@ -101,3 +108,14 @@ func SearchTMDB(tmdb *client.TMDB, query string) tea.Cmd { return Movies(tms) } } + +func ImportMovie(emdb *client.EMDB, movie Movie) tea.Cmd { + return func() tea.Msg { + newMovie, err := emdb.AddMovie(movie.m) + if err != nil { + return err + } + + return NewMovie(Movie{m: newMovie}) + } +} diff --git a/cmd/terminal-client/tui/tui.go b/cmd/terminal-client/tui/tui.go index 2fb2ed4..0d61cff 100644 --- a/cmd/terminal-client/tui/tui.go +++ b/cmd/terminal-client/tui/tui.go @@ -35,6 +35,7 @@ func (l *Logger) SetProgram(p *tea.Program) { l.p = p } func (l *Logger) Log(s string) { l.Lines = append(l.Lines, s) } type TabSizeMsgType tea.WindowSizeMsg +type NewMovie Movie func New(emdb *client.EMDB, tmdb *client.TMDB, logger *Logger) (*tea.Program, error) { logViewport := viewport.New(0, 0)