diff --git a/admin/api/theme.go b/admin/api/theme.go index 6e6ec069..791a51ba 100644 --- a/admin/api/theme.go +++ b/admin/api/theme.go @@ -109,6 +109,7 @@ func showThemedExercice(theme fic.Theme, exercice fic.Exercice, body []byte) (in type uploadedTheme struct { Name string Authors string + Intro string } func createTheme(_ httprouter.Params, body []byte) (interface{}, error) { @@ -121,7 +122,7 @@ func createTheme(_ httprouter.Params, body []byte) (interface{}, error) { return nil, errors.New("Theme's name not filled") } - return fic.CreateTheme(ut.Name, ut.Authors) + return fic.CreateTheme(ut.Name, ut.Authors, ut.Intro) } func updateTheme(theme fic.Theme, body []byte) (interface{}, error) { diff --git a/admin/sync/themes.go b/admin/sync/themes.go index 8408c740..5959bd53 100644 --- a/admin/sync/themes.go +++ b/admin/sync/themes.go @@ -40,24 +40,31 @@ func SyncThemes(i Importer) []string { errs = append(errs, err.Error()) } else { for _, tname := range themes { - if authors, err := getAuthors(i, tname); err != nil { + var authors []string + var intro string + var theme fic.Theme + + if authors, err = getAuthors(i, tname); err != nil { errs = append(errs, fmt.Sprintf("%q: unable to get AUTHORS: %s", tname, err)) continue - } else if theme, err := fic.GetThemeByName(tname); err != nil { - if _, err := fic.CreateTheme(tname, strings.Join(authors, ", ")); err != nil { + } else if intro, err = getFileContent(i, path.Join(tname, "introduction.txt")); err != nil { + errs = append(errs, fmt.Sprintf("%q: unable to get introduction: %s", tname, err)) + } else if theme, err = fic.GetThemeByName(tname); err != nil { + if _, err := fic.CreateTheme(tname, strings.Join(authors, ", "), intro); err != nil { errs = append(errs, fmt.Sprintf("%q: an error occurs during add: %s", tname, err)) continue } - } else { - authors_str := strings.Join(authors, ", ") + } - if theme.Name != tname || theme.Authors != authors_str { - theme.Name = tname - theme.Authors = authors_str - if _, err := theme.Update(); err != nil { - errs = append(errs, fmt.Sprintf("%q: an error occurs during update: %s", tname, err)) - continue - } + authors_str := strings.Join(authors, ", ") + + if theme.Name != tname || theme.Authors != authors_str || theme.Intro != intro { + theme.Name = tname + theme.Authors = authors_str + theme.Intro = intro + if _, err := theme.Update(); err != nil { + errs = append(errs, fmt.Sprintf("%q: an error occurs during update: %s", tname, err)) + continue } } } diff --git a/libfic/db.go b/libfic/db.go index 20e5dd64..ed3f64cb 100644 --- a/libfic/db.go +++ b/libfic/db.go @@ -59,6 +59,7 @@ CREATE TABLE IF NOT EXISTS events( CREATE TABLE IF NOT EXISTS themes( id_theme INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL UNIQUE, + intro TEXT NOT NULL, authors TEXT NOT NULL ) DEFAULT CHARACTER SET = utf8 COLLATE = utf8_bin; `); err != nil { diff --git a/libfic/theme.go b/libfic/theme.go index f1fd47b8..2f6890f3 100644 --- a/libfic/theme.go +++ b/libfic/theme.go @@ -7,11 +7,12 @@ import ( type Theme struct { Id int64 `json:"id"` Name string `json:"name"` - Authors string `json:"authors"` + Authors string `json:"authors,omitempty"` + Intro string `json:"intro,omitempty"` } func GetThemes() ([]Theme, error) { - if rows, err := DBQuery("SELECT id_theme, name, authors FROM themes"); err != nil { + if rows, err := DBQuery("SELECT id_theme, name, authors, intro FROM themes"); err != nil { return nil, err } else { defer rows.Close() @@ -19,7 +20,7 @@ func GetThemes() ([]Theme, error) { var themes = make([]Theme, 0) for rows.Next() { var t Theme - if err := rows.Scan(&t.Id, &t.Name, &t.Authors); err != nil { + if err := rows.Scan(&t.Id, &t.Name, &t.Authors, &t.Intro); err != nil { return nil, err } themes = append(themes, t) @@ -34,7 +35,7 @@ func GetThemes() ([]Theme, error) { func GetTheme(id int) (Theme, error) { var t Theme - if err := DBQueryRow("SELECT id_theme, name, authors FROM themes WHERE id_theme=?", id).Scan(&t.Id, &t.Name, &t.Authors); err != nil { + if err := DBQueryRow("SELECT id_theme, name, authors, intro FROM themes WHERE id_theme=?", id).Scan(&t.Id, &t.Name, &t.Authors, &t.Intro); err != nil { return t, err } @@ -43,25 +44,25 @@ func GetTheme(id int) (Theme, error) { func GetThemeByName(name string) (Theme, error) { var t Theme - if err := DBQueryRow("SELECT id_theme, name, authors FROM themes WHERE name=?", name).Scan(&t.Id, &t.Name, &t.Authors); err != nil { + if err := DBQueryRow("SELECT id_theme, name, authors, intro FROM themes WHERE name=?", name).Scan(&t.Id, &t.Name, &t.Authors, &t.Intro); err != nil { return t, err } return t, nil } -func CreateTheme(name string, authors string) (Theme, error) { - if res, err := DBExec("INSERT INTO themes (name, authors) VALUES (?, ?)", name, authors); err != nil { +func CreateTheme(name string, authors string, intro string) (Theme, error) { + if res, err := DBExec("INSERT INTO themes (name, authors, intro) VALUES (?, ?, ?)", name, authors, intro); err != nil { return Theme{}, err } else if tid, err := res.LastInsertId(); err != nil { return Theme{}, err } else { - return Theme{tid, name, authors}, nil + return Theme{tid, name, authors, intro}, nil } } func (t Theme) Update() (int64, error) { - if res, err := DBExec("UPDATE themes SET name = ?, authors = ? WHERE id_theme = ?", t.Name, t.Authors, t.Id); err != nil { + if res, err := DBExec("UPDATE themes SET name = ?, authors = ?, intro = ? WHERE id_theme = ?", t.Name, t.Authors, t.Intro, t.Id); err != nil { return 0, err } else if nb, err := res.RowsAffected(); err != nil { return 0, err @@ -91,6 +92,7 @@ type ExportedExercice struct { type exportedTheme struct { Name string `json:"name"` Authors string `json:"authors"` + Intro string `json:"intro"` Exercices map[string]ExportedExercice `json:"exercices"` } @@ -116,6 +118,7 @@ func ExportThemes() (interface{}, error) { ret[fmt.Sprintf("%d", theme.Id)] = exportedTheme{ theme.Name, theme.Authors, + theme.Intro, exos, } }