2018-09-24 08:00:17 +00:00
package fic
2019-01-02 20:51:09 +00:00
import ( )
2018-09-24 08:00:17 +00:00
2019-01-02 20:51:09 +00:00
type Flag interface {
2021-08-30 16:33:14 +00:00
GetId ( ) int
2019-11-25 13:19:29 +00:00
RecoverId ( ) ( Flag , error )
2021-11-22 14:35:07 +00:00
Create ( e * Exercice ) ( Flag , error )
2019-01-02 20:51:09 +00:00
Update ( ) ( int64 , error )
Delete ( ) ( int64 , error )
2019-07-05 20:28:56 +00:00
AddDepend ( d Flag ) error
2019-01-02 20:51:09 +00:00
GetDepends ( ) ( [ ] Flag , error )
2021-08-30 16:33:14 +00:00
GetOrder ( ) int8
2019-01-02 20:51:09 +00:00
Check ( val interface { } ) int
2021-11-22 14:35:07 +00:00
FoundBy ( t * Team )
2018-09-24 08:00:17 +00:00
}
2019-01-02 20:51:09 +00:00
// GetFlag returns a list of flags comming with the challenge.
2021-11-22 14:35:07 +00:00
func ( e * Exercice ) GetFlags ( ) ( [ ] Flag , error ) {
var flags [ ] Flag
2019-01-02 20:51:09 +00:00
if ks , err := e . GetFlagKeys ( ) ; err != nil {
2018-09-24 08:00:17 +00:00
return nil , err
} else {
2019-01-02 20:51:09 +00:00
for _ , k := range ks {
2018-09-24 08:00:17 +00:00
flags = append ( flags , k )
}
}
2019-01-02 20:51:09 +00:00
if ms , err := e . GetMCQ ( ) ; err != nil {
return nil , err
2018-09-24 08:00:17 +00:00
} else {
2019-01-02 20:51:09 +00:00
for _ , m := range ms {
flags = append ( flags , m )
2018-11-16 19:46:19 +00:00
}
}
2019-01-02 20:51:09 +00:00
return flags , nil
2018-09-24 08:00:17 +00:00
}
2019-07-05 20:28:56 +00:00
// AddFlag add the given flag and eventually its entries (from MCQ).
2021-11-22 14:35:07 +00:00
func ( e * Exercice ) AddFlag ( flag Flag ) ( Flag , error ) {
2019-07-05 20:28:56 +00:00
return flag . Create ( e )
}
2018-09-24 08:00:17 +00:00
// WipeFlags deletes flags coming with the challenge.
2021-11-22 14:35:07 +00:00
func ( e * Exercice ) WipeFlags ( ) ( int64 , error ) {
2020-01-20 16:28:37 +00:00
if _ , err := DBExec ( "DELETE FROM exercice_files_okey_deps WHERE id_flag IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?)" , e . Id ) ; err != nil {
return 0 , err
} else if _ , err := DBExec ( "DELETE FROM exercice_files_omcq_deps WHERE id_mcq IN (SELECT id_mcq FROM exercice_mcq WHERE id_exercice = ?)" , e . Id ) ; err != nil {
2018-09-24 08:00:17 +00:00
return 0 , err
2019-01-16 05:02:06 +00:00
} else if _ , err := DBExec ( "DELETE FROM exercice_flags_deps WHERE id_flag IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?) OR id_flag_dep IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?)" , e . Id , e . Id ) ; err != nil {
return 0 , err
} else if _ , err := DBExec ( "DELETE FROM exercice_flags_omcq_deps WHERE id_flag IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?)" , e . Id ) ; err != nil {
return 0 , err
2020-01-23 11:39:53 +00:00
} else if _ , err := DBExec ( "DELETE FROM exercice_hints_okey_deps WHERE id_flag_dep IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?)" , e . Id ) ; err != nil {
return 0 , err
} else if _ , err := DBExec ( "DELETE FROM exercice_hints_omcq_deps WHERE id_mcq_dep IN (SELECT id_mcq FROM exercice_mcq WHERE id_exercice = ?)" , e . Id ) ; err != nil {
2019-10-26 09:33:30 +00:00
return 0 , err
2019-01-16 05:02:06 +00:00
} else if _ , err := DBExec ( "DELETE FROM exercice_mcq_okey_deps WHERE id_flag_dep IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?)" , e . Id ) ; err != nil {
2018-12-02 18:21:07 +00:00
return 0 , err
2018-12-02 22:18:32 +00:00
} else if _ , err := DBExec ( "DELETE FROM team_wchoices WHERE id_flag IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?)" , e . Id ) ; err != nil {
return 0 , err
2018-11-21 03:10:22 +00:00
} else if _ , err := DBExec ( "DELETE FROM flag_choices WHERE id_flag IN (SELECT id_flag FROM exercice_flags WHERE id_exercice = ?)" , e . Id ) ; err != nil {
return 0 , err
2018-09-24 08:00:17 +00:00
} else if res , err := DBExec ( "DELETE FROM exercice_flags WHERE id_exercice = ?" , e . Id ) ; err != nil {
return 0 , err
} else if nb , err := res . RowsAffected ( ) ; err != nil {
return 0 , err
} else {
return nb , err
}
}