From 57cf47dad4f1d94b2cae6dba7dfd237dc09c8e46 Mon Sep 17 00:00:00 2001 From: Tom <20648924+moT01@users.noreply.github.com> Date: Fri, 11 Feb 2022 09:39:27 -0600 Subject: [PATCH] feat: split rdbms into individual blocks and two challengeTypes (#44978) * feat: split english rdbms into individual blocks fix: stuff fix: remove from partiallyComplete array on submit fix: add suggestion Update client/i18n/locales/english/translations.json Co-authored-by: Oliver Eyton-Williams Update client/i18n/locales/english/intro.json Co-authored-by: Oliver Eyton-Williams Update client/i18n/locales/english/intro.json Co-authored-by: Oliver Eyton-Williams Update client/i18n/locales/english/intro.json Co-authored-by: Oliver Eyton-Williams Update client/src/templates/Challenges/codeally/show.tsx Co-authored-by: Oliver Eyton-Williams Update client/src/templates/Challenges/codeally/show.tsx Co-authored-by: Oliver Eyton-Williams Update client/src/templates/Challenges/codeally/show.tsx Co-authored-by: Oliver Eyton-Williams Update client/src/templates/Challenges/codeally/show.tsx Co-authored-by: Oliver Eyton-Williams Update client/src/templates/Challenges/codeally/show.tsx Co-authored-by: Oliver Eyton-Williams Update client/src/templates/Challenges/codeally/show.tsx Co-authored-by: Oliver Eyton-Williams Update client/src/templates/Challenges/codeally/show.tsx Co-authored-by: Oliver Eyton-Williams Update client/src/templates/Challenges/codeally/show.tsx Co-authored-by: Oliver Eyton-Williams * fix: prettier * fix: style suggestion * Apply suggestions from code review Co-authored-by: Oliver Eyton-Williams Co-authored-by: Oliver Eyton-Williams --- api-server/src/common/models/user.js | 19 ++ api-server/src/common/models/user.json | 9 + api-server/src/common/utils/index.js | 3 + api-server/src/server/boot/challenge.js | 85 ++++- api-server/src/server/boot/user.js | 44 ++- .../src/server/utils/publicUserProps.js | 1 + .../locales/chinese-traditional/intro.json | 104 +++++- client/i18n/locales/chinese/intro.json | 104 +++++- client/i18n/locales/english/intro.json | 104 +++++- client/i18n/locales/english/translations.json | 15 +- client/i18n/locales/espanol/intro.json | 104 +++++- client/i18n/locales/italian/intro.json | 104 +++++- client/i18n/locales/japanese/intro.json | 104 +++++- client/i18n/locales/portuguese/intro.json | 104 +++++- client/i18n/locales/ukrainian/intro.json | 104 +++++- .../components/Flash/redux/flash-messages.ts | 1 + .../src/components/settings/webhook-token.tsx | 6 +- client/src/redux/index.js | 2 + .../Challenges/codeally/codeally.css | 15 + .../templates/Challenges/codeally/show.tsx | 303 +++++++++++++++++- .../components/challenge-description.css | 5 +- .../Introduction/components/block.tsx | 4 +- .../Introduction/super-block-intro.tsx | 4 - client/src/utils/tone/index.ts | 1 + client/utils/challenge-types.js | 10 +- client/utils/gatsby/challenge-page-creator.js | 4 +- client/utils/help-category-map.json | 29 +- .../meta.json | 14 + .../meta.json | 14 + .../meta.json | 14 + .../meta.json | 14 + .../meta.json | 14 + .../meta.json | 14 + .../meta.json | 14 + .../meta.json | 14 + .../meta.json | 14 + .../meta.json | 14 + .../learn-nano-by-building-a-castle/meta.json | 14 + .../meta.json | 14 + .../learn-relational-databases/meta.json | 74 ----- .../meta.json | 14 + .../meta.json | 14 + .../build-a-celestial-bodies-database.md | 26 ++ .../build-a-number-guessing-game.md | 26 ++ .../build-a-periodic-table-database.md | 26 ++ .../build-a-salon-appointment-scheduler.md | 26 ++ .../build-a-world-cup-database.md | 26 ++ .../build-a-kitty-ipsum-translator.md} | 8 +- .../build-a-bike-rental-shop.md | 20 ++ .../build-a-boilerplate.md | 20 ++ .../build-five-programs.md | 20 ++ .../build-an-sql-reference-object.md | 20 ++ .../build-a-castle.md} | 8 +- .../build-a-mario-database.md | 20 ++ .../celestial-bodies-database.md | 18 -- ...-and-sql-by-building-a-bike-rental-shop.md | 17 - .../learn-bash-by-building-a-boilerplate.md | 18 -- ...ash-scripting-by-building-five-programs.md | 18 -- ...git-by-building-an-sql-reference-object.md | 18 -- ...building-a-list-of-inspirational-quotes.md | 18 -- ...-databases-by-building-a-mario-database.md | 18 -- ...l-by-building-a-student-database-part-1.md | 18 -- ...l-by-building-a-student-database-part-2.md | 18 -- .../number-guessing-game.md | 18 -- .../periodic-table-database.md | 18 -- .../salon-appointment-scheduler.md | 18 -- .../world-cup-database.md | 18 -- .../build-a-student-database-part-1.md | 20 ++ .../build-a-student-database-part-2.md | 20 ++ .../build-a-celestial-bodies-database.md | 26 ++ .../build-a-number-guessing-game.md | 26 ++ .../build-a-periodic-table-database.md | 26 ++ .../build-a-salon-appointment-scheduler.md | 26 ++ .../build-a-world-cup-database.md | 26 ++ .../build-a-kitty-ipsum-translator.md} | 8 +- .../build-a-bike-rental-shop.md | 20 ++ .../build-a-boilerplate.md | 20 ++ .../build-five-programs.md | 20 ++ .../build-an-sql-reference-object.md | 20 ++ .../build-a-castle.md} | 8 +- .../build-a-mario-database.md | 20 ++ .../celestial-bodies-database.md | 18 -- ...sh-by-building-a-kitty-ipsum-translator.md | 18 -- ...-and-sql-by-building-a-bike-rental-shop.md | 17 - .../learn-bash-by-building-a-boilerplate.md | 18 -- ...ash-scripting-by-building-five-programs.md | 18 -- ...git-by-building-an-sql-reference-object.md | 18 -- ...building-a-list-of-inspirational-quotes.md | 18 -- ...-databases-by-building-a-mario-database.md | 18 -- ...l-by-building-a-student-database-part-1.md | 18 -- ...l-by-building-a-student-database-part-2.md | 18 -- .../number-guessing-game.md | 18 -- .../periodic-table-database.md | 18 -- .../salon-appointment-scheduler.md | 18 -- .../world-cup-database.md | 18 -- .../build-a-student-database-part-1.md | 20 ++ .../build-a-student-database-part-2.md | 20 ++ .../build-a-celestial-bodies-database.md | 26 ++ .../build-a-number-guessing-game.md | 26 ++ .../build-a-periodic-table-database.md | 26 ++ .../build-a-salon-appointment-scheduler.md | 26 ++ .../build-a-world-cup-database.md | 26 ++ .../build-a-kitty-ipsum-translator.md} | 8 +- .../build-a-bike-rental-shop.md | 20 ++ .../build-a-boilerplate.md | 20 ++ .../build-five-programs.md | 20 ++ .../build-an-sql-reference-object.md | 20 ++ .../build-a-castle.md} | 8 +- .../build-a-mario-database.md | 20 ++ .../celestial-bodies-database.md | 19 -- ...-and-sql-by-building-a-bike-rental-shop.md | 17 - .../learn-bash-by-building-a-boilerplate.md | 18 -- ...ash-scripting-by-building-five-programs.md | 18 -- ...git-by-building-an-sql-reference-object.md | 18 -- ...building-a-list-of-inspirational-quotes.md | 18 -- ...-databases-by-building-a-mario-database.md | 18 -- ...l-by-building-a-student-database-part-1.md | 18 -- ...l-by-building-a-student-database-part-2.md | 18 -- .../number-guessing-game.md | 18 -- .../periodic-table-database.md | 18 -- .../salon-appointment-scheduler.md | 18 -- .../world-cup-database.md | 18 -- .../build-a-student-database-part-1.md | 20 ++ .../build-a-student-database-part-2.md | 20 ++ .../build-a-celestial-bodies-database.md | 26 ++ .../build-a-number-guessing-game.md | 26 ++ .../build-a-periodic-table-database.md | 26 ++ .../build-a-salon-appointment-scheduler.md | 26 ++ .../build-a-world-cup-database.md | 26 ++ .../build-a-kitty-ipsum-translator.md} | 8 +- .../build-a-bike-rental-shop.md | 20 ++ .../build-a-boilerplate.md | 20 ++ .../build-five-programs.md | 20 ++ .../build-an-sql-reference-object.md | 20 ++ .../build-a-castle.md} | 8 +- .../build-a-mario-database.md | 20 ++ .../celestial-bodies-database.md | 18 -- ...-and-sql-by-building-a-bike-rental-shop.md | 17 - .../learn-bash-by-building-a-boilerplate.md | 18 -- ...ash-scripting-by-building-five-programs.md | 18 -- ...git-by-building-an-sql-reference-object.md | 18 -- ...building-a-list-of-inspirational-quotes.md | 18 -- ...-databases-by-building-a-mario-database.md | 18 -- ...l-by-building-a-student-database-part-1.md | 18 -- ...l-by-building-a-student-database-part-2.md | 18 -- .../number-guessing-game.md | 18 -- .../periodic-table-database.md | 18 -- .../salon-appointment-scheduler.md | 18 -- .../world-cup-database.md | 18 -- .../build-a-student-database-part-1.md | 20 ++ .../build-a-student-database-part-2.md | 20 ++ .../build-a-celestial-bodies-database.md | 26 ++ .../build-a-number-guessing-game.md | 26 ++ .../build-a-periodic-table-database.md | 26 ++ .../build-a-salon-appointment-scheduler.md | 26 ++ .../build-a-world-cup-database.md | 26 ++ .../build-a-kitty-ipsum-translator.md | 20 ++ .../build-a-bike-rental-shop.md | 20 ++ .../build-a-boilerplate.md | 20 ++ .../build-five-programs.md | 20 ++ .../build-an-sql-reference-object.md | 20 ++ .../build-a-castle.md | 20 ++ .../build-a-mario-database.md | 20 ++ .../celestial-bodies-database.md | 18 -- ...-and-sql-by-building-a-bike-rental-shop.md | 17 - .../learn-bash-by-building-a-boilerplate.md | 18 -- ...ash-scripting-by-building-five-programs.md | 18 -- ...git-by-building-an-sql-reference-object.md | 18 -- ...building-a-list-of-inspirational-quotes.md | 18 -- .../learn-nano-by-building-a-castle.md | 18 -- ...-databases-by-building-a-mario-database.md | 18 -- ...l-by-building-a-student-database-part-1.md | 18 -- ...l-by-building-a-student-database-part-2.md | 18 -- .../number-guessing-game.md | 18 -- .../periodic-table-database.md | 18 -- .../salon-appointment-scheduler.md | 18 -- .../world-cup-database.md | 18 -- .../build-a-student-database-part-1.md | 20 ++ .../build-a-student-database-part-2.md | 20 ++ .../build-a-celestial-bodies-database.md | 26 ++ .../build-a-number-guessing-game.md | 26 ++ .../build-a-periodic-table-database.md | 26 ++ .../build-a-salon-appointment-scheduler.md | 26 ++ .../build-a-world-cup-database.md | 26 ++ .../build-a-kitty-ipsum-translator.md | 20 ++ .../build-a-bike-rental-shop.md | 20 ++ .../build-a-boilerplate.md | 20 ++ .../build-five-programs.md | 20 ++ .../build-an-sql-reference-object.md | 20 ++ .../build-a-castle.md | 20 ++ .../build-a-mario-database.md | 20 ++ .../celestial-bodies-database.md | 18 -- ...sh-by-building-a-kitty-ipsum-translator.md | 18 -- ...-and-sql-by-building-a-bike-rental-shop.md | 17 - .../learn-bash-by-building-a-boilerplate.md | 18 -- ...ash-scripting-by-building-five-programs.md | 18 -- ...git-by-building-an-sql-reference-object.md | 18 -- ...building-a-list-of-inspirational-quotes.md | 18 -- .../learn-nano-by-building-a-castle.md | 18 -- ...-databases-by-building-a-mario-database.md | 18 -- ...l-by-building-a-student-database-part-1.md | 18 -- ...l-by-building-a-student-database-part-2.md | 18 -- .../number-guessing-game.md | 18 -- .../periodic-table-database.md | 18 -- .../salon-appointment-scheduler.md | 18 -- .../world-cup-database.md | 18 -- .../build-a-student-database-part-1.md | 20 ++ .../build-a-student-database-part-2.md | 20 ++ .../build-a-celestial-bodies-database.md | 26 ++ .../build-a-number-guessing-game.md | 26 ++ .../build-a-periodic-table-database.md | 26 ++ .../build-a-salon-appointment-scheduler.md | 26 ++ .../build-a-world-cup-database.md | 26 ++ .../build-a-kitty-ipsum-translator.md | 20 ++ .../build-a-bike-rental-shop.md | 20 ++ .../build-a-boilerplate.md | 20 ++ .../build-five-programs.md | 20 ++ .../build-an-sql-reference-object.md | 20 ++ .../build-a-castle.md | 20 ++ .../build-a-mario-database.md | 20 ++ .../celestial-bodies-database.md | 18 -- ...sh-by-building-a-kitty-ipsum-translator.md | 18 -- ...-and-sql-by-building-a-bike-rental-shop.md | 17 - .../learn-bash-by-building-a-boilerplate.md | 18 -- ...ash-scripting-by-building-five-programs.md | 18 -- ...git-by-building-an-sql-reference-object.md | 18 -- ...building-a-list-of-inspirational-quotes.md | 18 -- .../learn-nano-by-building-a-castle.md | 18 -- ...-databases-by-building-a-mario-database.md | 18 -- ...l-by-building-a-student-database-part-1.md | 18 -- ...l-by-building-a-student-database-part-2.md | 18 -- .../number-guessing-game.md | 18 -- .../periodic-table-database.md | 18 -- .../salon-appointment-scheduler.md | 18 -- .../world-cup-database.md | 18 -- .../build-a-student-database-part-1.md | 20 ++ .../build-a-student-database-part-2.md | 20 ++ .../build-a-celestial-bodies-database.md | 26 ++ .../build-a-number-guessing-game.md | 26 ++ .../build-a-periodic-table-database.md | 26 ++ .../build-a-salon-appointment-scheduler.md | 26 ++ .../build-a-world-cup-database.md | 26 ++ .../build-a-kitty-ipsum-translator.md | 20 ++ .../build-a-bike-rental-shop.md | 20 ++ .../build-a-boilerplate.md | 20 ++ .../build-five-programs.md | 20 ++ .../build-an-sql-reference-object.md | 20 ++ .../build-a-castle.md | 20 ++ .../build-a-mario-database.md | 20 ++ .../celestial-bodies-database.md | 18 -- ...sh-by-building-a-kitty-ipsum-translator.md | 18 -- ...-and-sql-by-building-a-bike-rental-shop.md | 17 - .../learn-bash-by-building-a-boilerplate.md | 18 -- ...ash-scripting-by-building-five-programs.md | 18 -- ...git-by-building-an-sql-reference-object.md | 18 -- ...building-a-list-of-inspirational-quotes.md | 18 -- .../learn-nano-by-building-a-castle.md | 18 -- ...-databases-by-building-a-mario-database.md | 18 -- ...l-by-building-a-student-database-part-1.md | 18 -- ...l-by-building-a-student-database-part-2.md | 18 -- .../number-guessing-game.md | 18 -- .../periodic-table-database.md | 18 -- .../salon-appointment-scheduler.md | 18 -- .../world-cup-database.md | 18 -- .../build-a-student-database-part-1.md | 20 ++ .../build-a-student-database-part-2.md | 20 ++ curriculum/schema/challengeSchema.js | 6 +- 267 files changed, 3832 insertions(+), 2229 deletions(-) create mode 100644 client/src/templates/Challenges/codeally/codeally.css create mode 100644 curriculum/challenges/_meta/build-a-celestial-bodies-database-project/meta.json create mode 100644 curriculum/challenges/_meta/build-a-number-guessing-game-project/meta.json create mode 100644 curriculum/challenges/_meta/build-a-periodic-table-database-project/meta.json create mode 100644 curriculum/challenges/_meta/build-a-salon-appointment-scheduler-project/meta.json create mode 100644 curriculum/challenges/_meta/build-a-world-cup-database-project/meta.json create mode 100644 curriculum/challenges/_meta/learn-advanced-bash-by-building-a-kitty-ipsum-translator/meta.json create mode 100644 curriculum/challenges/_meta/learn-bash-and-sql-by-building-a-bike-rental-shop/meta.json create mode 100644 curriculum/challenges/_meta/learn-bash-by-building-a-boilerplate/meta.json create mode 100644 curriculum/challenges/_meta/learn-bash-scripting-by-building-five-programs/meta.json create mode 100644 curriculum/challenges/_meta/learn-git-by-building-an-sql-reference-object/meta.json create mode 100644 curriculum/challenges/_meta/learn-nano-by-building-a-castle/meta.json create mode 100644 curriculum/challenges/_meta/learn-relational-databases-by-building-a-mario-database/meta.json delete mode 100644 curriculum/challenges/_meta/learn-relational-databases/meta.json create mode 100644 curriculum/challenges/_meta/learn-sql-by-building-a-student-database-part-1/meta.json create mode 100644 curriculum/challenges/_meta/learn-sql-by-building-a-student-database-part-2/meta.json create mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database.md create mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/build-a-number-guessing-game-project/build-a-number-guessing-game.md create mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/build-a-periodic-table-database-project/build-a-periodic-table-database.md create mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler.md create mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/build-a-world-cup-database-project/build-a-world-cup-database.md rename curriculum/challenges/{italian/13-relational-databases/learn-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator.md => chinese-traditional/13-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator/build-a-kitty-ipsum-translator.md} (50%) create mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop/build-a-bike-rental-shop.md create mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-bash-by-building-a-boilerplate/build-a-boilerplate.md create mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-bash-scripting-by-building-five-programs/build-five-programs.md create mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-git-by-building-an-sql-reference-object/build-an-sql-reference-object.md rename curriculum/challenges/chinese-traditional/13-relational-databases/{learn-relational-databases/learn-nano-by-building-a-castle.md => learn-nano-by-building-a-castle/build-a-castle.md} (51%) create mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases-by-building-a-mario-database/build-a-mario-database.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/celestial-bodies-database.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/learn-bash-by-building-a-boilerplate.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/learn-bash-scripting-by-building-five-programs.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/learn-git-by-building-an-sql-reference-object.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/learn-github-by-building-a-list-of-inspirational-quotes.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/learn-relational-databases-by-building-a-mario-database.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-1.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-2.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/number-guessing-game.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/periodic-table-database.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/salon-appointment-scheduler.md delete mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-relational-databases/world-cup-database.md create mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-sql-by-building-a-student-database-part-1/build-a-student-database-part-1.md create mode 100644 curriculum/challenges/chinese-traditional/13-relational-databases/learn-sql-by-building-a-student-database-part-2/build-a-student-database-part-2.md create mode 100644 curriculum/challenges/chinese/13-relational-databases/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database.md create mode 100644 curriculum/challenges/chinese/13-relational-databases/build-a-number-guessing-game-project/build-a-number-guessing-game.md create mode 100644 curriculum/challenges/chinese/13-relational-databases/build-a-periodic-table-database-project/build-a-periodic-table-database.md create mode 100644 curriculum/challenges/chinese/13-relational-databases/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler.md create mode 100644 curriculum/challenges/chinese/13-relational-databases/build-a-world-cup-database-project/build-a-world-cup-database.md rename curriculum/challenges/{espanol/13-relational-databases/learn-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator.md => chinese/13-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator/build-a-kitty-ipsum-translator.md} (50%) create mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop/build-a-bike-rental-shop.md create mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-bash-by-building-a-boilerplate/build-a-boilerplate.md create mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-bash-scripting-by-building-five-programs/build-five-programs.md create mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-git-by-building-an-sql-reference-object/build-an-sql-reference-object.md rename curriculum/challenges/chinese/13-relational-databases/{learn-relational-databases/learn-nano-by-building-a-castle.md => learn-nano-by-building-a-castle/build-a-castle.md} (51%) create mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases-by-building-a-mario-database/build-a-mario-database.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/celestial-bodies-database.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/learn-bash-by-building-a-boilerplate.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/learn-bash-scripting-by-building-five-programs.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/learn-git-by-building-an-sql-reference-object.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/learn-github-by-building-a-list-of-inspirational-quotes.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/learn-relational-databases-by-building-a-mario-database.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-1.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-2.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/number-guessing-game.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/periodic-table-database.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/salon-appointment-scheduler.md delete mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-relational-databases/world-cup-database.md create mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-sql-by-building-a-student-database-part-1/build-a-student-database-part-1.md create mode 100644 curriculum/challenges/chinese/13-relational-databases/learn-sql-by-building-a-student-database-part-2/build-a-student-database-part-2.md create mode 100644 curriculum/challenges/english/13-relational-databases/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database.md create mode 100644 curriculum/challenges/english/13-relational-databases/build-a-number-guessing-game-project/build-a-number-guessing-game.md create mode 100644 curriculum/challenges/english/13-relational-databases/build-a-periodic-table-database-project/build-a-periodic-table-database.md create mode 100644 curriculum/challenges/english/13-relational-databases/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler.md create mode 100644 curriculum/challenges/english/13-relational-databases/build-a-world-cup-database-project/build-a-world-cup-database.md rename curriculum/challenges/{chinese-traditional/13-relational-databases/learn-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator.md => english/13-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator/build-a-kitty-ipsum-translator.md} (50%) create mode 100644 curriculum/challenges/english/13-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop/build-a-bike-rental-shop.md create mode 100644 curriculum/challenges/english/13-relational-databases/learn-bash-by-building-a-boilerplate/build-a-boilerplate.md create mode 100644 curriculum/challenges/english/13-relational-databases/learn-bash-scripting-by-building-five-programs/build-five-programs.md create mode 100644 curriculum/challenges/english/13-relational-databases/learn-git-by-building-an-sql-reference-object/build-an-sql-reference-object.md rename curriculum/challenges/{espanol/13-relational-databases/learn-relational-databases/learn-nano-by-building-a-castle.md => english/13-relational-databases/learn-nano-by-building-a-castle/build-a-castle.md} (51%) create mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases-by-building-a-mario-database/build-a-mario-database.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/celestial-bodies-database.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/learn-bash-by-building-a-boilerplate.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/learn-bash-scripting-by-building-five-programs.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/learn-git-by-building-an-sql-reference-object.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/learn-github-by-building-a-list-of-inspirational-quotes.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/learn-relational-databases-by-building-a-mario-database.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-1.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-2.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/number-guessing-game.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/periodic-table-database.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/salon-appointment-scheduler.md delete mode 100644 curriculum/challenges/english/13-relational-databases/learn-relational-databases/world-cup-database.md create mode 100644 curriculum/challenges/english/13-relational-databases/learn-sql-by-building-a-student-database-part-1/build-a-student-database-part-1.md create mode 100644 curriculum/challenges/english/13-relational-databases/learn-sql-by-building-a-student-database-part-2/build-a-student-database-part-2.md create mode 100644 curriculum/challenges/espanol/13-relational-databases/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database.md create mode 100644 curriculum/challenges/espanol/13-relational-databases/build-a-number-guessing-game-project/build-a-number-guessing-game.md create mode 100644 curriculum/challenges/espanol/13-relational-databases/build-a-periodic-table-database-project/build-a-periodic-table-database.md create mode 100644 curriculum/challenges/espanol/13-relational-databases/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler.md create mode 100644 curriculum/challenges/espanol/13-relational-databases/build-a-world-cup-database-project/build-a-world-cup-database.md rename curriculum/challenges/{english/13-relational-databases/learn-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator.md => espanol/13-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator/build-a-kitty-ipsum-translator.md} (50%) create mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop/build-a-bike-rental-shop.md create mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-bash-by-building-a-boilerplate/build-a-boilerplate.md create mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-bash-scripting-by-building-five-programs/build-five-programs.md create mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-git-by-building-an-sql-reference-object/build-an-sql-reference-object.md rename curriculum/challenges/{english/13-relational-databases/learn-relational-databases/learn-nano-by-building-a-castle.md => espanol/13-relational-databases/learn-nano-by-building-a-castle/build-a-castle.md} (51%) create mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases-by-building-a-mario-database/build-a-mario-database.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/celestial-bodies-database.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/learn-bash-by-building-a-boilerplate.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/learn-bash-scripting-by-building-five-programs.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/learn-git-by-building-an-sql-reference-object.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/learn-github-by-building-a-list-of-inspirational-quotes.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/learn-relational-databases-by-building-a-mario-database.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-1.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-2.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/number-guessing-game.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/periodic-table-database.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/salon-appointment-scheduler.md delete mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-relational-databases/world-cup-database.md create mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-sql-by-building-a-student-database-part-1/build-a-student-database-part-1.md create mode 100644 curriculum/challenges/espanol/13-relational-databases/learn-sql-by-building-a-student-database-part-2/build-a-student-database-part-2.md create mode 100644 curriculum/challenges/italian/13-relational-databases/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database.md create mode 100644 curriculum/challenges/italian/13-relational-databases/build-a-number-guessing-game-project/build-a-number-guessing-game.md create mode 100644 curriculum/challenges/italian/13-relational-databases/build-a-periodic-table-database-project/build-a-periodic-table-database.md create mode 100644 curriculum/challenges/italian/13-relational-databases/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler.md create mode 100644 curriculum/challenges/italian/13-relational-databases/build-a-world-cup-database-project/build-a-world-cup-database.md create mode 100644 curriculum/challenges/italian/13-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator/build-a-kitty-ipsum-translator.md create mode 100644 curriculum/challenges/italian/13-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop/build-a-bike-rental-shop.md create mode 100644 curriculum/challenges/italian/13-relational-databases/learn-bash-by-building-a-boilerplate/build-a-boilerplate.md create mode 100644 curriculum/challenges/italian/13-relational-databases/learn-bash-scripting-by-building-five-programs/build-five-programs.md create mode 100644 curriculum/challenges/italian/13-relational-databases/learn-git-by-building-an-sql-reference-object/build-an-sql-reference-object.md create mode 100644 curriculum/challenges/italian/13-relational-databases/learn-nano-by-building-a-castle/build-a-castle.md create mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases-by-building-a-mario-database/build-a-mario-database.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/celestial-bodies-database.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/learn-bash-by-building-a-boilerplate.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/learn-bash-scripting-by-building-five-programs.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/learn-git-by-building-an-sql-reference-object.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/learn-github-by-building-a-list-of-inspirational-quotes.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/learn-nano-by-building-a-castle.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/learn-relational-databases-by-building-a-mario-database.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-1.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-2.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/number-guessing-game.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/periodic-table-database.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/salon-appointment-scheduler.md delete mode 100644 curriculum/challenges/italian/13-relational-databases/learn-relational-databases/world-cup-database.md create mode 100644 curriculum/challenges/italian/13-relational-databases/learn-sql-by-building-a-student-database-part-1/build-a-student-database-part-1.md create mode 100644 curriculum/challenges/italian/13-relational-databases/learn-sql-by-building-a-student-database-part-2/build-a-student-database-part-2.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/build-a-number-guessing-game-project/build-a-number-guessing-game.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/build-a-periodic-table-database-project/build-a-periodic-table-database.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/build-a-world-cup-database-project/build-a-world-cup-database.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator/build-a-kitty-ipsum-translator.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop/build-a-bike-rental-shop.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-bash-by-building-a-boilerplate/build-a-boilerplate.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-bash-scripting-by-building-five-programs/build-five-programs.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-git-by-building-an-sql-reference-object/build-an-sql-reference-object.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-nano-by-building-a-castle/build-a-castle.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases-by-building-a-mario-database/build-a-mario-database.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/celestial-bodies-database.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/learn-bash-by-building-a-boilerplate.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/learn-bash-scripting-by-building-five-programs.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/learn-git-by-building-an-sql-reference-object.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/learn-github-by-building-a-list-of-inspirational-quotes.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/learn-nano-by-building-a-castle.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/learn-relational-databases-by-building-a-mario-database.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-1.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-2.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/number-guessing-game.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/periodic-table-database.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/salon-appointment-scheduler.md delete mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-relational-databases/world-cup-database.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-sql-by-building-a-student-database-part-1/build-a-student-database-part-1.md create mode 100644 curriculum/challenges/japanese/13-relational-databases/learn-sql-by-building-a-student-database-part-2/build-a-student-database-part-2.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/build-a-number-guessing-game-project/build-a-number-guessing-game.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/build-a-periodic-table-database-project/build-a-periodic-table-database.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/build-a-world-cup-database-project/build-a-world-cup-database.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator/build-a-kitty-ipsum-translator.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop/build-a-bike-rental-shop.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-bash-by-building-a-boilerplate/build-a-boilerplate.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-bash-scripting-by-building-five-programs/build-five-programs.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-git-by-building-an-sql-reference-object/build-an-sql-reference-object.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-nano-by-building-a-castle/build-a-castle.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases-by-building-a-mario-database/build-a-mario-database.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/celestial-bodies-database.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/learn-bash-by-building-a-boilerplate.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/learn-bash-scripting-by-building-five-programs.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/learn-git-by-building-an-sql-reference-object.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/learn-github-by-building-a-list-of-inspirational-quotes.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/learn-nano-by-building-a-castle.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/learn-relational-databases-by-building-a-mario-database.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-1.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-2.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/number-guessing-game.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/periodic-table-database.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/salon-appointment-scheduler.md delete mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-relational-databases/world-cup-database.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-sql-by-building-a-student-database-part-1/build-a-student-database-part-1.md create mode 100644 curriculum/challenges/portuguese/13-relational-databases/learn-sql-by-building-a-student-database-part-2/build-a-student-database-part-2.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/build-a-celestial-bodies-database-project/build-a-celestial-bodies-database.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/build-a-number-guessing-game-project/build-a-number-guessing-game.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/build-a-periodic-table-database-project/build-a-periodic-table-database.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/build-a-salon-appointment-scheduler-project/build-a-salon-appointment-scheduler.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/build-a-world-cup-database-project/build-a-world-cup-database.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator/build-a-kitty-ipsum-translator.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop/build-a-bike-rental-shop.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-bash-by-building-a-boilerplate/build-a-boilerplate.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-bash-scripting-by-building-five-programs/build-five-programs.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-git-by-building-an-sql-reference-object/build-an-sql-reference-object.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-nano-by-building-a-castle/build-a-castle.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases-by-building-a-mario-database/build-a-mario-database.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/celestial-bodies-database.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/learn-advanced-bash-by-building-a-kitty-ipsum-translator.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/learn-bash-and-sql-by-building-a-bike-rental-shop.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/learn-bash-by-building-a-boilerplate.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/learn-bash-scripting-by-building-five-programs.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/learn-git-by-building-an-sql-reference-object.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/learn-github-by-building-a-list-of-inspirational-quotes.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/learn-nano-by-building-a-castle.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/learn-relational-databases-by-building-a-mario-database.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-1.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/learn-sql-by-building-a-student-database-part-2.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/number-guessing-game.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/periodic-table-database.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/salon-appointment-scheduler.md delete mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-relational-databases/world-cup-database.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-sql-by-building-a-student-database-part-1/build-a-student-database-part-1.md create mode 100644 curriculum/challenges/ukrainian/13-relational-databases/learn-sql-by-building-a-student-database-part-2/build-a-student-database-part-2.md diff --git a/api-server/src/common/models/user.js b/api-server/src/common/models/user.js index 4afcba1298..c8fe2571f0 100644 --- a/api-server/src/common/models/user.js +++ b/api-server/src/common/models/user.js @@ -995,6 +995,25 @@ export default function initializeUser(User) { }); }; + User.prototype.getPartiallyCompletedChallenges$ = + function getPartiallyCompletedChallenges$() { + if ( + Array.isArray(this.partiallyCompletedChallenges) && + this.partiallyCompletedChallenges.length + ) { + return Observable.of(this.partiallyCompletedChallenges); + } + const id = this.getId(); + const filter = { + where: { id }, + fields: { partiallyCompletedChallenges: true } + }; + return this.constructor.findOne$(filter).map(user => { + this.partiallyCompletedChallenges = user.partiallyCompletedChallenges; + return user.partiallyCompletedChallenges; + }); + }; + User.getMessages = messages => Promise.resolve(messages); User.remoteMethod('getMessages', { diff --git a/api-server/src/common/models/user.json b/api-server/src/common/models/user.json index 9630a2138e..c2ad7540d5 100644 --- a/api-server/src/common/models/user.json +++ b/api-server/src/common/models/user.json @@ -236,6 +236,15 @@ ], "default": [] }, + "partiallyCompletedChallenges": { + "type": [ + { + "completedDate": "number", + "id": "string" + } + ], + "default": [] + }, "portfolio": { "type": "array", "default": [] diff --git a/api-server/src/common/utils/index.js b/api-server/src/common/utils/index.js index 3f86552081..b756789c7e 100644 --- a/api-server/src/common/utils/index.js +++ b/api-server/src/common/utils/index.js @@ -20,3 +20,6 @@ export const fixCompletedChallengeItem = obj => 'files', 'isManuallyApproved' ]); + +export const fixPartiallyCompletedChallengeItem = obj => + pick(obj, ['id', 'completedDate']); diff --git a/api-server/src/server/boot/challenge.js b/api-server/src/server/boot/challenge.js index bab717e633..2b14a79f58 100644 --- a/api-server/src/server/boot/challenge.js +++ b/api-server/src/server/boot/challenge.js @@ -13,7 +13,10 @@ import isNumeric from 'validator/lib/isNumeric'; import isURL from 'validator/lib/isURL'; import { environment, deploymentEnv } from '../../../../config/env.json'; -import { fixCompletedChallengeItem } from '../../common/utils'; +import { + fixCompletedChallengeItem, + fixPartiallyCompletedChallengeItem +} from '../../common/utils'; import { getChallenges } from '../utils/get-curriculum'; import { ifNoUserSend } from '../utils/middleware'; import { @@ -134,6 +137,10 @@ export function buildUserUpdate( ) }; + updateData.$pull = { + partiallyCompletedChallenges: { id: challengeId } + }; + if ( timezone && timezone !== 'UTC' && @@ -283,6 +290,27 @@ function projectCompleted(req, res, next) { }); } + // CodeRoad cert project + if (completedChallenge.challengeType === 13) { + const { partiallyCompletedChallenges = [], completedChallenges = [] } = + user; + + const isPartiallyCompleted = partiallyCompletedChallenges.some( + challenge => challenge.id === completedChallenge.id + ); + + const isCompleted = completedChallenges.some( + challenge => challenge.id === completedChallenge.id + ); + + if (!isPartiallyCompleted && !isCompleted) { + return res.status(403).json({ + type: 'error', + message: 'You have to complete the project before you can submit a URL.' + }); + } + } + return user .getCompletedChallenges$() .flatMap(() => { @@ -345,6 +373,10 @@ function backendChallengeCompleted(req, res, next) { .subscribe(() => {}, next); } +const codeRoadChallenges = getChallenges().filter( + ({ challengeType }) => challengeType === 12 || challengeType === 13 +); + function createCoderoadChallengeCompleted(app) { /* Example request coming from CodeRoad: * req.body: { tutorialId: 'freeCodeCamp/learn-bash-by-building-a-boilerplate:v1.0.0' } @@ -374,18 +406,14 @@ function createCoderoadChallengeCompleted(app) { return res.send('Tutorial not hosted on freeCodeCamp GitHub account'); } - const codeRoadChallenges = getChallenges().filter( - challenge => challenge.challengeType === 12 - ); - // validate tutorial name is in codeRoadChallenges object - const tutorialInfo = codeRoadChallenges.find(tutorial => - tutorial.url?.includes(tutorialRepoName) + const challenge = codeRoadChallenges.find(challenge => + challenge.url?.includes(tutorialRepoName) ); - if (!tutorialInfo) return res.send('Tutorial name is not valid'); + if (!challenge) return res.send('Tutorial name is not valid'); - const tutorialMongoId = tutorialInfo?.id; + const { id: challengeId, challengeType } = challenge; try { // check if webhook token is in database @@ -406,12 +434,43 @@ function createCoderoadChallengeCompleted(app) { // submit challenge const completedDate = Date.now(); + const { completedChallenges = [], partiallyCompletedChallenges = [] } = + user; - const userUpdateInfo = buildUserUpdate(user, tutorialMongoId, { - id: tutorialMongoId, - completedDate - }); + let userUpdateInfo = {}; + const isCompleted = completedChallenges.some( + challenge => challenge.id === challengeId + ); + + // if CodeRoad cert project and not in completedChallenges, + // add to partiallyCompletedChallenges + if (challengeType === 13 && !isCompleted) { + const finalChallenge = { + id: challengeId, + completedDate + }; + + userUpdateInfo.updateData = {}; + userUpdateInfo.updateData.$set = { + partiallyCompletedChallenges: uniqBy( + [ + finalChallenge, + ...partiallyCompletedChallenges.map( + fixPartiallyCompletedChallengeItem + ) + ], + 'id' + ) + }; + + // else, add to or update completedChallenges + } else { + userUpdateInfo = buildUserUpdate(user, challengeId, { + id: challengeId, + completedDate + }); + } const updatedUser = await user.updateAttributes( userUpdateInfo?.updateData ); diff --git a/api-server/src/server/boot/user.js b/api-server/src/server/boot/user.js index 14ac343f7d..e8b5af2bef 100644 --- a/api-server/src/server/boot/user.js +++ b/api-server/src/server/boot/user.js @@ -4,7 +4,10 @@ import { body } from 'express-validator'; import { pick } from 'lodash'; import { Observable } from 'rx'; -import { fixCompletedChallengeItem } from '../../common/utils'; +import { + fixCompletedChallengeItem, + fixPartiallyCompletedChallengeItem +} from '../../common/utils'; import { removeCookies } from '../utils/getSetAccessToken'; import { ifNoUser401, ifNoUserRedirectHome } from '../utils/middleware'; import { @@ -99,11 +102,18 @@ function createReadSessionUser(app) { queryUser && Observable.forkJoin( queryUser.getCompletedChallenges$(), + queryUser.getPartiallyCompletedChallenges$(), queryUser.getPoints$(), Donation.getCurrentActiveDonationCount$(), - (completedChallenges, progressTimestamps, activeDonations) => ({ + ( + completedChallenges, + partiallyCompletedChallenges, + progressTimestamps, + activeDonations + ) => ({ activeDonations, completedChallenges, + partiallyCompletedChallenges, progress: getProgress(progressTimestamps, queryUser.timezone) }) ); @@ -111,16 +121,26 @@ function createReadSessionUser(app) { () => !queryUser, Observable.of({ user: {}, result: '' }), Observable.defer(() => source) - .map(({ activeDonations, completedChallenges, progress }) => ({ - user: { - ...queryUser.toJSON(), - ...progress, - completedChallenges: completedChallenges.map( - fixCompletedChallengeItem - ) - }, - sessionMeta: { activeDonations } - })) + .map( + ({ + activeDonations, + completedChallenges, + partiallyCompletedChallenges, + progress + }) => ({ + user: { + ...queryUser.toJSON(), + ...progress, + completedChallenges: completedChallenges.map( + fixCompletedChallengeItem + ), + partiallyCompletedChallenges: partiallyCompletedChallenges.map( + fixPartiallyCompletedChallengeItem + ) + }, + sessionMeta: { activeDonations } + }) + ) .map(({ user, sessionMeta }) => ({ user: { [user.username]: { diff --git a/api-server/src/server/utils/publicUserProps.js b/api-server/src/server/utils/publicUserProps.js index 58cf7c4784..95fdeea73d 100644 --- a/api-server/src/server/utils/publicUserProps.js +++ b/api-server/src/server/utils/publicUserProps.js @@ -32,6 +32,7 @@ export const publicUserProps = [ 'linkedin', 'location', 'name', + 'partiallyCompletedChallenges', 'points', 'portfolio', 'profileUI', diff --git a/client/i18n/locales/chinese-traditional/intro.json b/client/i18n/locales/chinese-traditional/intro.json index e4f37128ce..df35122e1e 100644 --- a/client/i18n/locales/chinese-traditional/intro.json +++ b/client/i18n/locales/chinese-traditional/intro.json @@ -428,15 +428,107 @@ "relational-databases": { "title": "關係型數據庫", "intro": [ - "對於這些課程,你將使用真正的開發者工具和軟件,包括 VS Code、PostgreSQL 和 Linux / Unix 命令行,來完成交互式教程和構建項目。" + "For these courses, you will use real developer tools and software including VS Code, PostgreSQL, and the Linux / Unix command line to complete interactive tutorials and build projects.", + "These courses start off with basic Bash commands. Using the terminal, you will learn everything from navigating and manipulating a file system, scripting in Bash, all the way to advanced usage.", + "Next, you will learn how to create and work with relational databases using PostgreSQL, a database management system, and SQL, the language of these databases.", + "Finally, you will learn Git, the version control system, an essential tool of every developer." ], "blocks": { - "learn-relational-databases": { - "title": "學習關係型數據庫", + "build-a-celestial-bodies-database-project": { + "title": "Celestial Bodies Database", "intro": [ - "這些課程從基本的 Bash 命令開始。使用終端,你將學習從導航和操作一個文件系統、Bash 腳本到高級應用的所有內容。", - "接下來,你將學習如何使用數據庫管理系統 PostgreSQL 和數據庫語言 SQL 來創建和使用關係數據庫。", - "最後,你將學習版本控制系統 Git 和代碼庫託管服務 GitHub——每個開發者的兩個基本工具。" + "This is one of the required projects to earn your certification.", + "For this project, you will build a database of celestial bodies using PostgreSQL." + ] + }, + "build-a-number-guessing-game-project": { + "title": "Number Guessing Game", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will use Bash scripting, PostgreSQL, and Git to create a number guessing game that runs in the terminal and saves user information." + ] + }, + "build-a-periodic-table-database-project": { + "title": "Periodic Table Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create Bash a script to get information about chemical elements from a periodic table database." + ] + }, + "build-a-salon-appointment-scheduler-project": { + "title": "Salon Appointment Scheduler", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create an interactive Bash program that uses PostgreSQL to track the customers and appointments for your salon." + ] + }, + "build-a-world-cup-database-project": { + "title": "World Cup Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create a Bash script that enters information from World Cup games into PostgreSQL, then query the database for useful statistics." + ] + }, + "learn-advanced-bash-by-building-a-kitty-ipsum-translator": { + "title": "Learn Advanced Bash by Building a Kitty Ipsum Translator", + "intro": [ + "There's more to Bash commands than you might think.", + "In this 140 lesson course, you will learn some more complex commands, and the details of how commands work." + ] + }, + "learn-bash-and-sql-by-building-a-bike-rental-shop": { + "title": "Learn Bash and SQL by Building a Bike Rental Shop", + "intro": [ + "In this 210 lesson course, you will build an interactive Bash program that stores rental information for your bike rental shop using PostgreSQL." + ] + }, + "learn-bash-by-building-a-boilerplate": { + "title": "Learn Bash by Building a Boilerplate", + "intro": [ + "The terminal allows you to send text commands to your computer that can manipulate the file system, run programs, automate tasks, and much more.", + "In this 170 lesson course, you will learn basic commands by creating a website boilerplate using only the command line." + ] + }, + "learn-bash-scripting-by-building-five-programs": { + "title": "Learn Bash Scripting by Building Five Programs", + "intro": [ + "Bash scripts combine terminal commands and logic into programs that can execute or automate tasks, and much more.", + "In this 220 lesson course, you will learn more terminal commands and how to use them within Bash scripts by creating five small programs." + ] + }, + "learn-git-by-building-an-sql-reference-object": { + "title": "Learn Git by Building and SQL Reference Object", + "intro": [ + "Git is a version control system that keep track of all the changes you make to your codebase", + "In this 240 lesson course, you will learn how Git keeps track of your code by creating an object containing commonly used SQL commands." + ] + }, + "learn-nano-by-building-a-castle": { + "title": "Learn Nano by Building a Castle", + "intro": [ + "Nano is a program that allow you to edit files right in the terminal.", + "In this 40 lesson course, you will learn how to edit files in the terminal with Nano while building a castle." + ] + }, + "learn-relational-databases-by-building-a-mario-database": { + "title": "Learn Relational Databases by Building a Mario Database", + "intro": [ + "Relational Databases organize data into tables that are linked together through relationships.", + "In this 165 lesson course, you will learn the basics of relational databases by creating a PostgreSQL database filled with video game characters." + ] + }, + "learn-sql-by-building-a-student-database-part-1": { + "title": "Learn SQL by Building a Student Database: Part 1", + "intro": [ + "SQL, or Structured Query Language, is the language for communicating with Relational Databases.", + "In this 140 lesson course, you will create a Bash script that uses SQL to enter information about your computer science students into PostgreSQL." + ] + }, + "learn-sql-by-building-a-student-database-part-2": { + "title": "Learn SQL by Building a Student Database: Part 2", + "intro": [ + "SQL Join commands are used to combine information from multiple tables in a Relational Database", + "In this 140 lesson course, you will complete your student database while diving deeper into SQL commands." ] } } diff --git a/client/i18n/locales/chinese/intro.json b/client/i18n/locales/chinese/intro.json index 69ed0d866a..68b5945969 100644 --- a/client/i18n/locales/chinese/intro.json +++ b/client/i18n/locales/chinese/intro.json @@ -428,15 +428,107 @@ "relational-databases": { "title": "关系型数据库", "intro": [ - "对于这些课程,你将使用真正的开发者工具和软件,包括 VS Code、PostgreSQL 和 Linux / Unix 命令行,来完成交互式教程和构建项目。" + "For these courses, you will use real developer tools and software including VS Code, PostgreSQL, and the Linux / Unix command line to complete interactive tutorials and build projects.", + "These courses start off with basic Bash commands. Using the terminal, you will learn everything from navigating and manipulating a file system, scripting in Bash, all the way to advanced usage.", + "Next, you will learn how to create and work with relational databases using PostgreSQL, a database management system, and SQL, the language of these databases.", + "Finally, you will learn Git, the version control system, an essential tool of every developer." ], "blocks": { - "learn-relational-databases": { - "title": "学习关系型数据库", + "build-a-celestial-bodies-database-project": { + "title": "Celestial Bodies Database", "intro": [ - "这些课程从基本的 Bash 命令开始。使用终端,你将学习从导航和操作一个文件系统、Bash 脚本到高级应用的所有内容。", - "接下来,你将学习如何使用数据库管理系统 PostgreSQL 和数据库语言 SQL 来创建和使用关系数据库。", - "最后,你将学习版本控制系统 Git 和代码库托管服务 GitHub——每个开发者的两个基本工具。" + "This is one of the required projects to earn your certification.", + "For this project, you will build a database of celestial bodies using PostgreSQL." + ] + }, + "build-a-number-guessing-game-project": { + "title": "Number Guessing Game", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will use Bash scripting, PostgreSQL, and Git to create a number guessing game that runs in the terminal and saves user information." + ] + }, + "build-a-periodic-table-database-project": { + "title": "Periodic Table Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create Bash a script to get information about chemical elements from a periodic table database." + ] + }, + "build-a-salon-appointment-scheduler-project": { + "title": "Salon Appointment Scheduler", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create an interactive Bash program that uses PostgreSQL to track the customers and appointments for your salon." + ] + }, + "build-a-world-cup-database-project": { + "title": "World Cup Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create a Bash script that enters information from World Cup games into PostgreSQL, then query the database for useful statistics." + ] + }, + "learn-advanced-bash-by-building-a-kitty-ipsum-translator": { + "title": "Learn Advanced Bash by Building a Kitty Ipsum Translator", + "intro": [ + "There's more to Bash commands than you might think.", + "In this 140 lesson course, you will learn some more complex commands, and the details of how commands work." + ] + }, + "learn-bash-and-sql-by-building-a-bike-rental-shop": { + "title": "Learn Bash and SQL by Building a Bike Rental Shop", + "intro": [ + "In this 210 lesson course, you will build an interactive Bash program that stores rental information for your bike rental shop using PostgreSQL." + ] + }, + "learn-bash-by-building-a-boilerplate": { + "title": "Learn Bash by Building a Boilerplate", + "intro": [ + "The terminal allows you to send text commands to your computer that can manipulate the file system, run programs, automate tasks, and much more.", + "In this 170 lesson course, you will learn basic commands by creating a website boilerplate using only the command line." + ] + }, + "learn-bash-scripting-by-building-five-programs": { + "title": "Learn Bash Scripting by Building Five Programs", + "intro": [ + "Bash scripts combine terminal commands and logic into programs that can execute or automate tasks, and much more.", + "In this 220 lesson course, you will learn more terminal commands and how to use them within Bash scripts by creating five small programs." + ] + }, + "learn-git-by-building-an-sql-reference-object": { + "title": "Learn Git by Building and SQL Reference Object", + "intro": [ + "Git is a version control system that keep track of all the changes you make to your codebase", + "In this 240 lesson course, you will learn how Git keeps track of your code by creating an object containing commonly used SQL commands." + ] + }, + "learn-nano-by-building-a-castle": { + "title": "Learn Nano by Building a Castle", + "intro": [ + "Nano is a program that allow you to edit files right in the terminal.", + "In this 40 lesson course, you will learn how to edit files in the terminal with Nano while building a castle." + ] + }, + "learn-relational-databases-by-building-a-mario-database": { + "title": "Learn Relational Databases by Building a Mario Database", + "intro": [ + "Relational Databases organize data into tables that are linked together through relationships.", + "In this 165 lesson course, you will learn the basics of relational databases by creating a PostgreSQL database filled with video game characters." + ] + }, + "learn-sql-by-building-a-student-database-part-1": { + "title": "Learn SQL by Building a Student Database: Part 1", + "intro": [ + "SQL, or Structured Query Language, is the language for communicating with Relational Databases.", + "In this 140 lesson course, you will create a Bash script that uses SQL to enter information about your computer science students into PostgreSQL." + ] + }, + "learn-sql-by-building-a-student-database-part-2": { + "title": "Learn SQL by Building a Student Database: Part 2", + "intro": [ + "SQL Join commands are used to combine information from multiple tables in a Relational Database", + "In this 140 lesson course, you will complete your student database while diving deeper into SQL commands." ] } } diff --git a/client/i18n/locales/english/intro.json b/client/i18n/locales/english/intro.json index bf2b0cf8c5..69e84d1b7f 100644 --- a/client/i18n/locales/english/intro.json +++ b/client/i18n/locales/english/intro.json @@ -413,15 +413,107 @@ "relational-databases": { "title": "Relational Databases", "intro": [ - "For these courses, you will use real developer tools and software including VS Code, PostgreSQL, and the Linux / Unix command line to complete interactive tutorials and build projects." + "For these courses, you will use real developer tools and software including VS Code, PostgreSQL, and the Linux / Unix command line to complete interactive tutorials and build projects.", + "These courses start off with basic Bash commands. Using the terminal, you will learn everything from navigating and manipulating a file system, scripting in Bash, all the way to advanced usage.", + "Next, you will learn how to create and work with relational databases using PostgreSQL, a database management system, and SQL, the language of these databases.", + "Finally, you will learn Git, the version control system, an essential tool of every developer." ], "blocks": { - "learn-relational-databases": { - "title": "Learn Relational Databases", + "build-a-celestial-bodies-database-project": { + "title": "Celestial Bodies Database", "intro": [ - "These courses start off with basic Bash commands. Using the terminal, you will learn everything from navigating and manipulating a file system, scripting in Bash, all the way to advanced usage.", - "Next, you will learn how to create and work with relational databases using PostgreSQL, a database management system, and SQL, the language of these databases.", - "Finally, you will learn Git, the version control system, and GitHub, a code repository hosting service - two essential tools of every developer." + "This is one of the required projects to earn your certification.", + "For this project, you will build a database of celestial bodies using PostgreSQL." + ] + }, + "build-a-number-guessing-game-project": { + "title": "Number Guessing Game", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will use Bash scripting, PostgreSQL, and Git to create a number guessing game that runs in the terminal and saves user information." + ] + }, + "build-a-periodic-table-database-project": { + "title": "Periodic Table Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create Bash a script to get information about chemical elements from a periodic table database." + ] + }, + "build-a-salon-appointment-scheduler-project": { + "title": "Salon Appointment Scheduler", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create an interactive Bash program that uses PostgreSQL to track the customers and appointments for your salon." + ] + }, + "build-a-world-cup-database-project": { + "title": "World Cup Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create a Bash script that enters information from World Cup games into PostgreSQL, then query the database for useful statistics." + ] + }, + "learn-advanced-bash-by-building-a-kitty-ipsum-translator": { + "title": "Learn Advanced Bash by Building a Kitty Ipsum Translator", + "intro": [ + "There's more to Bash commands than you might think.", + "In this 140 lesson course, you will learn some more complex commands, and the details of how commands work." + ] + }, + "learn-bash-and-sql-by-building-a-bike-rental-shop": { + "title": "Learn Bash and SQL by Building a Bike Rental Shop", + "intro": [ + "In this 210 lesson course, you will build an interactive Bash program that stores rental information for your bike rental shop using PostgreSQL." + ] + }, + "learn-bash-by-building-a-boilerplate": { + "title": "Learn Bash by Building a Boilerplate", + "intro": [ + "The terminal allows you to send text commands to your computer that can manipulate the file system, run programs, automate tasks, and much more.", + "In this 170 lesson course, you will learn basic commands by creating a website boilerplate using only the command line." + ] + }, + "learn-bash-scripting-by-building-five-programs": { + "title": "Learn Bash Scripting by Building Five Programs", + "intro": [ + "Bash scripts combine terminal commands and logic into programs that can execute or automate tasks, and much more.", + "In this 220 lesson course, you will learn more terminal commands and how to use them within Bash scripts by creating five small programs." + ] + }, + "learn-git-by-building-an-sql-reference-object": { + "title": "Learn Git by Building and SQL Reference Object", + "intro": [ + "Git is a version control system that keeps track of all the changes you make to your codebase.", + "In this 240 lesson course, you will learn how Git keeps track of your code by creating an object containing commonly used SQL commands." + ] + }, + "learn-nano-by-building-a-castle": { + "title": "Learn Nano by Building a Castle", + "intro": [ + "Nano is a program that allows you to edit files right in the terminal.", + "In this 40 lesson course, you will learn how to edit files in the terminal with Nano while building a castle." + ] + }, + "learn-relational-databases-by-building-a-mario-database": { + "title": "Learn Relational Databases by Building a Mario Database", + "intro": [ + "Relational databases organize data into tables that are linked together through relationships.", + "In this 165 lesson course, you will learn the basics of relational databases by creating a PostgreSQL database filled with video game characters." + ] + }, + "learn-sql-by-building-a-student-database-part-1": { + "title": "Learn SQL by Building a Student Database: Part 1", + "intro": [ + "SQL, or Structured Query Language, is the language for communicating with relational databases.", + "In this 140 lesson course, you will create a Bash script that uses SQL to enter information about your computer science students into PostgreSQL." + ] + }, + "learn-sql-by-building-a-student-database-part-2": { + "title": "Learn SQL by Building a Student Database: Part 2", + "intro": [ + "SQL join commands are used to combine information from multiple tables in a relational database", + "In this 140 lesson course, you will complete your student database while diving deeper into SQL commands." ] } } diff --git a/client/i18n/locales/english/translations.json b/client/i18n/locales/english/translations.json index 9ac11fa644..b227537b3f 100644 --- a/client/i18n/locales/english/translations.json +++ b/client/i18n/locales/english/translations.json @@ -64,7 +64,9 @@ "go-to-next": "Go to next challenge", "ask-later": "Ask me later", "start-coding": "Start coding!", - "go-to-settings": "Go to settings to claim your certification" + "go-to-settings": "Go to settings to claim your certification", + "click-start-course": "Click here to start the course", + "click-start-project": "Click here to start the project" }, "landing": { "big-heading-1": "Learn to code — for free.", @@ -294,7 +296,13 @@ }, "help-translate": "We are still translating the following certifications.", "help-translate-link": "Help us translate.", - "project-preview-title": "Here's a preview of what you will build" + "project-preview-title": "Here's a preview of what you will build", + "github-required": "A <0>GitHub account is required to run the project. You will need to create one if you haven't already.", + "step-1": "Step 1: Complete the project", + "step-2": "Step 2: Submit your code", + "submit-public-url": "When you have completed the project, save all the required files into a public repository and submit the URL to it below.", + "complete-both-steps": "Complete both steps below to finish the challenge.", + "runs-in-vm": "The project runs in a virtual machine, complete the user stories described in there and get all the tests to pass to finish step 1." }, "donate": { "title": "Support our nonprofit", @@ -512,7 +520,8 @@ "create-token-err": "An error occurred trying to create a token", "delete-token-err": "An error occurred trying to delete your token", "token-created": "You have successfully created a new token.", - "token-deleted": "Your token has been deleted." + "token-deleted": "Your token has been deleted.", + "complete-project-first": "You must complete the project first." }, "validation": { "max-characters": "There is a maximum limit of 288 characters, you have {{charsLeft}} left", diff --git a/client/i18n/locales/espanol/intro.json b/client/i18n/locales/espanol/intro.json index e3bec5172d..034f87a099 100644 --- a/client/i18n/locales/espanol/intro.json +++ b/client/i18n/locales/espanol/intro.json @@ -428,15 +428,107 @@ "relational-databases": { "title": "Bases de Datos Relacionales", "intro": [ - "Para estos cursos, utilizarás herramientas y software de desarrollador reales, incluyendo VS Code, PostgreSQL y la línea de comandos de Linux / Unix para completar tutoriales interactivos y crear proyectos." + "For these courses, you will use real developer tools and software including VS Code, PostgreSQL, and the Linux / Unix command line to complete interactive tutorials and build projects.", + "These courses start off with basic Bash commands. Using the terminal, you will learn everything from navigating and manipulating a file system, scripting in Bash, all the way to advanced usage.", + "Next, you will learn how to create and work with relational databases using PostgreSQL, a database management system, and SQL, the language of these databases.", + "Finally, you will learn Git, the version control system, an essential tool of every developer." ], "blocks": { - "learn-relational-databases": { - "title": "Aprender Bases de Datos Relacionales", + "build-a-celestial-bodies-database-project": { + "title": "Celestial Bodies Database", "intro": [ - "Estos cursos comienzan con comandos básicos de Bash. Usando el terminal, aprenderás todo, desde navegar y manipular un sistema de archivos, crear scripts en Bash, hasta el uso avanzado.", - "A continuación, aprenderás como crear y trabajar con bases de datos relacionales utilizando PostgreSQL, un sistema de administración de bases de datos, y SQL, el lenguaje de estas bases de datos.", - "Finalmente, aprenderás Git, el sistema de control de versiones, y GitHub, un servicio de alojamiento de repositorios de código, dos herramientas esenciales de todo desarrollador." + "This is one of the required projects to earn your certification.", + "For this project, you will build a database of celestial bodies using PostgreSQL." + ] + }, + "build-a-number-guessing-game-project": { + "title": "Number Guessing Game", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will use Bash scripting, PostgreSQL, and Git to create a number guessing game that runs in the terminal and saves user information." + ] + }, + "build-a-periodic-table-database-project": { + "title": "Periodic Table Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create Bash a script to get information about chemical elements from a periodic table database." + ] + }, + "build-a-salon-appointment-scheduler-project": { + "title": "Salon Appointment Scheduler", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create an interactive Bash program that uses PostgreSQL to track the customers and appointments for your salon." + ] + }, + "build-a-world-cup-database-project": { + "title": "World Cup Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create a Bash script that enters information from World Cup games into PostgreSQL, then query the database for useful statistics." + ] + }, + "learn-advanced-bash-by-building-a-kitty-ipsum-translator": { + "title": "Learn Advanced Bash by Building a Kitty Ipsum Translator", + "intro": [ + "There's more to Bash commands than you might think.", + "In this 140 lesson course, you will learn some more complex commands, and the details of how commands work." + ] + }, + "learn-bash-and-sql-by-building-a-bike-rental-shop": { + "title": "Learn Bash and SQL by Building a Bike Rental Shop", + "intro": [ + "In this 210 lesson course, you will build an interactive Bash program that stores rental information for your bike rental shop using PostgreSQL." + ] + }, + "learn-bash-by-building-a-boilerplate": { + "title": "Learn Bash by Building a Boilerplate", + "intro": [ + "The terminal allows you to send text commands to your computer that can manipulate the file system, run programs, automate tasks, and much more.", + "In this 170 lesson course, you will learn basic commands by creating a website boilerplate using only the command line." + ] + }, + "learn-bash-scripting-by-building-five-programs": { + "title": "Learn Bash Scripting by Building Five Programs", + "intro": [ + "Bash scripts combine terminal commands and logic into programs that can execute or automate tasks, and much more.", + "In this 220 lesson course, you will learn more terminal commands and how to use them within Bash scripts by creating five small programs." + ] + }, + "learn-git-by-building-an-sql-reference-object": { + "title": "Learn Git by Building and SQL Reference Object", + "intro": [ + "Git is a version control system that keep track of all the changes you make to your codebase", + "In this 240 lesson course, you will learn how Git keeps track of your code by creating an object containing commonly used SQL commands." + ] + }, + "learn-nano-by-building-a-castle": { + "title": "Learn Nano by Building a Castle", + "intro": [ + "Nano is a program that allow you to edit files right in the terminal.", + "In this 40 lesson course, you will learn how to edit files in the terminal with Nano while building a castle." + ] + }, + "learn-relational-databases-by-building-a-mario-database": { + "title": "Learn Relational Databases by Building a Mario Database", + "intro": [ + "Relational Databases organize data into tables that are linked together through relationships.", + "In this 165 lesson course, you will learn the basics of relational databases by creating a PostgreSQL database filled with video game characters." + ] + }, + "learn-sql-by-building-a-student-database-part-1": { + "title": "Learn SQL by Building a Student Database: Part 1", + "intro": [ + "SQL, or Structured Query Language, is the language for communicating with Relational Databases.", + "In this 140 lesson course, you will create a Bash script that uses SQL to enter information about your computer science students into PostgreSQL." + ] + }, + "learn-sql-by-building-a-student-database-part-2": { + "title": "Learn SQL by Building a Student Database: Part 2", + "intro": [ + "SQL Join commands are used to combine information from multiple tables in a Relational Database", + "In this 140 lesson course, you will complete your student database while diving deeper into SQL commands." ] } } diff --git a/client/i18n/locales/italian/intro.json b/client/i18n/locales/italian/intro.json index 1523de7685..b03e78de99 100644 --- a/client/i18n/locales/italian/intro.json +++ b/client/i18n/locales/italian/intro.json @@ -428,15 +428,107 @@ "relational-databases": { "title": "Database relazionali", "intro": [ - "Per questi corsi, utilizzerai strumenti e software per veri sviluppatori tra cui VS Code, PostgreSQL, e la riga di comando Linux / Unix per completare i tutorial interattivi e costruire progetti." + "For these courses, you will use real developer tools and software including VS Code, PostgreSQL, and the Linux / Unix command line to complete interactive tutorials and build projects.", + "These courses start off with basic Bash commands. Using the terminal, you will learn everything from navigating and manipulating a file system, scripting in Bash, all the way to advanced usage.", + "Next, you will learn how to create and work with relational databases using PostgreSQL, a database management system, and SQL, the language of these databases.", + "Finally, you will learn Git, the version control system, an essential tool of every developer." ], "blocks": { - "learn-relational-databases": { - "title": "Conosci i Database Relazionali", + "build-a-celestial-bodies-database-project": { + "title": "Celestial Bodies Database", "intro": [ - "Questi corsi iniziano con i comandi Bash di base. Utilizzando il terminale, imparerai tutto dal navigare e manipolare un sistema di archiviazione, scripting in Bash, fino ad un utilizzo avanzato.", - "Successivamente, imparerai come creare e lavorare con i database relazionali utilizzando PostgreSQL, un sistema di gestione dei database e SQL, la lingua di questi database.", - "Infine, imparerai Git, il sistema di controllo delle versioni, e GitHub, un servizio di hosting di repository di codice - due strumenti essenziali di ogni sviluppatore." + "This is one of the required projects to earn your certification.", + "For this project, you will build a database of celestial bodies using PostgreSQL." + ] + }, + "build-a-number-guessing-game-project": { + "title": "Number Guessing Game", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will use Bash scripting, PostgreSQL, and Git to create a number guessing game that runs in the terminal and saves user information." + ] + }, + "build-a-periodic-table-database-project": { + "title": "Periodic Table Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create Bash a script to get information about chemical elements from a periodic table database." + ] + }, + "build-a-salon-appointment-scheduler-project": { + "title": "Salon Appointment Scheduler", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create an interactive Bash program that uses PostgreSQL to track the customers and appointments for your salon." + ] + }, + "build-a-world-cup-database-project": { + "title": "World Cup Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create a Bash script that enters information from World Cup games into PostgreSQL, then query the database for useful statistics." + ] + }, + "learn-advanced-bash-by-building-a-kitty-ipsum-translator": { + "title": "Learn Advanced Bash by Building a Kitty Ipsum Translator", + "intro": [ + "There's more to Bash commands than you might think.", + "In this 140 lesson course, you will learn some more complex commands, and the details of how commands work." + ] + }, + "learn-bash-and-sql-by-building-a-bike-rental-shop": { + "title": "Learn Bash and SQL by Building a Bike Rental Shop", + "intro": [ + "In this 210 lesson course, you will build an interactive Bash program that stores rental information for your bike rental shop using PostgreSQL." + ] + }, + "learn-bash-by-building-a-boilerplate": { + "title": "Learn Bash by Building a Boilerplate", + "intro": [ + "The terminal allows you to send text commands to your computer that can manipulate the file system, run programs, automate tasks, and much more.", + "In this 170 lesson course, you will learn basic commands by creating a website boilerplate using only the command line." + ] + }, + "learn-bash-scripting-by-building-five-programs": { + "title": "Learn Bash Scripting by Building Five Programs", + "intro": [ + "Bash scripts combine terminal commands and logic into programs that can execute or automate tasks, and much more.", + "In this 220 lesson course, you will learn more terminal commands and how to use them within Bash scripts by creating five small programs." + ] + }, + "learn-git-by-building-an-sql-reference-object": { + "title": "Learn Git by Building and SQL Reference Object", + "intro": [ + "Git is a version control system that keep track of all the changes you make to your codebase", + "In this 240 lesson course, you will learn how Git keeps track of your code by creating an object containing commonly used SQL commands." + ] + }, + "learn-nano-by-building-a-castle": { + "title": "Learn Nano by Building a Castle", + "intro": [ + "Nano is a program that allow you to edit files right in the terminal.", + "In this 40 lesson course, you will learn how to edit files in the terminal with Nano while building a castle." + ] + }, + "learn-relational-databases-by-building-a-mario-database": { + "title": "Learn Relational Databases by Building a Mario Database", + "intro": [ + "Relational Databases organize data into tables that are linked together through relationships.", + "In this 165 lesson course, you will learn the basics of relational databases by creating a PostgreSQL database filled with video game characters." + ] + }, + "learn-sql-by-building-a-student-database-part-1": { + "title": "Learn SQL by Building a Student Database: Part 1", + "intro": [ + "SQL, or Structured Query Language, is the language for communicating with Relational Databases.", + "In this 140 lesson course, you will create a Bash script that uses SQL to enter information about your computer science students into PostgreSQL." + ] + }, + "learn-sql-by-building-a-student-database-part-2": { + "title": "Learn SQL by Building a Student Database: Part 2", + "intro": [ + "SQL Join commands are used to combine information from multiple tables in a Relational Database", + "In this 140 lesson course, you will complete your student database while diving deeper into SQL commands." ] } } diff --git a/client/i18n/locales/japanese/intro.json b/client/i18n/locales/japanese/intro.json index 5ea728ea6e..e5535653db 100644 --- a/client/i18n/locales/japanese/intro.json +++ b/client/i18n/locales/japanese/intro.json @@ -428,15 +428,107 @@ "relational-databases": { "title": "リレーショナルデータベース", "intro": [ - "このコースでは、VS Code、PostgreSQL、そして Linux / Unix コマンドラインを含む本格的な開発者ツールとソフトウェアを使用して、インタラクティブなチュートリアルを完了し、プロジェクトを構築します。" + "For these courses, you will use real developer tools and software including VS Code, PostgreSQL, and the Linux / Unix command line to complete interactive tutorials and build projects.", + "These courses start off with basic Bash commands. Using the terminal, you will learn everything from navigating and manipulating a file system, scripting in Bash, all the way to advanced usage.", + "Next, you will learn how to create and work with relational databases using PostgreSQL, a database management system, and SQL, the language of these databases.", + "Finally, you will learn Git, the version control system, an essential tool of every developer." ], "blocks": { - "learn-relational-databases": { - "title": "リレーショナルデータベースを学習する", + "build-a-celestial-bodies-database-project": { + "title": "Celestial Bodies Database", "intro": [ - "これらのコースは基本的な Bash コマンドから始まります。ターミナルを使用して、ファイルシステムの移動や操作から、Bash 内でのスクリプト、幅広い高度な使用法まで、すべてを学習します。", - "次に、データベース管理システムである PostgreSQL と、これらデータベースの言語である SQL を使用して関係データベースを作成し取り扱う方法を学習します。", - "最後に、すべての開発者に不可欠な 2 つのツール、バージョン管理システムである Git と、コードリポジトリホスティングサービスである GitHub を学習します。" + "This is one of the required projects to earn your certification.", + "For this project, you will build a database of celestial bodies using PostgreSQL." + ] + }, + "build-a-number-guessing-game-project": { + "title": "Number Guessing Game", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will use Bash scripting, PostgreSQL, and Git to create a number guessing game that runs in the terminal and saves user information." + ] + }, + "build-a-periodic-table-database-project": { + "title": "Periodic Table Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create Bash a script to get information about chemical elements from a periodic table database." + ] + }, + "build-a-salon-appointment-scheduler-project": { + "title": "Salon Appointment Scheduler", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create an interactive Bash program that uses PostgreSQL to track the customers and appointments for your salon." + ] + }, + "build-a-world-cup-database-project": { + "title": "World Cup Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create a Bash script that enters information from World Cup games into PostgreSQL, then query the database for useful statistics." + ] + }, + "learn-advanced-bash-by-building-a-kitty-ipsum-translator": { + "title": "Learn Advanced Bash by Building a Kitty Ipsum Translator", + "intro": [ + "There's more to Bash commands than you might think.", + "In this 140 lesson course, you will learn some more complex commands, and the details of how commands work." + ] + }, + "learn-bash-and-sql-by-building-a-bike-rental-shop": { + "title": "Learn Bash and SQL by Building a Bike Rental Shop", + "intro": [ + "In this 210 lesson course, you will build an interactive Bash program that stores rental information for your bike rental shop using PostgreSQL." + ] + }, + "learn-bash-by-building-a-boilerplate": { + "title": "Learn Bash by Building a Boilerplate", + "intro": [ + "The terminal allows you to send text commands to your computer that can manipulate the file system, run programs, automate tasks, and much more.", + "In this 170 lesson course, you will learn basic commands by creating a website boilerplate using only the command line." + ] + }, + "learn-bash-scripting-by-building-five-programs": { + "title": "Learn Bash Scripting by Building Five Programs", + "intro": [ + "Bash scripts combine terminal commands and logic into programs that can execute or automate tasks, and much more.", + "In this 220 lesson course, you will learn more terminal commands and how to use them within Bash scripts by creating five small programs." + ] + }, + "learn-git-by-building-an-sql-reference-object": { + "title": "Learn Git by Building and SQL Reference Object", + "intro": [ + "Git is a version control system that keep track of all the changes you make to your codebase", + "In this 240 lesson course, you will learn how Git keeps track of your code by creating an object containing commonly used SQL commands." + ] + }, + "learn-nano-by-building-a-castle": { + "title": "Learn Nano by Building a Castle", + "intro": [ + "Nano is a program that allow you to edit files right in the terminal.", + "In this 40 lesson course, you will learn how to edit files in the terminal with Nano while building a castle." + ] + }, + "learn-relational-databases-by-building-a-mario-database": { + "title": "Learn Relational Databases by Building a Mario Database", + "intro": [ + "Relational Databases organize data into tables that are linked together through relationships.", + "In this 165 lesson course, you will learn the basics of relational databases by creating a PostgreSQL database filled with video game characters." + ] + }, + "learn-sql-by-building-a-student-database-part-1": { + "title": "Learn SQL by Building a Student Database: Part 1", + "intro": [ + "SQL, or Structured Query Language, is the language for communicating with Relational Databases.", + "In this 140 lesson course, you will create a Bash script that uses SQL to enter information about your computer science students into PostgreSQL." + ] + }, + "learn-sql-by-building-a-student-database-part-2": { + "title": "Learn SQL by Building a Student Database: Part 2", + "intro": [ + "SQL Join commands are used to combine information from multiple tables in a Relational Database", + "In this 140 lesson course, you will complete your student database while diving deeper into SQL commands." ] } } diff --git a/client/i18n/locales/portuguese/intro.json b/client/i18n/locales/portuguese/intro.json index d9b32e6f28..68d24330d5 100644 --- a/client/i18n/locales/portuguese/intro.json +++ b/client/i18n/locales/portuguese/intro.json @@ -428,15 +428,107 @@ "relational-databases": { "title": "Bancos de dados relacionais", "intro": [ - "Para estes cursos, você usará ferramentas e software reais de desenvolvedor, incluindo o VS Code, PostgreSQL e a linha de comando do Linux/Unix para completar tutoriais interativos e criar projetos." + "For these courses, you will use real developer tools and software including VS Code, PostgreSQL, and the Linux / Unix command line to complete interactive tutorials and build projects.", + "These courses start off with basic Bash commands. Using the terminal, you will learn everything from navigating and manipulating a file system, scripting in Bash, all the way to advanced usage.", + "Next, you will learn how to create and work with relational databases using PostgreSQL, a database management system, and SQL, the language of these databases.", + "Finally, you will learn Git, the version control system, an essential tool of every developer." ], "blocks": { - "learn-relational-databases": { - "title": "Aprenda bancos de dados relacionais", + "build-a-celestial-bodies-database-project": { + "title": "Celestial Bodies Database", "intro": [ - "Estes cursos começam com comandos básicos do Bash. Usando o terminal, você aprenderá tudo, de navegar e manipular um sistema de arquivos e fazer scripts no Bash, até usos mais avançados.", - "Depois, você aprenderá a criar e trabalhar com bancos de dados relacionados usando o PostgreSQL, um sistema de gerenciamento de banco de dados, e o SQL, a linguagem destes bancos de dados.", - "Por fim, você aprenderá o Git, um sistema de controle de versão, e o GitHub, um serviço de hospedagem e repositório de código - duas ferramentas essenciais para todo o desenvolvedor." + "This is one of the required projects to earn your certification.", + "For this project, you will build a database of celestial bodies using PostgreSQL." + ] + }, + "build-a-number-guessing-game-project": { + "title": "Number Guessing Game", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will use Bash scripting, PostgreSQL, and Git to create a number guessing game that runs in the terminal and saves user information." + ] + }, + "build-a-periodic-table-database-project": { + "title": "Periodic Table Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create Bash a script to get information about chemical elements from a periodic table database." + ] + }, + "build-a-salon-appointment-scheduler-project": { + "title": "Salon Appointment Scheduler", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create an interactive Bash program that uses PostgreSQL to track the customers and appointments for your salon." + ] + }, + "build-a-world-cup-database-project": { + "title": "World Cup Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create a Bash script that enters information from World Cup games into PostgreSQL, then query the database for useful statistics." + ] + }, + "learn-advanced-bash-by-building-a-kitty-ipsum-translator": { + "title": "Learn Advanced Bash by Building a Kitty Ipsum Translator", + "intro": [ + "There's more to Bash commands than you might think.", + "In this 140 lesson course, you will learn some more complex commands, and the details of how commands work." + ] + }, + "learn-bash-and-sql-by-building-a-bike-rental-shop": { + "title": "Learn Bash and SQL by Building a Bike Rental Shop", + "intro": [ + "In this 210 lesson course, you will build an interactive Bash program that stores rental information for your bike rental shop using PostgreSQL." + ] + }, + "learn-bash-by-building-a-boilerplate": { + "title": "Learn Bash by Building a Boilerplate", + "intro": [ + "The terminal allows you to send text commands to your computer that can manipulate the file system, run programs, automate tasks, and much more.", + "In this 170 lesson course, you will learn basic commands by creating a website boilerplate using only the command line." + ] + }, + "learn-bash-scripting-by-building-five-programs": { + "title": "Learn Bash Scripting by Building Five Programs", + "intro": [ + "Bash scripts combine terminal commands and logic into programs that can execute or automate tasks, and much more.", + "In this 220 lesson course, you will learn more terminal commands and how to use them within Bash scripts by creating five small programs." + ] + }, + "learn-git-by-building-an-sql-reference-object": { + "title": "Learn Git by Building and SQL Reference Object", + "intro": [ + "Git is a version control system that keep track of all the changes you make to your codebase", + "In this 240 lesson course, you will learn how Git keeps track of your code by creating an object containing commonly used SQL commands." + ] + }, + "learn-nano-by-building-a-castle": { + "title": "Learn Nano by Building a Castle", + "intro": [ + "Nano is a program that allow you to edit files right in the terminal.", + "In this 40 lesson course, you will learn how to edit files in the terminal with Nano while building a castle." + ] + }, + "learn-relational-databases-by-building-a-mario-database": { + "title": "Learn Relational Databases by Building a Mario Database", + "intro": [ + "Relational Databases organize data into tables that are linked together through relationships.", + "In this 165 lesson course, you will learn the basics of relational databases by creating a PostgreSQL database filled with video game characters." + ] + }, + "learn-sql-by-building-a-student-database-part-1": { + "title": "Learn SQL by Building a Student Database: Part 1", + "intro": [ + "SQL, or Structured Query Language, is the language for communicating with Relational Databases.", + "In this 140 lesson course, you will create a Bash script that uses SQL to enter information about your computer science students into PostgreSQL." + ] + }, + "learn-sql-by-building-a-student-database-part-2": { + "title": "Learn SQL by Building a Student Database: Part 2", + "intro": [ + "SQL Join commands are used to combine information from multiple tables in a Relational Database", + "In this 140 lesson course, you will complete your student database while diving deeper into SQL commands." ] } } diff --git a/client/i18n/locales/ukrainian/intro.json b/client/i18n/locales/ukrainian/intro.json index 72b15b826c..5d88ac8fc6 100644 --- a/client/i18n/locales/ukrainian/intro.json +++ b/client/i18n/locales/ukrainian/intro.json @@ -428,15 +428,107 @@ "relational-databases": { "title": "Реляційна база даних", "intro": [ - "Для цих курсів ви будете використовувати реальні інструменти розробника та програмне забезпечення, включаючи VS-код, PostgreSQL, і командний рядок Linux / Unix для завершення інтерактивних уроків і створення проєктів." + "For these courses, you will use real developer tools and software including VS Code, PostgreSQL, and the Linux / Unix command line to complete interactive tutorials and build projects.", + "These courses start off with basic Bash commands. Using the terminal, you will learn everything from navigating and manipulating a file system, scripting in Bash, all the way to advanced usage.", + "Next, you will learn how to create and work with relational databases using PostgreSQL, a database management system, and SQL, the language of these databases.", + "Finally, you will learn Git, the version control system, an essential tool of every developer." ], "blocks": { - "learn-relational-databases": { - "title": "Вивчення реляційної бази даних", + "build-a-celestial-bodies-database-project": { + "title": "Celestial Bodies Database", "intro": [ - "Ці курси починаються з основних Bash команд. За допомогою терміналу ви навчитеся усього необхідного (від навігації та маніпуляції файловою системою, написання скрипту в Bash до просунутого використання).", - "Далі ви навчитеся створювати та працювати з реляційними базами даних використовуючи PostgreSQL (систему керування базами даних) та SQL (мову цих баз даних).", - "Нарешті, ви вивчите Git (систему контролю версій) та GitHub (службу зберігання коду) — два найважливіші інструменти для кожного розробника." + "This is one of the required projects to earn your certification.", + "For this project, you will build a database of celestial bodies using PostgreSQL." + ] + }, + "build-a-number-guessing-game-project": { + "title": "Number Guessing Game", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will use Bash scripting, PostgreSQL, and Git to create a number guessing game that runs in the terminal and saves user information." + ] + }, + "build-a-periodic-table-database-project": { + "title": "Periodic Table Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create Bash a script to get information about chemical elements from a periodic table database." + ] + }, + "build-a-salon-appointment-scheduler-project": { + "title": "Salon Appointment Scheduler", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create an interactive Bash program that uses PostgreSQL to track the customers and appointments for your salon." + ] + }, + "build-a-world-cup-database-project": { + "title": "World Cup Database", + "intro": [ + "This is one of the required projects to earn your certification.", + "For this project, you will create a Bash script that enters information from World Cup games into PostgreSQL, then query the database for useful statistics." + ] + }, + "learn-advanced-bash-by-building-a-kitty-ipsum-translator": { + "title": "Learn Advanced Bash by Building a Kitty Ipsum Translator", + "intro": [ + "There's more to Bash commands than you might think.", + "In this 140 lesson course, you will learn some more complex commands, and the details of how commands work." + ] + }, + "learn-bash-and-sql-by-building-a-bike-rental-shop": { + "title": "Learn Bash and SQL by Building a Bike Rental Shop", + "intro": [ + "In this 210 lesson course, you will build an interactive Bash program that stores rental information for your bike rental shop using PostgreSQL." + ] + }, + "learn-bash-by-building-a-boilerplate": { + "title": "Learn Bash by Building a Boilerplate", + "intro": [ + "The terminal allows you to send text commands to your computer that can manipulate the file system, run programs, automate tasks, and much more.", + "In this 170 lesson course, you will learn basic commands by creating a website boilerplate using only the command line." + ] + }, + "learn-bash-scripting-by-building-five-programs": { + "title": "Learn Bash Scripting by Building Five Programs", + "intro": [ + "Bash scripts combine terminal commands and logic into programs that can execute or automate tasks, and much more.", + "In this 220 lesson course, you will learn more terminal commands and how to use them within Bash scripts by creating five small programs." + ] + }, + "learn-git-by-building-an-sql-reference-object": { + "title": "Learn Git by Building and SQL Reference Object", + "intro": [ + "Git is a version control system that keep track of all the changes you make to your codebase", + "In this 240 lesson course, you will learn how Git keeps track of your code by creating an object containing commonly used SQL commands." + ] + }, + "learn-nano-by-building-a-castle": { + "title": "Learn Nano by Building a Castle", + "intro": [ + "Nano is a program that allow you to edit files right in the terminal.", + "In this 40 lesson course, you will learn how to edit files in the terminal with Nano while building a castle." + ] + }, + "learn-relational-databases-by-building-a-mario-database": { + "title": "Learn Relational Databases by Building a Mario Database", + "intro": [ + "Relational Databases organize data into tables that are linked together through relationships.", + "In this 165 lesson course, you will learn the basics of relational databases by creating a PostgreSQL database filled with video game characters." + ] + }, + "learn-sql-by-building-a-student-database-part-1": { + "title": "Learn SQL by Building a Student Database: Part 1", + "intro": [ + "SQL, or Structured Query Language, is the language for communicating with Relational Databases.", + "In this 140 lesson course, you will create a Bash script that uses SQL to enter information about your computer science students into PostgreSQL." + ] + }, + "learn-sql-by-building-a-student-database-part-2": { + "title": "Learn SQL by Building a Student Database: Part 2", + "intro": [ + "SQL Join commands are used to combine information from multiple tables in a Relational Database", + "In this 140 lesson course, you will complete your student database while diving deeper into SQL commands." ] } } diff --git a/client/src/components/Flash/redux/flash-messages.ts b/client/src/components/Flash/redux/flash-messages.ts index 01057512c5..bbf1407ef4 100644 --- a/client/src/components/Flash/redux/flash-messages.ts +++ b/client/src/components/Flash/redux/flash-messages.ts @@ -5,6 +5,7 @@ export enum FlashMessages { CertClaimSuccess = 'flash.cert-claim-success', CertificateMissing = 'flash.certificate-missing', CertsPrivate = 'flash.certs-private', + CompleteProjectFirst = 'flash.complete-project-first', CreateTokenErr = 'flash.create-token-err', DeleteTokenErr = 'flash.delete-token-err', EmailValid = 'flash.email-valid', diff --git a/client/src/components/settings/webhook-token.tsx b/client/src/components/settings/webhook-token.tsx index e2a34aab45..5dfd065d49 100644 --- a/client/src/components/settings/webhook-token.tsx +++ b/client/src/components/settings/webhook-token.tsx @@ -17,7 +17,7 @@ import './webhook-token.css'; type WebhookTokenProps = { deleteWebhookToken: () => void; - isSuperBlockPage?: boolean; + isChallengePage?: boolean; postWebhookToken: () => void; t: TFunction; webhookToken: string | null; @@ -69,9 +69,9 @@ class WebhookToken extends Component { }; render() { - const { isSuperBlockPage = false, t, webhookToken = null } = this.props; + const { isChallengePage = false, t, webhookToken = null } = this.props; - return isSuperBlockPage ? ( + return isChallengePage ? ( <> {!webhookToken && (
diff --git a/client/src/redux/index.js b/client/src/redux/index.js index 8d9d36d77c..fe94146a40 100644 --- a/client/src/redux/index.js +++ b/client/src/redux/index.js @@ -186,6 +186,8 @@ export const updateCurrentChallengeId = createAction( export const completedChallengesSelector = state => userSelector(state).completedChallenges || []; +export const partiallyCompletedChallengesSelector = state => + userSelector(state).partiallyCompletedChallenges || []; export const completionCountSelector = state => state[MainApp].completionCount; export const currentChallengeIdSelector = state => state[MainApp].currentChallengeId; diff --git a/client/src/templates/Challenges/codeally/codeally.css b/client/src/templates/Challenges/codeally/codeally.css new file mode 100644 index 0000000000..87db255121 --- /dev/null +++ b/client/src/templates/Challenges/codeally/codeally.css @@ -0,0 +1,15 @@ +.ca-description { + font-family: 'Lato', sans-serif; +} + +.ca-btn-padding { + padding: 0 15px; +} + +.ca-btn-padding button { + font-size: 1.1rem; +} + +.ca-btn-margin { + margin-bottom: 5px; +} diff --git a/client/src/templates/Challenges/codeally/show.tsx b/client/src/templates/Challenges/codeally/show.tsx index 72defa8383..883deb9236 100644 --- a/client/src/templates/Challenges/codeally/show.tsx +++ b/client/src/templates/Challenges/codeally/show.tsx @@ -1,24 +1,68 @@ -/* eslint-disable max-len */ - // Package Utilities +import { Grid, Col, Row, Button } from '@freecodecamp/react-bootstrap'; import { graphql } from 'gatsby'; import React, { Component } from 'react'; import Helmet from 'react-helmet'; +import { TFunction, Trans, withTranslation } from 'react-i18next'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import type { Dispatch } from 'redux'; import { createSelector } from 'reselect'; // Local Utilities +import Spacer from '../../../components/helpers/spacer'; import LearnLayout from '../../../components/layouts/learn'; -import { webhookTokenSelector } from '../../../redux'; -import { ChallengeNode, ChallengeMeta } from '../../../redux/prop-types'; -import { updateChallengeMeta, challengeMounted } from '../redux'; -// Redux +import ChallengeTitle from '../components/challenge-title'; +import PrismFormatted from '../components/prism-formatted'; +import { challengeTypes } from '../../../../utils/challenge-types'; +import CompletionModal from '../components/completion-modal'; +import GreenPass from '../../../assets/icons/green-pass'; +import HelpModal from '../components/help-modal'; +import Hotkeys from '../components/Hotkeys'; +import { + completedChallengesSelector, + isSignedInSelector, + partiallyCompletedChallengesSelector, + webhookTokenSelector +} from '../../../redux'; +import { + challengeMounted, + isChallengeCompletedSelector, + updateChallengeMeta, + openModal, + updateSolutionFormValues +} from '../redux'; +import { createFlashMessage } from '../../../components/Flash/redux'; +import { + ChallengeNode, + ChallengeMeta, + CompletedChallenge +} from '../../../redux/prop-types'; +import ProjectToolPanel from '../projects/tool-panel'; +import SolutionForm from '../projects/solution-form'; +import WebhookToken from '../../../components/settings/webhook-token'; +import { FlashMessages } from '../../../components/Flash/redux/flash-messages'; +import './codeally.css'; + +// Redux const mapStateToProps = createSelector( + completedChallengesSelector, + isChallengeCompletedSelector, + isSignedInSelector, + partiallyCompletedChallengesSelector, webhookTokenSelector, - (webhookToken: string | null) => ({ + ( + completedChallenges: CompletedChallenge[], + isChallengeCompleted: boolean, + isSignedIn: boolean, + partiallyCompletedChallenges: CompletedChallenge[], + webhookToken: string | null + ) => ({ + completedChallenges, + isChallengeCompleted, + isSignedIn, + partiallyCompletedChallenges, webhookToken }) ); @@ -26,28 +70,53 @@ const mapStateToProps = createSelector( const mapDispatchToProps = (dispatch: Dispatch) => bindActionCreators( { + challengeMounted, + createFlashMessage, + openCompletionModal: () => openModal('completion'), updateChallengeMeta, - challengeMounted + updateSolutionFormValues }, dispatch ); // Types interface ShowCodeAllyProps { + challengeMounted: (arg0: string) => void; + completedChallenges: CompletedChallenge[]; + createFlashMessage: typeof createFlashMessage; data: { challengeNode: ChallengeNode }; + isChallengeCompleted: boolean; + isSignedIn: boolean; + openCompletionModal: () => void; pageContext: { challengeMeta: ChallengeMeta; }; + partiallyCompletedChallenges: CompletedChallenge[]; + t: TFunction; updateChallengeMeta: (arg0: ChallengeMeta) => void; + updateSolutionFormValues: () => void; webhookToken: string | null; } +interface ShowCodeAllyState { + showIframe: boolean; +} + // Component -class ShowCodeAlly extends Component { +class ShowCodeAlly extends Component { static displayName: string; + private _container: HTMLElement | null = null; + constructor(props: ShowCodeAllyProps) { + super(props); + this.state = { + showIframe: false + }; + } + componentDidMount(): void { const { updateChallengeMeta, + challengeMounted, data: { challengeNode: { challenge: { challengeType, title } @@ -56,27 +125,96 @@ class ShowCodeAlly extends Component { pageContext: { challengeMeta } } = this.props; updateChallengeMeta({ ...challengeMeta, title, challengeType }); + challengeMounted(challengeMeta.id); + this._container?.focus(); } + showIframe = () => { + this.setState({ + showIframe: true + }); + }; + + handleSubmit = ({ + showCompletionModal + }: { + showCompletionModal: boolean; + }) => { + const { + completedChallenges, + createFlashMessage, + data: { + challengeNode: { + challenge: { id: challengeId } + } + }, + partiallyCompletedChallenges + } = this.props; + + const isPartiallyCompleted = partiallyCompletedChallenges.some( + challenge => challenge.id === challengeId + ); + + const isCompleted = completedChallenges.some( + challenge => challenge.id === challengeId + ); + + if (!isPartiallyCompleted && !isCompleted) { + createFlashMessage({ + type: 'danger', + message: FlashMessages.CompleteProjectFirst + }); + } else if (showCompletionModal) { + this.props.openCompletionModal(); + } + }; + render() { const { + completedChallenges, data: { challengeNode: { challenge: { - title, + block, + certification, + challengeType, + description, fields: { blockName }, + id: challengeId, + instructions, + notes, + superBlock, + title, + translationPending, url } } }, + isChallengeCompleted, + isSignedIn, + pageContext: { + challengeMeta: { nextChallengePath, prevChallengePath } + }, + partiallyCompletedChallenges, + t, + updateSolutionFormValues, webhookToken = null } = this.props; + const { showIframe } = this.state; const envVariables = webhookToken ? `&envVariables=CODEROAD_WEBHOOK_TOKEN=${webhookToken}` : ''; - return ( + const isPartiallyCompleted = partiallyCompletedChallenges.some( + challenge => challenge.id === challengeId + ); + + const isCompleted = completedChallenges.some( + challenge => challenge.id === challengeId + ); + + return showIframe ? (