ef58cff9ce0675218ecc0f241c216fd7e23e8942
[fic/server.git] / libfic / flag_choice.go
1 package fic
2
3 import ()
4
5 // FlagChoice represents a choice a respond to a classic flag
6 type FlagChoice struct {
7         Id              int64   `json:"id"`
8         // IdFlag is the identifier of the underlying flag
9         IdFlag          int64   `json:"idFlag"`
10         // Label is the title of the choice as displayed to players
11         Label           string  `json:"label"`
12         // Value is the raw content that'll be written as response if this choice is selected
13         Value           string  `json:"value"`
14 }
15
16 // GetChoices returns a list of choices for the given Flag.
17 func (f Flag) GetChoices() ([]FlagChoice, error) {
18         if rows, err := DBQuery("SELECT id_choice, id_flag, label, response FROM flag_choices WHERE id_flag = ?", f.Id); err != nil {
19                 return nil, err
20         } else {
21                 defer rows.Close()
22
23                 var choices = make([]FlagChoice, 0)
24                 for rows.Next() {
25                         var c FlagChoice
26                         c.IdFlag = f.Id
27
28                         if err := rows.Scan(&c.Id, &c.IdFlag, &c.Label, &c.Value); err != nil {
29                                 return nil, err
30                         }
31
32                         choices = append(choices, c)
33                 }
34                 if err := rows.Err(); err != nil {
35                         return nil, err
36                 }
37
38                 return choices, nil
39         }
40 }
41
42 // GetChoice returns a choice for the given Flag.
43 func (f Flag) GetChoice(id int64) (c FlagChoice, err error) {
44         if errr := DBQueryRow("SELECT id_choice, id_flag, label, response FROM flag_choices WHERE id_choice = ?", id).Scan(&c.Id, &c.IdFlag, &c.Label, &c.Value); errr != nil {
45                 return c, errr
46         }
47         return
48 }
49
50 // AddChoice creates and fills a new struct FlagChoice, from a label and a value.
51 func (f Flag) AddChoice(label string, value string) (FlagChoice, error) {
52         if res, err := DBExec("INSERT INTO flag_choices (id_flag, label, response) VALUES (?, ?, ?)", f.Id, label, value); err != nil {
53                 return FlagChoice{}, err
54         } else if cid, err := res.LastInsertId(); err != nil {
55                 return FlagChoice{}, err
56         } else {
57                 return FlagChoice{cid, f.Id, label, value}, nil
58         }
59 }
60
61 // Update applies modifications back to the database.
62 func (c FlagChoice) Update() (int64, error) {
63         if res, err := DBExec("UPDATE flag_choices SET id_flag = ?, label = ?, value = ? WHERE id_choice = ?", c.IdFlag, c.Label, c.Value, c.Id); err != nil {
64                 return 0, err
65         } else if nb, err := res.RowsAffected(); err != nil {
66                 return 0, err
67         } else {
68                 return nb, err
69         }
70 }
71
72 // Delete the flag from the database.
73 func (c FlagChoice) Delete() (int64, error) {
74         if res, err := DBExec("DELETE FROM flag_choices WHERE id_choice = ?", c.Id); err != nil {
75                 return 0, err
76         } else if nb, err := res.RowsAffected(); err != nil {
77                 return 0, err
78         } else {
79                 return nb, err
80         }
81 }
82
83 // WipeFlags deletes flags coming with the challenge.
84 func (f Flag) WipeChoices() (int64, error) {
85         if res, err := DBExec("DELETE FROM flag_choices WHERE id_flag = ?", f.Id); err != nil {
86                 return 0, err
87         } else if nb, err := res.RowsAffected(); err != nil {
88                 return 0, err
89         } else {
90                 return nb, err
91         }
92 }