fic: Add theme recursive deletion

This commit is contained in:
nemunaire 2021-11-13 01:39:58 +01:00
parent 995740e275
commit 1a1343596a
2 changed files with 63 additions and 2 deletions

View File

@ -268,8 +268,8 @@ func (e Exercice) DeleteCascade() (int64, error) {
}
}
// DeleteDeep the challenge from the database, including player content.
func (e Exercice) DeleteDeep() (int64, error) {
// DeleteCascadePlayer delete player content related to this challenge.
func (e Exercice) DeleteCascadePlayer() (int64, error) {
if _, err := DBExec("DELETE FROM mcq_found WHERE id_mcq IN (SELECT id_mcq FROM exercice_mcq WHERE id_exercice = ?)", e.Id); err != nil {
return 0, err
} else if _, err := DBExec("DELETE FROM flag_found WHERE id_flag IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?)", e.Id); err != nil {
@ -282,6 +282,15 @@ func (e Exercice) DeleteDeep() (int64, error) {
return 0, err
} else if _, err := DBExec("DELETE FROM exercice_tries WHERE id_exercice = ?", e.Id); err != nil {
return 0, err
} else {
return 1, nil
}
}
// DeleteDeep the challenge from the database, including player content.
func (e Exercice) DeleteDeep() (int64, error) {
if _, err := e.DeleteCascadePlayer(); err != nil {
return 0, err
} else {
return e.DeleteCascade()
}

View File

@ -117,3 +117,55 @@ func (t Theme) Delete() (int64, error) {
return nb, err
}
}
func (t Theme) deleteFunc(f func(Exercice) (int64, error)) (int64, error) {
exercices, err := t.GetExercices()
if err != nil {
return 0, err
}
for _, exercice := range exercices {
_, err := f(exercice)
if err != nil {
return 0, err
}
}
return 1, nil
}
// DeleteCascade the theme from the database, including inner content but not player content.
func (t Theme) DeleteCascade() (int64, error) {
_, err := t.deleteFunc(func(e Exercice) (int64, error) {
return e.DeleteCascade()
})
if err != nil {
return 0, err
}
return t.Delete()
}
// DeleteCascadePlayer delete player content related to this theme.
func (t Theme) DeleteCascadePlayer() (int64, error) {
_, err := t.deleteFunc(func(e Exercice) (int64, error) {
return e.DeleteCascadePlayer()
})
if err != nil {
return 0, err
}
return 1, nil
}
// DeleteDeep the theme from the database, including player content.
func (t Theme) DeleteDeep() (int64, error) {
_, err := t.deleteFunc(func(e Exercice) (int64, error) {
return e.DeleteDeep()
})
if err != nil {
return 0, err
}
return t.Delete()
}