feat(curriculum): add relational databases cert as upcoming change (#41658)
This commit is contained in:
@ -247,6 +247,7 @@ exports.createSchemaCustomization = ({ actions }) => {
|
||||
const typeDefs = `
|
||||
type ChallengeNode implements Node {
|
||||
files: ChallengeFile
|
||||
url: String
|
||||
}
|
||||
type ChallengeFile {
|
||||
indexcss: FileContents
|
||||
|
@ -275,6 +275,16 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"relational-databases": {
|
||||
"title": "Relational Databases",
|
||||
"intro": ["placeholder"],
|
||||
"blocks": {
|
||||
"learn-relational-databases": {
|
||||
"title": "Learn Relational Databases",
|
||||
"intro": ["placeholder"]
|
||||
}
|
||||
}
|
||||
},
|
||||
"apis-and-microservices": {
|
||||
"title": "APIs and Microservices",
|
||||
"intro": [
|
||||
|
@ -3,6 +3,7 @@ const crypto = require('crypto');
|
||||
function createChallengeNode(challenge, reporter) {
|
||||
// challengeType 11 is for video challenges (they only have instructions)
|
||||
// challengeType 7 is for certificates (they only have tests)
|
||||
// challengeType 12 is for CodeAlly/CodeRoad challenge
|
||||
|
||||
// TODO: either handle empty descriptions inside Gatsby OR ensure that
|
||||
// description defaults to '' when creating challenges.
|
||||
@ -12,7 +13,8 @@ function createChallengeNode(challenge, reporter) {
|
||||
if (
|
||||
typeof challenge.description !== 'string' &&
|
||||
challenge.challengeType !== 11 &&
|
||||
challenge.challengeType !== 7
|
||||
challenge.challengeType !== 7 &&
|
||||
challenge.challengeType !== 12
|
||||
) {
|
||||
reporter.warn(`
|
||||
|
||||
|
10
client/src/pages/learn/relational-databases/index.md
Normal file
10
client/src/pages/learn/relational-databases/index.md
Normal file
@ -0,0 +1,10 @@
|
||||
---
|
||||
title: Relational Databases
|
||||
superBlock: relational-databases
|
||||
---
|
||||
|
||||
## Introduction to Relational Databases
|
||||
|
||||
This introduction is a stub
|
||||
|
||||
Help us make it real on [GitHub](https://github.com/freeCodeCamp/learn/tree/master/src/introductions).
|
@ -0,0 +1,9 @@
|
||||
---
|
||||
title: Introduction to Relational Databases
|
||||
block: Learn Relational Databases
|
||||
superBlock: Relational Databases
|
||||
---
|
||||
|
||||
## Placeholder
|
||||
|
||||
Placeholder
|
@ -234,7 +234,8 @@ export const certificatesByNameSelector = username => state => {
|
||||
isFullStackCert,
|
||||
isSciCompPyCertV7,
|
||||
isDataAnalysisPyCertV7,
|
||||
isMachineLearningPyCertV7
|
||||
isMachineLearningPyCertV7,
|
||||
isRelationalDatabasesCertV8
|
||||
} = userByNameSelector(username)(state);
|
||||
return {
|
||||
hasModernCert:
|
||||
@ -248,7 +249,8 @@ export const certificatesByNameSelector = username => state => {
|
||||
isFullStackCert ||
|
||||
isSciCompPyCertV7 ||
|
||||
isDataAnalysisPyCertV7 ||
|
||||
isMachineLearningPyCertV7,
|
||||
isMachineLearningPyCertV7 ||
|
||||
isRelationalDatabasesCertV8,
|
||||
hasLegacyCert:
|
||||
isFrontEndCert || isBackEndCert || isDataVisCert || isInfosecQaCert,
|
||||
isFullStackCert,
|
||||
@ -302,6 +304,11 @@ export const certificatesByNameSelector = username => state => {
|
||||
show: isMachineLearningPyCertV7,
|
||||
title: 'Machine Learning with Python Certification',
|
||||
certSlug: 'machine-learning-with-python-v7'
|
||||
},
|
||||
{
|
||||
show: isRelationalDatabasesCertV8,
|
||||
title: 'Relational Databases Certification',
|
||||
certSlug: 'relational-databases-v8'
|
||||
}
|
||||
],
|
||||
legacyCerts: [
|
||||
|
@ -5,6 +5,8 @@ const jsAlgoBase =
|
||||
'javascript-algorithms-and-data-structures-projects';
|
||||
const feLibsBase = '/learn/front-end-libraries/front-end-libraries-projects';
|
||||
const dataVisBase = '/learn/data-visualization/data-visualization-projects';
|
||||
const relationalDatabasesBase =
|
||||
'/learn/relational-databases/learn-relational-databases';
|
||||
const apiMicroBase =
|
||||
'/learn/apis-and-microservices/apis-and-microservices-projects';
|
||||
const qaBase = '/learn/quality-assurance/quality-assurance-projects';
|
||||
@ -435,6 +437,44 @@ const certMap = [
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: '606243f50267e718b1e755f4',
|
||||
title: 'Relational Databases',
|
||||
slug: 'relational-databases',
|
||||
flag: 'isRelationalDatabasesCert',
|
||||
projects: [
|
||||
{
|
||||
id: '5f1a4ef5d5d6b5ab580fc6ae',
|
||||
title: 'Celestial Bodies Database',
|
||||
link: `${relationalDatabasesBase}/celestial-bodies-database`,
|
||||
superBlock: 'relational-databases'
|
||||
},
|
||||
{
|
||||
id: '5f87ac112ae598023a42df1a',
|
||||
title: 'Salon Appointment Scheduler',
|
||||
link: `${relationalDatabasesBase}/salon-appointment-scheduler`,
|
||||
superBlock: 'relational-databases'
|
||||
},
|
||||
{
|
||||
id: '5f9771307d4d22b9d2b75a94',
|
||||
title: 'World Cup Database',
|
||||
link: `${relationalDatabasesBase}/world-cup-database`,
|
||||
superBlock: 'relational-databases'
|
||||
},
|
||||
{
|
||||
id: '602d9ff222201c65d2a019f2',
|
||||
title: 'Periodic Table Database',
|
||||
link: `${relationalDatabasesBase}/periodic-table-database`,
|
||||
superBlock: 'relational-databases'
|
||||
},
|
||||
{
|
||||
id: '602da04c22201c65d2a019f4',
|
||||
title: 'Final Boss',
|
||||
link: `${relationalDatabasesBase}/final-boss`,
|
||||
superBlock: 'relational-databases'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
id: '561add10cb82ac38a17523bc',
|
||||
title: 'APIs and Microservices',
|
||||
@ -675,7 +715,9 @@ certMap.forEach(cert => {
|
||||
if (cert.title !== 'Legacy Full Stack') {
|
||||
if (cert.title.startsWith('Legacy')) {
|
||||
legacyProjectMap[cert.title] = cert.projects;
|
||||
} else {
|
||||
// temporary hiding of RDBMS cert
|
||||
// should do suggestion on line 33 and use front matter to hide it
|
||||
} else if (!cert.title.startsWith('Relational')) {
|
||||
projectMap[cert.title] = cert.projects;
|
||||
}
|
||||
}
|
||||
|
99
client/src/templates/Challenges/codeally/show.js
Normal file
99
client/src/templates/Challenges/codeally/show.js
Normal file
@ -0,0 +1,99 @@
|
||||
/* eslint-disable max-len */
|
||||
|
||||
// Package Utilities
|
||||
import React, { Component } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { bindActionCreators } from 'redux';
|
||||
import { connect } from 'react-redux';
|
||||
import Helmet from 'react-helmet';
|
||||
import { graphql } from 'gatsby';
|
||||
|
||||
// Local Utilities
|
||||
import LearnLayout from '../../../components/layouts/Learn';
|
||||
import { ChallengeNode } from '../../../redux/prop-types';
|
||||
import { updateChallengeMeta, challengeMounted } from '../redux';
|
||||
|
||||
// Redux
|
||||
const mapStateToProps = () => ({});
|
||||
const mapDispatchToProps = dispatch =>
|
||||
bindActionCreators(
|
||||
{
|
||||
updateChallengeMeta,
|
||||
challengeMounted
|
||||
},
|
||||
dispatch
|
||||
);
|
||||
|
||||
// Proptypes
|
||||
const propTypes = {
|
||||
data: PropTypes.shape({
|
||||
challengeNode: ChallengeNode
|
||||
}),
|
||||
pageContext: PropTypes.shape({
|
||||
challengeMeta: PropTypes.shape({
|
||||
id: PropTypes.string,
|
||||
introPath: PropTypes.string,
|
||||
nextChallengePath: PropTypes.string,
|
||||
prevChallengePath: PropTypes.string
|
||||
})
|
||||
}),
|
||||
updateChallengeMeta: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
// Component
|
||||
class ShowCodeAlly extends Component {
|
||||
componentDidMount() {
|
||||
const {
|
||||
updateChallengeMeta,
|
||||
data: {
|
||||
challengeNode: { challengeType, title }
|
||||
},
|
||||
pageContext: { challengeMeta }
|
||||
} = this.props;
|
||||
updateChallengeMeta({ ...challengeMeta, title, challengeType });
|
||||
}
|
||||
|
||||
render() {
|
||||
const {
|
||||
title,
|
||||
fields: { blockName },
|
||||
url
|
||||
} = this.props.data.challengeNode;
|
||||
|
||||
return (
|
||||
<LearnLayout>
|
||||
<Helmet title={`${blockName}: ${title} | freeCodeCamp.org`} />
|
||||
<iframe
|
||||
sandbox='allow-modals allow-forms allow-popups allow-scripts allow-same-origin'
|
||||
src={`http://codeally.io/embed/?repoUrl=${url}`}
|
||||
style={{
|
||||
width: '100%',
|
||||
height: 'calc(100vh - 38px)',
|
||||
overflow: 'hidden',
|
||||
border: 0
|
||||
}}
|
||||
title='Editor'
|
||||
/>
|
||||
</LearnLayout>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
ShowCodeAlly.displayName = 'ShowCodeAlly';
|
||||
ShowCodeAlly.propTypes = propTypes;
|
||||
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(ShowCodeAlly);
|
||||
|
||||
// GraphQL
|
||||
export const query = graphql`
|
||||
query CodeAllyChallenge($slug: String!) {
|
||||
challengeNode(fields: { slug: { eq: $slug } }) {
|
||||
title
|
||||
challengeType
|
||||
url
|
||||
fields {
|
||||
blockName
|
||||
}
|
||||
}
|
||||
}
|
||||
`;
|
@ -11,6 +11,7 @@ const quiz = 8;
|
||||
const invalid = 9;
|
||||
const pythonProject = 10;
|
||||
const video = 11;
|
||||
const codeally = 12;
|
||||
|
||||
// individual exports
|
||||
exports.backend = backend;
|
||||
@ -31,7 +32,8 @@ exports.challengeTypes = {
|
||||
step,
|
||||
quiz,
|
||||
invalid,
|
||||
video
|
||||
video,
|
||||
codeally
|
||||
};
|
||||
|
||||
// turn challengeType to file ext
|
||||
@ -52,7 +54,8 @@ exports.viewTypes = {
|
||||
[step]: 'step',
|
||||
[quiz]: 'quiz',
|
||||
[backend]: 'backend',
|
||||
[video]: 'video'
|
||||
[video]: 'video',
|
||||
[codeally]: 'codeally'
|
||||
};
|
||||
|
||||
// determine the type of submit function to use for the challenge on completion
|
||||
|
@ -15,6 +15,10 @@ const frontend = path.resolve(
|
||||
__dirname,
|
||||
'../../src/templates/Challenges/projects/frontend/Show.js'
|
||||
);
|
||||
const codeally = path.resolve(
|
||||
__dirname,
|
||||
'../../src/templates/Challenges/codeally/show.js'
|
||||
);
|
||||
const intro = path.resolve(
|
||||
__dirname,
|
||||
'../../src/templates/Introduction/Intro.js'
|
||||
@ -33,7 +37,8 @@ const views = {
|
||||
classic,
|
||||
modern: classic,
|
||||
frontend,
|
||||
video
|
||||
video,
|
||||
codeally
|
||||
// quiz: Quiz
|
||||
};
|
||||
|
||||
|
@ -59,5 +59,21 @@
|
||||
"basic-javascript-rpg-game": "JavaScript",
|
||||
"functional-programming-spreadsheet": "JavaScript",
|
||||
"intermediate-javascript-calorie-counter": "JavaScript",
|
||||
"d3-dashboard": "JavaScript"
|
||||
"d3-dashboard": "JavaScript",
|
||||
"learn-bash-by-building-a-boilerplate": "Relational Databases",
|
||||
"learn-relational-databases-by-building-a-mario-database":
|
||||
"Relational Databases",
|
||||
"celestial-bodies-database": "Relational Databases",
|
||||
"learn-bash-scripting-by-building-five-programs": "Relational Databases",
|
||||
"learn-bash-and-sql-by-building-a-bike-rental-shop": "Relational Databases",
|
||||
"salon-appointment-scheduler": "Relational Databases",
|
||||
"learn-sql-by-building-a-student-database": "Relational Databases",
|
||||
"learn-advanced-bash-by-building": "Relational Databases",
|
||||
"world-cup-database": "Relational Databases",
|
||||
"learn-nano-by-building-a-castle": "Relational Databases",
|
||||
"learn-git-by-building-an-sql-reference-object": "Relational Databases",
|
||||
"periodic-table-database": "Relational Databases",
|
||||
"learn-github-by-building-a-list-of-inspirational-quotes":
|
||||
"Relational Databases",
|
||||
"final-boss": "Relational Databases"
|
||||
}
|
||||
|
@ -13,7 +13,8 @@ const certTypes = {
|
||||
sciCompPyV7: 'isSciCompPyCertV7',
|
||||
dataAnalysisPyV7: 'isDataAnalysisPyCertV7',
|
||||
machineLearningPyV7: 'isMachineLearningPyCertV7',
|
||||
fullStack: 'isFullStackCert'
|
||||
fullStack: 'isFullStackCert',
|
||||
relationalDatabasesV8: 'isRelationalDatabasesCertV8'
|
||||
};
|
||||
|
||||
const certIds = {
|
||||
@ -31,7 +32,8 @@ const certIds = {
|
||||
infosecV7Id: '5e6021435ac9d0ecd8b94b00',
|
||||
sciCompPyV7Id: '5e44431b903586ffb414c951',
|
||||
dataAnalysisPyV7Id: '5e46fc95ac417301a38fb934',
|
||||
machineLearningPyV7Id: '5e46fc95ac417301a38fb935'
|
||||
machineLearningPyV7Id: '5e46fc95ac417301a38fb935',
|
||||
relationalDatabasesV8Id: '606243f50267e718b1e755f4'
|
||||
};
|
||||
|
||||
const completionHours = {
|
||||
@ -49,7 +51,8 @@ const completionHours = {
|
||||
[certTypes.infosecV7]: 300,
|
||||
[certTypes.sciCompPyV7]: 300,
|
||||
[certTypes.dataAnalysisPyV7]: 300,
|
||||
[certTypes.machineLearningPyV7]: 300
|
||||
[certTypes.machineLearningPyV7]: 300,
|
||||
[certTypes.relationalDatabasesV8]: 300
|
||||
};
|
||||
|
||||
const certSlugTypeMap = {
|
||||
@ -72,7 +75,8 @@ const certSlugTypeMap = {
|
||||
'information-security-v7': certTypes.infosecV7,
|
||||
'scientific-computing-with-python-v7': certTypes.sciCompPyV7,
|
||||
'data-analysis-with-python-v7': certTypes.dataAnalysisPyV7,
|
||||
'machine-learning-with-python-v7': certTypes.machineLearningPyV7
|
||||
'machine-learning-with-python-v7': certTypes.machineLearningPyV7,
|
||||
'relational-databases-v8': certTypes.relationalDatabasesV8
|
||||
};
|
||||
|
||||
const superBlockCertTypeMap = {
|
||||
@ -93,7 +97,8 @@ const superBlockCertTypeMap = {
|
||||
'information-security': certTypes.infosecV7,
|
||||
'scientific-computing-with-python': certTypes.sciCompPyV7,
|
||||
'data-analysis-with-python': certTypes.dataAnalysisPyV7,
|
||||
'machine-learning-with-python': certTypes.machineLearningPyV7
|
||||
'machine-learning-with-python': certTypes.machineLearningPyV7,
|
||||
'relational-databases': certTypes.relationalDatabasesV8
|
||||
};
|
||||
|
||||
const certTypeIdMap = {
|
||||
@ -111,7 +116,8 @@ const certTypeIdMap = {
|
||||
[certTypes.infosecV7]: certIds.infosecV7Id,
|
||||
[certTypes.sciCompPyV7]: certIds.sciCompPyV7Id,
|
||||
[certTypes.dataAnalysisPyV7]: certIds.dataAnalysisPyV7Id,
|
||||
[certTypes.machineLearningPyV7]: certIds.machineLearningPyV7Id
|
||||
[certTypes.machineLearningPyV7]: certIds.machineLearningPyV7Id,
|
||||
[certTypes.relationalDatabasesV8]: certIds.relationalDatabasesV8Id
|
||||
};
|
||||
|
||||
const certTypeTitleMap = {
|
||||
@ -129,7 +135,8 @@ const certTypeTitleMap = {
|
||||
[certTypes.infosecV7]: 'Information Security',
|
||||
[certTypes.sciCompPyV7]: 'Scientific Computing with Python',
|
||||
[certTypes.dataAnalysisPyV7]: 'Data Analysis with Python',
|
||||
[certTypes.machineLearningPyV7]: 'Machine Learning with Python'
|
||||
[certTypes.machineLearningPyV7]: 'Machine Learning with Python',
|
||||
[certTypes.relationalDatabasesV8]: 'Relational Databases'
|
||||
};
|
||||
|
||||
exports.oldDataVizId = '561add10cb82ac38a17513b3';
|
||||
|
@ -0,0 +1,71 @@
|
||||
{
|
||||
"name": "Learn Relational Databases",
|
||||
"isUpcomingChange": true,
|
||||
"dashedName": "learn-relational-databases",
|
||||
"order": 2,
|
||||
"time": "",
|
||||
"template": "",
|
||||
"required": [],
|
||||
"superBlock": "relational-databases",
|
||||
"superOrder": 12,
|
||||
"challengeOrder": [
|
||||
[
|
||||
"5ea8adfab628f68d805bfc5e",
|
||||
"Learn Bash by Building a Boilerplate"
|
||||
],
|
||||
[
|
||||
"5f2c289f164c29556da632fd",
|
||||
"Learn Relational Databases by Building a Mario Database"
|
||||
],
|
||||
[
|
||||
"5f1a4ef5d5d6b5ab580fc6ae",
|
||||
"Celestial Bodies Database"
|
||||
],
|
||||
[
|
||||
"5f5904ac738bc2fa9efecf5a",
|
||||
"Learn Bash Scripting by Building Five Programs"
|
||||
],
|
||||
[
|
||||
"602da0c222201c65d2a019f5",
|
||||
"Learn SQL by Building a Student Database"
|
||||
],
|
||||
[
|
||||
"5f9771307d4d22b9d2b75a94",
|
||||
"World Cup Database"
|
||||
],
|
||||
[
|
||||
"602da0de22201c65d2a019f6",
|
||||
"Learn Advanced Bash by Building"
|
||||
],
|
||||
[
|
||||
"5f5b969a05380d2179fe6e18",
|
||||
"Learn Bash and SQL by Building a Bike Rental Shop"
|
||||
],
|
||||
[
|
||||
"5f87ac112ae598023a42df1a",
|
||||
"Salon Appointment Scheduler"
|
||||
],
|
||||
[
|
||||
"5f32db63eb37f7e17323f459",
|
||||
"Learn Nano by Building a Castle"
|
||||
],
|
||||
[
|
||||
"5fa323cdaf6a73463d590659",
|
||||
"Learn Git by Building an SQL Reference Object"
|
||||
],
|
||||
[
|
||||
"602d9ff222201c65d2a019f2",
|
||||
"Periodic Table Database"
|
||||
],
|
||||
[
|
||||
"602da04222201c65d2a019f3",
|
||||
"Learn GitHub by Building a List of Inspirational Quotes"
|
||||
],
|
||||
[
|
||||
"602da04c22201c65d2a019f4",
|
||||
"Final Boss"
|
||||
]
|
||||
],
|
||||
"helpRoom": "HelpBackend",
|
||||
"fileName": "13-relational-databases/learn-relational-databases.json"
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "Relational Databases Certificate",
|
||||
"isUpcomingChange": true,
|
||||
"dashedName": "relational-databases-v8-certificate",
|
||||
"order": 11,
|
||||
"time": "",
|
||||
"template": "",
|
||||
"required": [],
|
||||
"superBlock": "certificates",
|
||||
"superOrder": 12,
|
||||
"challengeOrder": [
|
||||
[
|
||||
"606243f50267e718b1e755f4",
|
||||
"Relational Databases Certificate"
|
||||
]
|
||||
],
|
||||
"isPrivate": true,
|
||||
"fileName": "12-certificates/relational-databases-v8-certificate.json"
|
||||
}
|
||||
|
@ -0,0 +1,15 @@
|
||||
id: 606243f50267e718b1e755f4
|
||||
title: Relational Databases Certificate
|
||||
challengeType: 7
|
||||
isPrivate: true
|
||||
tests:
|
||||
- id: 5f1a4ef5d5d6b5ab580fc6ae
|
||||
title: Celestial Bodies Database
|
||||
- id: 5f9771307d4d22b9d2b75a94
|
||||
title: World Cup Database
|
||||
- id: 5f87ac112ae598023a42df1a
|
||||
title: Salon Appointment Scheduler
|
||||
- id: 602d9ff222201c65d2a019f2
|
||||
title: Periodic Table Database
|
||||
- id: 602da04c22201c65d2a019f4
|
||||
title: Final Boss
|
@ -0,0 +1,19 @@
|
||||
---
|
||||
id: 5f1a4ef5d5d6b5ab580fc6ae
|
||||
title: Celestial Bodies Database
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.celestial-bodies-database
|
||||
dashedName: celestial-bodies-database
|
||||
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,18 @@
|
||||
---
|
||||
id: 602da04c22201c65d2a019f4
|
||||
title: Final Boss
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.final-boss
|
||||
dashedName: final-boss
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,18 @@
|
||||
---
|
||||
id: 602da0de22201c65d2a019f6
|
||||
title: Learn Advanced Bash by Building
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.learn-advanced-bash-by-building
|
||||
dashedName: learn-advanced-bash-by-building
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,17 @@
|
||||
---
|
||||
id: 5f5b969a05380d2179fe6e18
|
||||
title: Learn Bash and SQL by Building a Bike Rental Shop
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.learn-bash-and-sql-by-building-a-bike-rental-shop
|
||||
dashedName: learn-bash-and-sql-by-building-a-bike-rental-shop
|
||||
---
|
||||
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,18 @@
|
||||
---
|
||||
id: 5ea8adfab628f68d805bfc5e
|
||||
title: Learn Bash by Building a Boilerplate
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/freeCodeCamp/.learn-bash-by-building-a-boilerplate
|
||||
dashedName: learn-bash-by-building-a-boilerplate
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,18 @@
|
||||
---
|
||||
id: 5f5904ac738bc2fa9efecf5a
|
||||
title: Learn Bash Scripting by Building Five Programs
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.learn-bash-scripting-by-building-five-programs
|
||||
dashedName: learn-bash-scripting-by-building-five-programs
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,18 @@
|
||||
---
|
||||
id: 5fa323cdaf6a73463d590659
|
||||
title: Learn Git by Building an SQL Reference Object
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.learn-git-by-building-an-sql-reference-object
|
||||
dashedName: learn-git-by-building-an-sql-reference-object
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,18 @@
|
||||
---
|
||||
id: 602da04222201c65d2a019f3
|
||||
title: Learn GitHub by Building a List of Inspirational Quotes
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.learn-github-by-building-a-list-of-inspirational-quotes
|
||||
dashedName: learn-github-by-building-a-list-of-inspirational-quotes
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,18 @@
|
||||
---
|
||||
id: 5f32db63eb37f7e17323f459
|
||||
title: Learn Nano by Building a Castle
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.learn-nano-by-building-a-castle
|
||||
dashedName: learn-nano-by-building-a-castle
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,18 @@
|
||||
---
|
||||
id: 5f2c289f164c29556da632fd
|
||||
title: Learn Relational Databases by Building a Mario Database
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.learn-relational-databases-by-building-a-mario-database
|
||||
dashedName: learn-relational-databases-by-building-a-mario-database
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,18 @@
|
||||
---
|
||||
id: 602da0c222201c65d2a019f5
|
||||
title: Learn SQL by Building a Student Database
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.learn-sql-by-building-a-student-database
|
||||
dashedName: learn-sql-by-building-a-student-database
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,18 @@
|
||||
---
|
||||
id: 602d9ff222201c65d2a019f2
|
||||
title: Periodic Table Database
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.periodic-table-database
|
||||
dashedName: periodic-table-database
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,18 @@
|
||||
---
|
||||
id: 5f87ac112ae598023a42df1a
|
||||
title: Salon Appointment Scheduler
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.salon-appointment-scheduler
|
||||
dashedName: salon-appointment-scheduler
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -0,0 +1,18 @@
|
||||
---
|
||||
id: 5f9771307d4d22b9d2b75a94
|
||||
title: World Cup Database
|
||||
challengeType: 12
|
||||
helpCategory: Relational Databases
|
||||
url: https://github.com/moT01/.world-cup-database
|
||||
dashedName: world-cup-database
|
||||
---
|
||||
|
||||
# --description--
|
||||
|
||||
# --instructions--
|
||||
|
||||
# --hints--
|
||||
|
||||
# --seed--
|
||||
|
||||
# --solutions--
|
@ -26,14 +26,14 @@ const schema = Joi.object()
|
||||
blockId: Joi.objectId(),
|
||||
challengeOrder: Joi.number(),
|
||||
removeComments: Joi.bool(),
|
||||
challengeType: Joi.number().min(0).max(11).required(),
|
||||
challengeType: Joi.number().min(0).max(12).required(),
|
||||
checksum: Joi.number(),
|
||||
// __commentCounts is only used to test the comment replacement
|
||||
__commentCounts: Joi.object(),
|
||||
// TODO: require this only for normal challenges, not certs
|
||||
dashedName: Joi.string().regex(slugRE),
|
||||
description: Joi.when('challengeType', {
|
||||
is: [challengeTypes.step, challengeTypes.video],
|
||||
is: [challengeTypes.step, challengeTypes.video, challengeTypes.codeally],
|
||||
then: Joi.string().allow(''),
|
||||
otherwise: Joi.string().required()
|
||||
}),
|
||||
@ -44,7 +44,12 @@ const schema = Joi.object()
|
||||
indexjsx: fileJoi
|
||||
}),
|
||||
guideUrl: Joi.string().uri({ scheme: 'https' }),
|
||||
helpCategory: Joi.valid('JavaScript', 'HTML-CSS', 'Python'),
|
||||
helpCategory: Joi.valid(
|
||||
'JavaScript',
|
||||
'HTML-CSS',
|
||||
'Python',
|
||||
'Relational Databases'
|
||||
),
|
||||
videoUrl: Joi.string().allow(''),
|
||||
forumTopicId: Joi.number(),
|
||||
id: Joi.objectId().required(),
|
||||
@ -99,7 +104,11 @@ const schema = Joi.object()
|
||||
template: Joi.string().allow(''),
|
||||
time: Joi.string().allow(''),
|
||||
title: Joi.string().required(),
|
||||
translationPending: Joi.bool().required()
|
||||
translationPending: Joi.bool().required(),
|
||||
url: Joi.when('challengeType', {
|
||||
is: challengeTypes.codeally,
|
||||
then: Joi.string().required()
|
||||
})
|
||||
})
|
||||
.xor('helpCategory', 'isPrivate');
|
||||
|
||||
|
Reference in New Issue
Block a user