export const USERS = {
|
|
1: {
|
|
id: 1,
|
|
email: 'test@angular-university.io',
|
|
password: 'test'
|
|
}
|
|
|
|
};
|
|
|
|
|
|
export const COURSES: any = {
|
|
|
|
4: {
|
|
id: 4,
|
|
description: 'NgRx (with NgRx Data) - The Complete Guide',
|
|
longDescription: 'Learn the modern Ngrx Ecosystem, including NgRx Data, Store, Effects, Router Store, Ngrx Entity, and Dev Tools.',
|
|
iconUrl: 'https://angular-university.s3-us-west-1.amazonaws.com/course-images/ngrx-v2.png',
|
|
category: 'BEGINNER',
|
|
lessonsCount: 10,
|
|
seqNo: 0,
|
|
url: 'ngrx-course'
|
|
},
|
|
|
|
2: {
|
|
id: 2,
|
|
description: 'Angular Core Deep Dive',
|
|
longDescription: 'A detailed walk-through of the most important part of Angular - the Core and Common modules',
|
|
iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/angular-core-in-depth-small.png',
|
|
lessonsCount: 10,
|
|
category: 'BEGINNER',
|
|
seqNo: 1,
|
|
url: 'angular-core-course'
|
|
},
|
|
|
|
3: {
|
|
id: 3,
|
|
description: 'RxJs In Practice Course',
|
|
longDescription: 'Understand the RxJs Observable pattern, learn the RxJs Operators via practical examples',
|
|
iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/rxjs-in-practice-course.png',
|
|
category: 'BEGINNER',
|
|
lessonsCount: 10,
|
|
seqNo: 2,
|
|
url: 'rxjs-course'
|
|
},
|
|
|
|
1: {
|
|
id: 1,
|
|
description: 'Serverless Angular with Firebase Course',
|
|
longDescription: 'Serveless Angular with Firestore, Firebase Storage & Hosting, Firebase Cloud Functions & AngularFire',
|
|
iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/serverless-angular-small.png',
|
|
lessonsCount: 10,
|
|
category: 'BEGINNER',
|
|
seqNo: 4,
|
|
url: 'serverless-angular'
|
|
},
|
|
|
|
/*
|
|
|
|
|
|
5: {
|
|
id: 5,
|
|
description: 'Angular for Beginners',
|
|
longDescription: "Establish a solid layer of fundamentals, learn what's under the hood of Angular",
|
|
iconUrl: 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-for-beginners-small-v2.png',
|
|
category: 'BEGINNER',
|
|
lessonsCount: 10,
|
|
seqNo: 5,
|
|
url: 'angular-for-beginners'
|
|
},
|
|
|
|
*/
|
|
|
|
12: {
|
|
id: 12,
|
|
description: 'Angular Testing Course',
|
|
longDescription: 'In-depth guide to Unit Testing and E2E Testing of Angular Applications',
|
|
iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/angular-testing-small.png',
|
|
category: 'BEGINNER',
|
|
seqNo: 6,
|
|
url: 'angular-testing-course',
|
|
lessonsCount: 10,
|
|
},
|
|
|
|
6: {
|
|
id: 6,
|
|
description: 'Angular Security Course - Web Security Fundamentals',
|
|
longDescription: 'Learn Web Security Fundamentals and apply them to defend an Angular / Node Application from multiple types of attacks.',
|
|
iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/security-cover-small-v2.png',
|
|
category: 'ADVANCED',
|
|
lessonsCount: 11,
|
|
seqNo: 7,
|
|
url: 'angular-security-course'
|
|
},
|
|
|
|
7: {
|
|
id: 7,
|
|
description: 'Angular PWA - Progressive Web Apps Course',
|
|
longDescription: 'Learn Angular Progressive Web Applications, build the future of the Web Today.',
|
|
iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/angular-pwa-course.png',
|
|
category: 'ADVANCED',
|
|
lessonsCount: 8,
|
|
seqNo: 8,
|
|
url: 'angular-pwa-course'
|
|
},
|
|
|
|
8: {
|
|
id: 8,
|
|
description: 'Angular Advanced Library Laboratory: Build Your Own Library',
|
|
longDescription: 'Learn Advanced Angular functionality typically used in Library Development. Advanced Components, Directives, Testing, Npm',
|
|
iconUrl: 'https://angular-academy.s3.amazonaws.com/thumbnails/advanced_angular-small-v3.png',
|
|
category: 'ADVANCED',
|
|
seqNo: 9,
|
|
url: 'angular-advanced-course'
|
|
},
|
|
|
|
9: {
|
|
id: 9,
|
|
description: 'The Complete Typescript Course',
|
|
longDescription: 'Complete Guide to Typescript From Scratch: Learn the language in-depth and use it to build a Node REST API.',
|
|
iconUrl: 'https://angular-academy.s3.amazonaws.com/thumbnails/typescript-2-small.png',
|
|
category: 'BEGINNER',
|
|
seqNo: 10,
|
|
url: 'typescript-course'
|
|
},
|
|
|
|
10: {
|
|
id: 10,
|
|
description: 'Rxjs and Reactive Patterns Angular Architecture Course',
|
|
longDescription: 'Learn the core RxJs Observable Pattern as well and many other Design Patterns for building Reactive Angular Applications.',
|
|
iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-academy/blog/images/rxjs-reactive-patterns-small.png',
|
|
category: 'BEGINNER',
|
|
seqNo: 11,
|
|
url: 'rxjs-patterns-course'
|
|
},
|
|
|
|
11: {
|
|
id: 11,
|
|
description: 'Angular Material Course',
|
|
longDescription: 'Build Applications with the official Angular Widget Library',
|
|
iconUrl: 'https://s3-us-west-1.amazonaws.com/angular-university/course-images/material_design.png',
|
|
category: 'BEGINNER',
|
|
seqNo: 12,
|
|
url: 'angular-material-course'
|
|
}
|
|
|
|
};
|
|
|
|
|
|
export const LESSONS = {
|
|
|
|
1: {
|
|
id: 1,
|
|
'description': 'Angular Tutorial For Beginners - Build Your First App - Hello World Step By Step',
|
|
'duration': '4:17',
|
|
'seqNo': 1,
|
|
courseId: 5
|
|
},
|
|
2: {
|
|
id: 2,
|
|
'description': 'Building Your First Component - Component Composition',
|
|
'duration': '2:07',
|
|
'seqNo': 2,
|
|
courseId: 5
|
|
},
|
|
3: {
|
|
id: 3,
|
|
'description': 'Component @Input - How To Pass Input Data To an Component',
|
|
'duration': '2:33',
|
|
'seqNo': 3,
|
|
courseId: 5
|
|
},
|
|
4: {
|
|
id: 4,
|
|
'description': ' Component Events - Using @Output to create custom events',
|
|
'duration': '4:44',
|
|
'seqNo': 4,
|
|
courseId: 5
|
|
},
|
|
5: {
|
|
id: 5,
|
|
'description': ' Component Templates - Inline Vs External',
|
|
'duration': '2:55',
|
|
'seqNo': 5,
|
|
courseId: 5
|
|
},
|
|
6: {
|
|
id: 6,
|
|
'description': 'Styling Components - Learn About Component Style Isolation',
|
|
'duration': '3:27',
|
|
'seqNo': 6,
|
|
courseId: 5
|
|
},
|
|
7: {
|
|
id: 7,
|
|
'description': ' Component Interaction - Extended Components Example',
|
|
'duration': '9:22',
|
|
'seqNo': 7,
|
|
courseId: 5
|
|
},
|
|
8: {
|
|
id: 8,
|
|
'description': ' Components Tutorial For Beginners - Components Exercise !',
|
|
'duration': '1:26',
|
|
'seqNo': 8,
|
|
courseId: 5
|
|
},
|
|
9: {
|
|
id: 9,
|
|
'description': ' Components Tutorial For Beginners - Components Exercise Solution Inside',
|
|
'duration': '2:08',
|
|
'seqNo': 9,
|
|
courseId: 5
|
|
},
|
|
10: {
|
|
id: 10,
|
|
'description': ' Directives - Inputs, Output Event Emitters and How To Export Template References',
|
|
'duration': '4:01',
|
|
'seqNo': 10,
|
|
courseId: 5
|
|
},
|
|
|
|
|
|
// Security Course
|
|
11: {
|
|
id: 11,
|
|
'description': 'Course Helicopter View',
|
|
'duration': '08:19',
|
|
'seqNo': 1,
|
|
courseId: 6
|
|
},
|
|
|
|
12: {
|
|
id: 12,
|
|
'description': 'Installing Git, Node, NPM and Choosing an IDE',
|
|
'duration': '04:17',
|
|
'seqNo': 2,
|
|
courseId: 6
|
|
},
|
|
|
|
13: {
|
|
id: 13,
|
|
'description': 'Installing The Lessons Code - Learn Why Its Essential To Use NPM 5',
|
|
'duration': '06:05',
|
|
'seqNo': 3,
|
|
courseId: 6
|
|
},
|
|
|
|
14: {
|
|
id: 14,
|
|
'description': 'How To Run Node In TypeScript With Hot Reloading',
|
|
'duration': '03:57',
|
|
'seqNo': 4,
|
|
courseId: 6
|
|
},
|
|
|
|
15: {
|
|
id: 15,
|
|
'description': 'Guided Tour Of The Sample Application',
|
|
'duration': '06:00',
|
|
'seqNo': 5,
|
|
courseId: 6
|
|
},
|
|
16: {
|
|
id: 16,
|
|
'description': 'Client Side Authentication Service - API Design',
|
|
'duration': '04:53',
|
|
'seqNo': 6,
|
|
courseId: 6
|
|
},
|
|
17: {
|
|
id: 17,
|
|
'description': 'Client Authentication Service - Design and Implementation',
|
|
'duration': '09:14',
|
|
'seqNo': 7,
|
|
courseId: 6
|
|
},
|
|
18: {
|
|
id: 18,
|
|
'description': 'The New Angular HTTP Client - Doing a POST Call To The Server',
|
|
'duration': '06:08',
|
|
'seqNo': 8,
|
|
courseId: 6
|
|
},
|
|
19: {
|
|
id: 19,
|
|
'description': 'User Sign Up Server-Side Implementation in Express',
|
|
'duration': '08:50',
|
|
'seqNo': 9,
|
|
courseId: 6
|
|
},
|
|
20: {
|
|
id: 20,
|
|
'description': 'Introduction To Cryptographic Hashes - A Running Demo',
|
|
'duration': '05:46',
|
|
'seqNo': 10,
|
|
courseId: 6
|
|
},
|
|
21: {
|
|
id: 21,
|
|
'description': 'Some Interesting Properties Of Hashing Functions - Validating Passwords',
|
|
'duration': '06:31',
|
|
'seqNo': 11,
|
|
courseId: 6
|
|
},
|
|
|
|
|
|
// PWA course
|
|
|
|
22: {
|
|
id: 22,
|
|
'description': 'Course Kick-Off - Install Node, NPM, IDE And Service Workers Section Code',
|
|
'duration': '07:19',
|
|
'seqNo': 1,
|
|
courseId: 7
|
|
},
|
|
23: {
|
|
id: 23,
|
|
'description': 'Service Workers In a Nutshell - Service Worker Registration',
|
|
'duration': '6:59',
|
|
'seqNo': 2,
|
|
courseId: 7
|
|
},
|
|
24: {
|
|
id: 24,
|
|
'description': 'Service Workers Hello World - Lifecycle Part 1 and PWA Chrome Dev Tools',
|
|
'duration': '7:28',
|
|
'seqNo': 3,
|
|
courseId: 7
|
|
},
|
|
25: {
|
|
id: 25,
|
|
'description': 'Service Workers and Application Versioning - Install & Activate Lifecycle Phases',
|
|
'duration': '10:17',
|
|
'seqNo': 4,
|
|
courseId: 7
|
|
},
|
|
|
|
26: {
|
|
id: 26,
|
|
'description': 'Downloading The Offline Page - The Service Worker Installation Phase',
|
|
'duration': '09:50',
|
|
'seqNo': 5,
|
|
courseId: 7
|
|
},
|
|
27: {
|
|
id: 27,
|
|
'description': 'Introduction to the Cache Storage PWA API',
|
|
'duration': '04:44',
|
|
'seqNo': 6,
|
|
courseId: 7
|
|
},
|
|
28: {
|
|
id: 28,
|
|
'description': 'View Service Workers HTTP Interception Features In Action',
|
|
'duration': '06:07',
|
|
'seqNo': 7,
|
|
courseId: 7
|
|
},
|
|
29: {
|
|
id: 29,
|
|
'description': 'Service Workers Error Handling - Serving The Offline Page',
|
|
'duration': '5:38',
|
|
'seqNo': 8,
|
|
courseId: 7
|
|
},
|
|
|
|
// Serverless Angular with Firebase Course
|
|
|
|
30: {
|
|
id: 30,
|
|
description: 'Development Environment Setup',
|
|
'duration': '5:38',
|
|
'seqNo': 1,
|
|
courseId: 1
|
|
},
|
|
|
|
31: {
|
|
id: 31,
|
|
description: 'Introduction to the Firebase Ecosystem',
|
|
'duration': '5:12',
|
|
'seqNo': 2,
|
|
courseId: 1
|
|
},
|
|
|
|
32: {
|
|
id: 32,
|
|
description: 'Importing Data into Firestore',
|
|
'duration': '4:07',
|
|
'seqNo': 3,
|
|
courseId: 1
|
|
},
|
|
|
|
33: {
|
|
id: 33,
|
|
description: 'Firestore Documents in Detail',
|
|
'duration': '7:32',
|
|
'seqNo': 4,
|
|
courseId: 1
|
|
},
|
|
|
|
34: {
|
|
id: 34,
|
|
description: 'Firestore Collections in Detail',
|
|
'duration': '6:28',
|
|
'seqNo': 5,
|
|
courseId: 1
|
|
},
|
|
|
|
35: {
|
|
id: 35,
|
|
description: 'Firestore Unique Identifiers',
|
|
'duration': '4:38',
|
|
'seqNo': 6,
|
|
courseId: 1
|
|
},
|
|
|
|
36: {
|
|
id: 36,
|
|
description: 'Querying Firestore Collections',
|
|
'duration': '7:54',
|
|
'seqNo': 7,
|
|
courseId: 1
|
|
},
|
|
|
|
37: {
|
|
id: 37,
|
|
description: 'Firebase Security Rules In Detail',
|
|
'duration': '5:31',
|
|
'seqNo': 8,
|
|
courseId: 1
|
|
},
|
|
|
|
38: {
|
|
id: 38,
|
|
description: 'Firebase Cloud Functions In Detail',
|
|
'duration': '8:19',
|
|
'seqNo': 9,
|
|
courseId: 1
|
|
},
|
|
|
|
39: {
|
|
id: 39,
|
|
description: 'Firebase Storage In Detail',
|
|
'duration': '7:05',
|
|
'seqNo': 10,
|
|
courseId: 1
|
|
},
|
|
|
|
|
|
// Angular Testing Course
|
|
|
|
40: {
|
|
id: 40,
|
|
description: 'Angular Testing Course - Helicopter View',
|
|
'duration': '5:38',
|
|
'seqNo': 1,
|
|
courseId: 12
|
|
},
|
|
|
|
41: {
|
|
id: 41,
|
|
description: 'Setting Up the Development Environment',
|
|
'duration': '5:12',
|
|
'seqNo': 2,
|
|
courseId: 12
|
|
},
|
|
|
|
42: {
|
|
id: 42,
|
|
description: 'Introduction to Jasmine, Spies and specs',
|
|
'duration': '4:07',
|
|
'seqNo': 3,
|
|
courseId: 12
|
|
},
|
|
|
|
43: {
|
|
id: 43,
|
|
description: 'Introduction to Service Testing',
|
|
'duration': '7:32',
|
|
'seqNo': 4,
|
|
courseId: 12
|
|
},
|
|
|
|
44: {
|
|
id: 44,
|
|
description: 'Settting up the Angular TestBed',
|
|
'duration': '6:28',
|
|
'seqNo': 5,
|
|
courseId: 12
|
|
},
|
|
|
|
45: {
|
|
id: 45,
|
|
description: 'Mocking Angular HTTP requests',
|
|
'duration': '4:38',
|
|
'seqNo': 6,
|
|
courseId: 12
|
|
},
|
|
|
|
46: {
|
|
id: 46,
|
|
description: 'Simulating Failing HTTP Requests',
|
|
'duration': '7:54',
|
|
'seqNo': 7,
|
|
courseId: 12
|
|
},
|
|
|
|
47: {
|
|
id: 47,
|
|
description: 'Introduction to Angular Component Testing',
|
|
'duration': '5:31',
|
|
'seqNo': 8,
|
|
courseId: 12
|
|
},
|
|
|
|
48: {
|
|
id: 48,
|
|
description: 'Testing Angular Components without the DOM',
|
|
'duration': '8:19',
|
|
'seqNo': 9,
|
|
courseId: 12
|
|
},
|
|
|
|
49: {
|
|
id: 49,
|
|
description: 'Testing Angular Components with the DOM',
|
|
'duration': '7:05',
|
|
'seqNo': 10,
|
|
courseId: 12
|
|
},
|
|
|
|
|
|
// Ngrx Course
|
|
50: {
|
|
id: 50,
|
|
"description": "Welcome to the Angular Ngrx Course",
|
|
"duration": "6:53",
|
|
"seqNo": 1,
|
|
courseId: 4
|
|
|
|
},
|
|
51: {
|
|
id: 51,
|
|
"description": "The Angular Ngrx Architecture Course - Helicopter View",
|
|
"duration": "5:52",
|
|
"seqNo": 2,
|
|
courseId: 4
|
|
},
|
|
52: {
|
|
id: 52,
|
|
"description": "The Origins of Flux - Understanding the Famous Facebook Bug Problem",
|
|
"duration": "8:17",
|
|
"seqNo": 3,
|
|
courseId: 4
|
|
},
|
|
53: {
|
|
id: 53,
|
|
"description": "Custom Global Events - Why Don't They Scale In Complexity?",
|
|
"duration": "7:47",
|
|
"seqNo": 4,
|
|
courseId: 4
|
|
},
|
|
54: {
|
|
id: 54,
|
|
"description": "The Flux Architecture - How Does it Solve Facebook Counter Problem?",
|
|
"duration": "9:22",
|
|
"seqNo": 5,
|
|
courseId: 4
|
|
},
|
|
55: {
|
|
id: 55,
|
|
"description": "Unidirectional Data Flow And The Angular Development Mode",
|
|
"duration": "7:07",
|
|
"seqNo": 6,
|
|
courseId: 4
|
|
},
|
|
|
|
56: {
|
|
id: 56,
|
|
"description": "Dispatching an Action - Implementing the Login Component",
|
|
"duration": "4:39",
|
|
"seqNo": 7,
|
|
courseId: 4
|
|
},
|
|
57: {
|
|
id: 57,
|
|
"description": "Setting Up the Ngrx DevTools - Demo",
|
|
"duration": "4:44",
|
|
"seqNo": 8,
|
|
courseId: 4
|
|
},
|
|
58: {
|
|
id: 58,
|
|
"description": "Understanding Reducers - Writing Our First Reducer",
|
|
"duration": "9:10",
|
|
"seqNo": 9,
|
|
courseId: 4
|
|
},
|
|
59: {
|
|
id: 59,
|
|
"description": "How To Define the Store Initial AppState",
|
|
"duration": "9:10",
|
|
"seqNo": 10,
|
|
courseId: 4
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
export function findCourseById(courseId: number) {
|
|
return COURSES[courseId];
|
|
}
|
|
|
|
export function findLessonsForCourse(courseId: number) {
|
|
return Object.values(LESSONS).filter(lesson => lesson.courseId == courseId);
|
|
}
|
|
|
|
|
|
export function authenticate(email: string, password: string) {
|
|
|
|
const user: any = Object.values(USERS).find(user => user.email === email);
|
|
|
|
if (user && user.password == password) {
|
|
return user;
|
|
} else {
|
|
return undefined;
|
|
}
|
|
|
|
}
|