From 4a268ef8c73e80381ca6f96cb238ef652ca2a290 Mon Sep 17 00:00:00 2001 From: tijl Date: Mon, 26 Aug 2024 00:18:45 +0200 Subject: [PATCH] basic app implementation --- internal/apps/flags/locales/en.json | 534 ++++++++++++++-------------- internal/apps/flags/main.go | 45 +++ internal/oidc/handler.go | 7 +- internal/queries/app_flags.sql | 4 +- internal/queries/app_flags.sql.go | 17 +- internal/queries/models.go | 2 +- migrations/00000002_flags.up.sql | 2 +- web/views/apps/flags/question.html | 0 web/views/apps/flags/start.html | 28 +- 9 files changed, 354 insertions(+), 285 deletions(-) create mode 100644 web/views/apps/flags/question.html diff --git a/internal/apps/flags/locales/en.json b/internal/apps/flags/locales/en.json index 3c0ce1a..1daeaa4 100644 --- a/internal/apps/flags/locales/en.json +++ b/internal/apps/flags/locales/en.json @@ -1,269 +1,269 @@ { - "Asia": "Asia", - "MiddleEast": "Middle East", - "SoutheastAsia": "Southeast Asia", - "CentralAsia": "Central Asia", - "Europe": "Europe", - "Balkans": "Balkans", - "NorthAmerica": "North America", - "SouthAmerica": "South America", - "CentralAmerica": "Central America", - "Caribbean": "Caribbean", - "Africa": "Africa", - "NorthAfrica": "North Africa", - "SouthernAfrica": "Southern Africa", - "WestAfrica": "West Africa", - "EastAfrica": "East Africa", - "CentralAfrica": "Central Africa", - "Oceania": "Oceania", - "BD": "Bangladesh", - "BE": "Belgium", - "BF": "Burkina Faso", - "BG": "Bulgaria", - "BA": "Bosnia and Herzegovina", - "BB": "Barbados", - "WF": "Wallis and Futuna", - "BL": "Saint Barthelemy", - "BM": "Bermuda", - "BN": "Brunei", - "BO": "Bolivia", - "BH": "Bahrain", - "BI": "Burundi", - "BJ": "Benin", - "BT": "Bhutan", - "JM": "Jamaica", - "BV": "Bouvet Island", - "BW": "Botswana", - "WS": "Samoa", - "BQ": "Caribbean Netherlands", - "BR": "Brazil", - "BS": "Bahamas", - "JE": "Jersey", - "BY": "Belarus", - "BZ": "Belize", - "RU": "Russia", - "RW": "Rwanda", - "RS": "Serbia", - "TL": "East Timor", - "RE": "Reunion", - "TM": "Turkmenistan", - "TJ": "Tajikistan", - "RO": "Romania", - "TK": "Tokelau", - "GW": "Guinea-Bissau", - "GU": "Guam", - "GT": "Guatemala", - "GS": "South Georgia and the South Sandwich Islands", - "GR": "Greece", - "GQ": "Equatorial Guinea", - "GP": "Guadeloupe", - "JP": "Japan", - "GY": "Guyana", - "GG": "Guernsey", - "GF": "French Guiana", - "GE": "Georgia", - "GD": "Grenada", - "GB": "United Kingdom", - "GA": "Gabon", - "SV": "El Salvador", - "GN": "Guinea", - "GM": "Gambia", - "GL": "Greenland", - "GI": "Gibraltar", - "GH": "Ghana", - "OM": "Oman", - "TN": "Tunisia", - "JO": "Jordan", - "HR": "Croatia", - "HT": "Haiti", - "HU": "Hungary", - "HK": "Hong Kong", - "HN": "Honduras", - "HM": "Heard Island and McDonald Islands", - "VE": "Venezuela", - "PR": "Puerto Rico", - "PS": "Palestine", - "PW": "Palau", - "PT": "Portugal", - "SJ": "Svalbard and Jan Mayen", - "PY": "Paraguay", - "IQ": "Iraq", - "PA": "Panama", - "PF": "French Polynesia", - "PG": "Papua New Guinea", - "PE": "Peru", - "PK": "Pakistan", - "PH": "Philippines", - "PN": "Pitcairn", - "PL": "Poland", - "PM": "Saint Pierre and Miquelon", - "ZM": "Zambia", - "EH": "Western Sahara", - "EE": "Estonia", - "EG": "Egypt", - "ZA": "South Africa", - "EC": "Ecuador", - "IT": "Italy", - "VN": "Vietnam", - "SB": "Solomon Islands", - "ET": "Ethiopia", - "SO": "Somalia", - "ZW": "Zimbabwe", - "SA": "Saudi Arabia", - "ES": "Spain", - "ER": "Eritrea", - "ME": "Montenegro", - "MD": "Moldova", - "MG": "Madagascar", - "MF": "Saint Martin", - "MA": "Morocco", - "MC": "Monaco", - "UZ": "Uzbekistan", - "MM": "Myanmar", - "ML": "Mali", - "MO": "Macao", - "MN": "Mongolia", - "MH": "Marshall Islands", - "MK": "Macedonia", - "MU": "Mauritius", - "MT": "Malta", - "MW": "Malawi", - "MV": "Maldives", - "MQ": "Martinique", - "MP": "Northern Mariana Islands", - "MS": "Montserrat", - "MR": "Mauritania", - "IM": "Isle of Man", - "UG": "Uganda", - "TZ": "Tanzania", - "MY": "Malaysia", - "MX": "Mexico", - "IL": "Israel", - "FR": "France", - "IO": "British Indian Ocean Territory", - "SH": "Saint Helena", - "FI": "Finland", - "FJ": "Fiji", - "FK": "Falkland Islands", - "FM": "Micronesia", - "FO": "Faroe Islands", - "NI": "Nicaragua", - "NL": "Netherlands", - "NO": "Norway", - "NA": "Namibia", - "VU": "Vanuatu", - "NC": "New Caledonia", - "NE": "Niger", - "NF": "Norfolk Island", - "NG": "Nigeria", - "NZ": "New Zealand", - "NP": "Nepal", - "NR": "Nauru", - "NU": "Niue", - "CK": "Cook Islands", - "XK": "Kosovo", - "CI": "Ivory Coast", - "CH": "Switzerland", - "CO": "Colombia", - "CN": "China", - "CM": "Cameroon", - "CL": "Chile", - "CC": "Cocos Islands", - "CA": "Canada", - "CG": "Republic of the Congo", - "CF": "Central African Republic", - "CD": "Democratic Republic of the Congo", - "CZ": "Czech Republic", - "CY": "Cyprus", - "CX": "Christmas Island", - "CR": "Costa Rica", - "CW": "Curacao", - "CV": "Cape Verde", - "CU": "Cuba", - "SZ": "Swaziland", - "SY": "Syria", - "SX": "Sint Maarten", - "KG": "Kyrgyzstan", - "KE": "Kenya", - "SS": "South Sudan", - "SR": "Suriname", - "KI": "Kiribati", - "KH": "Cambodia", - "KN": "Saint Kitts and Nevis", - "KM": "Comoros", - "ST": "Sao Tome and Principe", - "SK": "Slovakia", - "KR": "South Korea", - "SI": "Slovenia", - "KP": "North Korea", - "KW": "Kuwait", - "SN": "Senegal", - "SM": "San Marino", - "SL": "Sierra Leone", - "SC": "Seychelles", - "KZ": "Kazakhstan", - "KY": "Cayman Islands", - "SG": "Singapore", - "SE": "Sweden", - "SD": "Sudan", - "DO": "Dominican Republic", - "DM": "Dominica", - "DJ": "Djibouti", - "DK": "Denmark", - "VG": "British Virgin Islands", - "DE": "Germany", - "YE": "Yemen", - "DZ": "Algeria", - "US": "United States", - "UY": "Uruguay", - "YT": "Mayotte", - "UM": "United States Minor Outlying Islands", - "LB": "Lebanon", - "LC": "Saint Lucia", - "LA": "Laos", - "TV": "Tuvalu", - "TW": "Taiwan", - "TT": "Trinidad and Tobago", - "TR": "Turkey", - "LK": "Sri Lanka", - "LI": "Liechtenstein", - "LV": "Latvia", - "TO": "Tonga", - "LT": "Lithuania", - "LU": "Luxembourg", - "LR": "Liberia", - "LS": "Lesotho", - "TH": "Thailand", - "TF": "French Southern Territories", - "TG": "Togo", - "TD": "Chad", - "TC": "Turks and Caicos Islands", - "LY": "Libya", - "VA": "Vatican", - "VC": "Saint Vincent and the Grenadines", - "AE": "United Arab Emirates", - "AD": "Andorra", - "AG": "Antigua and Barbuda", - "AF": "Afghanistan", - "AI": "Anguilla", - "VI": "U.S. Virgin Islands", - "IS": "Iceland", - "IR": "Iran", - "AM": "Armenia", - "AL": "Albania", - "AO": "Angola", - "AQ": "Antarctica", - "AS": "American Samoa", - "AR": "Argentina", - "AU": "Australia", - "AT": "Austria", - "AW": "Aruba", - "IN": "India", - "AX": "Aland Islands", - "AZ": "Azerbaijan", - "IE": "Ireland", - "ID": "Indonesia", - "UA": "Ukraine", - "QA": "Qatar", - "MZ": "Mozambique" + "Asia": "Asia", + "MiddleEast": "Middle East", + "SoutheastAsia": "Southeast Asia", + "CentralAsia": "Central Asia", + "Europe": "Europe", + "Balkans": "Balkans", + "NorthAmerica": "North America", + "SouthAmerica": "South America", + "CentralAmerica": "Central America", + "Caribbean": "Caribbean", + "Africa": "Africa", + "NorthAfrica": "North Africa", + "SouthernAfrica": "Southern Africa", + "WestAfrica": "West Africa", + "EastAfrica": "East Africa", + "CentralAfrica": "Central Africa", + "Oceania": "Oceania", + "BD": "Bangladesh", + "BE": "Belgium", + "BF": "Burkina Faso", + "BG": "Bulgaria", + "BA": "Bosnia and Herzegovina", + "BB": "Barbados", + "WF": "Wallis and Futuna", + "BL": "Saint Barthelemy", + "BM": "Bermuda", + "BN": "Brunei", + "BO": "Bolivia", + "BH": "Bahrain", + "BI": "Burundi", + "BJ": "Benin", + "BT": "Bhutan", + "JM": "Jamaica", + "BV": "Bouvet Island", + "BW": "Botswana", + "WS": "Samoa", + "BQ": "Caribbean Netherlands", + "BR": "Brazil", + "BS": "Bahamas", + "JE": "Jersey", + "BY": "Belarus", + "BZ": "Belize", + "RU": "Russia", + "RW": "Rwanda", + "RS": "Serbia", + "TL": "East Timor", + "RE": "Reunion", + "TM": "Turkmenistan", + "TJ": "Tajikistan", + "RO": "Romania", + "TK": "Tokelau", + "GW": "Guinea-Bissau", + "GU": "Guam", + "GT": "Guatemala", + "GS": "South Georgia and the South Sandwich Islands", + "GR": "Greece", + "GQ": "Equatorial Guinea", + "GP": "Guadeloupe", + "JP": "Japan", + "GY": "Guyana", + "GG": "Guernsey", + "GF": "French Guiana", + "GE": "Georgia", + "GD": "Grenada", + "GB": "United Kingdom", + "GA": "Gabon", + "SV": "El Salvador", + "GN": "Guinea", + "GM": "Gambia", + "GL": "Greenland", + "GI": "Gibraltar", + "GH": "Ghana", + "OM": "Oman", + "TN": "Tunisia", + "JO": "Jordan", + "HR": "Croatia", + "HT": "Haiti", + "HU": "Hungary", + "HK": "Hong Kong", + "HN": "Honduras", + "HM": "Heard Island and McDonald Islands", + "VE": "Venezuela", + "PR": "Puerto Rico", + "PS": "Palestine", + "PW": "Palau", + "PT": "Portugal", + "SJ": "Svalbard and Jan Mayen", + "PY": "Paraguay", + "IQ": "Iraq", + "PA": "Panama", + "PF": "French Polynesia", + "PG": "Papua New Guinea", + "PE": "Peru", + "PK": "Pakistan", + "PH": "Philippines", + "PN": "Pitcairn", + "PL": "Poland", + "PM": "Saint Pierre and Miquelon", + "ZM": "Zambia", + "EH": "Western Sahara", + "EE": "Estonia", + "EG": "Egypt", + "ZA": "South Africa", + "EC": "Ecuador", + "IT": "Italy", + "VN": "Vietnam", + "SB": "Solomon Islands", + "ET": "Ethiopia", + "SO": "Somalia", + "ZW": "Zimbabwe", + "SA": "Saudi Arabia", + "ES": "Spain", + "ER": "Eritrea", + "ME": "Montenegro", + "MD": "Moldova", + "MG": "Madagascar", + "MF": "Saint Martin", + "MA": "Morocco", + "MC": "Monaco", + "UZ": "Uzbekistan", + "MM": "Myanmar", + "ML": "Mali", + "MO": "Macao", + "MN": "Mongolia", + "MH": "Marshall Islands", + "MK": "Macedonia", + "MU": "Mauritius", + "MT": "Malta", + "MW": "Malawi", + "MV": "Maldives", + "MQ": "Martinique", + "MP": "Northern Mariana Islands", + "MS": "Montserrat", + "MR": "Mauritania", + "IM": "Isle of Man", + "UG": "Uganda", + "TZ": "Tanzania", + "MY": "Malaysia", + "MX": "Mexico", + "IL": "Israel", + "FR": "France", + "IO": "British Indian Ocean Territory", + "SH": "Saint Helena", + "FI": "Finland", + "FJ": "Fiji", + "FK": "Falkland Islands", + "FM": "Micronesia", + "FO": "Faroe Islands", + "NI": "Nicaragua", + "NL": "Netherlands", + "NO": "Norway", + "NA": "Namibia", + "VU": "Vanuatu", + "NC": "New Caledonia", + "NE": "Niger", + "NF": "Norfolk Island", + "NG": "Nigeria", + "NZ": "New Zealand", + "NP": "Nepal", + "NR": "Nauru", + "NU": "Niue", + "CK": "Cook Islands", + "XK": "Kosovo", + "CI": "Ivory Coast", + "CH": "Switzerland", + "CO": "Colombia", + "CN": "China", + "CM": "Cameroon", + "CL": "Chile", + "CC": "Cocos Islands", + "CA": "Canada", + "CG": "Republic of the Congo", + "CF": "Central African Republic", + "CD": "Democratic Republic of the Congo", + "CZ": "Czech Republic", + "CY": "Cyprus", + "CX": "Christmas Island", + "CR": "Costa Rica", + "CW": "Curacao", + "CV": "Cape Verde", + "CU": "Cuba", + "SZ": "Swaziland", + "SY": "Syria", + "SX": "Sint Maarten", + "KG": "Kyrgyzstan", + "KE": "Kenya", + "SS": "South Sudan", + "SR": "Suriname", + "KI": "Kiribati", + "KH": "Cambodia", + "KN": "Saint Kitts and Nevis", + "KM": "Comoros", + "ST": "Sao Tome and Principe", + "SK": "Slovakia", + "KR": "South Korea", + "SI": "Slovenia", + "KP": "North Korea", + "KW": "Kuwait", + "SN": "Senegal", + "SM": "San Marino", + "SL": "Sierra Leone", + "SC": "Seychelles", + "KZ": "Kazakhstan", + "KY": "Cayman Islands", + "SG": "Singapore", + "SE": "Sweden", + "SD": "Sudan", + "DO": "Dominican Republic", + "DM": "Dominica", + "DJ": "Djibouti", + "DK": "Denmark", + "VG": "British Virgin Islands", + "DE": "Germany", + "YE": "Yemen", + "DZ": "Algeria", + "US": "United States", + "UY": "Uruguay", + "YT": "Mayotte", + "UM": "United States Minor Outlying Islands", + "LB": "Lebanon", + "LC": "Saint Lucia", + "LA": "Laos", + "TV": "Tuvalu", + "TW": "Taiwan", + "TT": "Trinidad and Tobago", + "TR": "Turkey", + "LK": "Sri Lanka", + "LI": "Liechtenstein", + "LV": "Latvia", + "TO": "Tonga", + "LT": "Lithuania", + "LU": "Luxembourg", + "LR": "Liberia", + "LS": "Lesotho", + "TH": "Thailand", + "TF": "French Southern Territories", + "TG": "Togo", + "TD": "Chad", + "TC": "Turks and Caicos Islands", + "LY": "Libya", + "VA": "Vatican", + "VC": "Saint Vincent and the Grenadines", + "AE": "United Arab Emirates", + "AD": "Andorra", + "AG": "Antigua and Barbuda", + "AF": "Afghanistan", + "AI": "Anguilla", + "VI": "U.S. Virgin Islands", + "IS": "Iceland", + "IR": "Iran", + "AM": "Armenia", + "AL": "Albania", + "AO": "Angola", + "AQ": "Antarctica", + "AS": "American Samoa", + "AR": "Argentina", + "AU": "Australia", + "AT": "Austria", + "AW": "Aruba", + "IN": "India", + "AX": "Aland Islands", + "AZ": "Azerbaijan", + "IE": "Ireland", + "ID": "Indonesia", + "UA": "Ukraine", + "QA": "Qatar", + "MZ": "Mozambique" } diff --git a/internal/apps/flags/main.go b/internal/apps/flags/main.go index 452ceea..f750b61 100644 --- a/internal/apps/flags/main.go +++ b/internal/apps/flags/main.go @@ -3,9 +3,14 @@ package flags // WIP import ( + "context" + "database/sql" "embed" "encoding/json" + "strconv" + "git.tijl.dev/tijl/tijl.dev-core/internal/queries" + "git.tijl.dev/tijl/tijl.dev-core/modules/db" "git.tijl.dev/tijl/tijl.dev-core/modules/i18n" log "git.tijl.dev/tijl/tijl.dev-core/modules/logger" "git.tijl.dev/tijl/tijl.dev-core/modules/web" @@ -38,6 +43,46 @@ func Setup() { data["SupportedTags"] = supportedTags return c.Render("apps/flags/start", data, "layouts/base") }) + + a.Post("/app/flags", func(c *fiber.Ctx) error { + + recType := c.FormValue("type") + + if recType == "start" { + + values := c.Request().PostArgs().PeekMulti("tags") + var selectedTags []string + for _, v := range values { + selectedTags = append(selectedTags, string(v)) + } + + maxQuestions, err := strconv.Atoi(c.FormValue("max_questions")) + if err != nil { + return err + } + + _, err = db.Queries.CreateFlagsGame(context.TODO(), queries.CreateFlagsGameParams{ + Uid: sql.NullString{}, + Tags: selectedTags, + QuestionAmount: int32(maxQuestions), + }) + if err != nil { + return err + } + + c.Cookie(&fiber.Cookie{ + Name: "app_flags_game_session", + Value: "", + }) + + data := *web.Common(c) + data["Title"] = "tmp" + return c.Render("apps/flags/question", data, "layouts/base") + + } + + return nil + }) }, 1000) } diff --git a/internal/oidc/handler.go b/internal/oidc/handler.go index 5d6059c..8042c10 100644 --- a/internal/oidc/handler.go +++ b/internal/oidc/handler.go @@ -56,7 +56,7 @@ func HandleCallback(c *fiber.Ctx) error { _, err = db.Queries.GetUser(ctx, idToken.Subject) if err == nil { - db.Queries.UpdateUserData(ctx, queries.UpdateUserDataParams{ + err = db.Queries.UpdateUserData(ctx, queries.UpdateUserDataParams{ Uid: idToken.Subject, Email: claims.Email, EmailVerified: claims.EmailVerified, @@ -64,7 +64,7 @@ func HandleCallback(c *fiber.Ctx) error { FullName: claims.Name, }) } else if err == sql.ErrNoRows { - db.Queries.CreateUser(ctx, queries.CreateUserParams{ + err = db.Queries.CreateUser(ctx, queries.CreateUserParams{ Uid: idToken.Subject, Email: claims.Email, EmailVerified: claims.EmailVerified, @@ -75,6 +75,9 @@ func HandleCallback(c *fiber.Ctx) error { log.Error().Err(err).Msg("error getting user") return err } + if err != nil { + return err + } _, err = user.NewSession(idToken.Subject, c) if err != nil { diff --git a/internal/queries/app_flags.sql b/internal/queries/app_flags.sql index e9792e3..4c360ec 100644 --- a/internal/queries/app_flags.sql +++ b/internal/queries/app_flags.sql @@ -1,7 +1,7 @@ --- name: CreateFlagsGame :exec +-- name: CreateFlagsGame :one INSERT INTO app_flags_games (uid, tags, question_amount) VALUES ($1, $2, $3) -RETURNING (game_id, game_seed); +RETURNING game_id, game_seed; -- name: GetFlagsGame :one SELECT * FROM app_flags_games WHERE game_id = $1 LIMIT 1; diff --git a/internal/queries/app_flags.sql.go b/internal/queries/app_flags.sql.go index 9e7f472..a5537a0 100644 --- a/internal/queries/app_flags.sql.go +++ b/internal/queries/app_flags.sql.go @@ -13,10 +13,10 @@ import ( "github.com/lib/pq" ) -const createFlagsGame = `-- name: CreateFlagsGame :exec +const createFlagsGame = `-- name: CreateFlagsGame :one INSERT INTO app_flags_games (uid, tags, question_amount) VALUES ($1, $2, $3) -RETURNING (game_id, game_seed) +RETURNING game_id, game_seed ` type CreateFlagsGameParams struct { @@ -25,9 +25,16 @@ type CreateFlagsGameParams struct { QuestionAmount int32 } -func (q *Queries) CreateFlagsGame(ctx context.Context, arg CreateFlagsGameParams) error { - _, err := q.db.ExecContext(ctx, createFlagsGame, arg.Uid, pq.Array(arg.Tags), arg.QuestionAmount) - return err +type CreateFlagsGameRow struct { + GameID uuid.UUID + GameSeed uuid.NullUUID +} + +func (q *Queries) CreateFlagsGame(ctx context.Context, arg CreateFlagsGameParams) (CreateFlagsGameRow, error) { + row := q.db.QueryRowContext(ctx, createFlagsGame, arg.Uid, pq.Array(arg.Tags), arg.QuestionAmount) + var i CreateFlagsGameRow + err := row.Scan(&i.GameID, &i.GameSeed) + return i, err } const getFlagsGame = `-- name: GetFlagsGame :one diff --git a/internal/queries/models.go b/internal/queries/models.go index cbb2bb6..29410a8 100644 --- a/internal/queries/models.go +++ b/internal/queries/models.go @@ -24,7 +24,7 @@ type AppFlagsGame struct { } type AppFlagsGamesAnswer struct { - GameID uuid.NullUUID + GameID uuid.UUID Question int32 Correct bool } diff --git a/migrations/00000002_flags.up.sql b/migrations/00000002_flags.up.sql index 4e0a634..3778bae 100644 --- a/migrations/00000002_flags.up.sql +++ b/migrations/00000002_flags.up.sql @@ -12,7 +12,7 @@ CREATE TABLE app_flags_games ( ); CREATE TABLE app_flags_games_answers ( - game_id UUID, + game_id UUID NOT NULL, question INT NOT NULL, correct BOOLEAN NOT NULL, FOREIGN KEY (game_id) REFERENCES app_flags_games (game_id), diff --git a/web/views/apps/flags/question.html b/web/views/apps/flags/question.html new file mode 100644 index 0000000..e69de29 diff --git a/web/views/apps/flags/start.html b/web/views/apps/flags/start.html index 8f107c6..67657bd 100644 --- a/web/views/apps/flags/start.html +++ b/web/views/apps/flags/start.html @@ -1,8 +1,22 @@ -
- {{range .SupportedTags}} - - {{end}} +
+
+ + +
+ {{range .SupportedTags}} + + {{end}} +
+ + + + + +