From 4dcbcd62d488130f9d46e33da2260947fcc536dd Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 10:38:14 +0200
Subject: [PATCH 01/49] ongoing REST API

---
 hello-world.ts | 11 +++++++++--
 tsconfig.json  |  8 ++++++++
 2 files changed, 17 insertions(+), 2 deletions(-)
 create mode 100644 tsconfig.json

diff --git a/hello-world.ts b/hello-world.ts
index f172064..17a7b61 100644
--- a/hello-world.ts
+++ b/hello-world.ts
@@ -1,6 +1,13 @@
 
-var message = 'Hello World';
 
 
-console.log(message);
+
+var user;
+
+
+user.name = 'Vasco';
+
+
+
+
 
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..4e55206
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,8 @@
+{
+    "compilerOptions": {
+        "module": "commonjs",
+        "target": "es5",
+        "noImplicitAny": true,
+        "sourceMap": false
+    }
+}
\ No newline at end of file

From 645b8fc962e3e8afe2f44f9edae7a7e53ef96f75 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 11:04:53 +0200
Subject: [PATCH 02/49] ongoing REST API

---
 .gitignore                        |  1 +
 db-schema-create-and-populate.sql | 59 +++++++++++++++++++++++++++++++
 db-schema-drop.sql                |  6 ++++
 tsconfig.json                     |  9 +++--
 4 files changed, 73 insertions(+), 2 deletions(-)
 create mode 100644 db-schema-create-and-populate.sql
 create mode 100644 db-schema-drop.sql

diff --git a/.gitignore b/.gitignore
index 05d5560..8b5f11a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -11,5 +11,6 @@ tmp
 perf-logs
 v8.log
 *.js
+*.js.map
 
 
diff --git a/db-schema-create-and-populate.sql b/db-schema-create-and-populate.sql
new file mode 100644
index 0000000..9da15cd
--- /dev/null
+++ b/db-schema-create-and-populate.sql
@@ -0,0 +1,59 @@
+
+-- Database: "complete-typescript-course"
+
+
+-- DROP TABLE "Courses";
+
+CREATE TABLE "Courses"
+(
+  id serial NOT NULL,
+  url character varying(255),
+  description character varying(255) NOT NULL,
+  "longDescription" text NOT NULL,
+  "seqNo" integer NOT NULL,
+  "iconUrl" character varying(255) NOT NULL,
+  "comingSoon" boolean NOT NULL DEFAULT false,
+  "isNew" boolean NOT NULL DEFAULT false,
+  "isOngoing" boolean NOT NULL DEFAULT false,
+  "visibleFrom" timestamp with time zone NOT NULL DEFAULT '1970-02-01 00:00:00+01'::timestamp with time zone,
+  "createdAt" timestamp with time zone NOT NULL,
+  "updatedAt" timestamp with time zone NOT NULL,
+  "courseListIcon" character varying(255),
+  CONSTRAINT "Courses_pkey" PRIMARY KEY (id)
+);
+
+
+-- Table: "Lessons"
+
+CREATE TABLE "Lessons"
+(
+  id serial NOT NULL,
+  url character varying(255),
+  description character varying(255) NOT NULL,
+  duration character varying(255) NOT NULL,
+  "seqNo" integer NOT NULL,
+  "courseId" integer,
+  pro boolean DEFAULT false,
+  "videoId" character varying(255),
+  "gitHubUrl" character varying(255) NOT NULL,
+  "downloadUrl" character varying(255) NOT NULL,
+  tags character varying(255) DEFAULT ''::character varying,
+  "createdAt" timestamp with time zone NOT NULL,
+  "updatedAt" timestamp with time zone NOT NULL,
+  vimeoid character varying(50),
+  CONSTRAINT "Lessons_pkey" PRIMARY KEY (id),
+  CONSTRAINT "Lessons_courseId_fkey" FOREIGN KEY ("courseId")
+      REFERENCES "Courses" (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION
+);
+
+-- Index: "sortByUrl"
+
+-- DROP INDEX "sortByUrl";
+
+CREATE UNIQUE INDEX "sortByUrl"
+  ON "Lessons"
+  USING btree
+  (url COLLATE pg_catalog."default");
+
+
diff --git a/db-schema-drop.sql b/db-schema-drop.sql
new file mode 100644
index 0000000..1c57978
--- /dev/null
+++ b/db-schema-drop.sql
@@ -0,0 +1,6 @@
+
+DROP TABLE "Lessons";
+
+DROP TABLE "Courses";
+
+DROP DATABASE "complete-typescript-course";
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index 4e55206..d8edcff 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -3,6 +3,11 @@
         "module": "commonjs",
         "target": "es5",
         "noImplicitAny": true,
-        "sourceMap": false
-    }
+        "skipLibCheck":true,
+        "strictNullChecks": true,
+        "sourceMap": true
+    },
+  "files": [
+    "hello-world.ts"
+  ]
 }
\ No newline at end of file

From 526470d5ba2b57a4473c5399de7d747a382475b0 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 11:16:12 +0200
Subject: [PATCH 03/49] ongoing REST API

---
 db-schema-create-and-populate.sql | 183 ++++++++++++++++++++++++++++++
 1 file changed, 183 insertions(+)

diff --git a/db-schema-create-and-populate.sql b/db-schema-create-and-populate.sql
index 9da15cd..4e8460d 100644
--- a/db-schema-create-and-populate.sql
+++ b/db-schema-create-and-populate.sql
@@ -57,3 +57,186 @@ CREATE UNIQUE INDEX "sortByUrl"
   (url COLLATE pg_catalog."default");
 
 
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (3, 'angular2-pipes', 'Angular 2 Pipes', '<p class=''course-description''>Learn how to leverage Pipes in Angular 2, both stateless and stateful.</p>', 3, 'https://angular-academy.s3.amazonaws.com/course-logos/pipes.jpg', true, false, true, '2100-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-06-10 21:54:55.142+02', NULL);
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (2, 'angular2-components-and-directives', 'Angular 2 Components and Directives', '<p class=''course-description''>Learn Components and maybe the most useful feature of Angular 2: Directives.</p>', 2, 'https://angular-academy.s3.amazonaws.com/course-logos/components-and-directives.svg', true, false, true, '2100-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-06-10 21:54:55.16+02', NULL);
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (5, 'build-an-application-with-angular2', 'Build a Web App with Angular 2 and Firebase', '<p class=''course-description''>Put all the concepts together to build a fully running Angular 2 application using Firebase as the database.</p>', 4, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular_app-firebase-small.jpg', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.671+02', 'https://angular-academy.s3.amazonaws.com/thumbnails/firebase-logo.jpg');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (10, 'angular2-rxjs-observable-data-services', 'RxJs Observable Data Services', '<p class=''course-description''>Use RxJs to build service layers using the Observable Data Service Pattern.</p>', 8, 'https://angular-academy.s3.amazonaws.com/thumbnails/observable-data-services.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.697+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (7, 'angular2-routing', 'Angular 2 Router', '<p class=''course-description''>Build Single Page Applications with Angular 2 and its powerful Router.</p>', 3, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-routing-small.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.698+02', '/src/images/router-icon.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (8, 'module-loaders-and-systemjs', 'Module Loaders and Webpack 2', '<p class=''course-description''>Learn how Module Loaders Work - Learn Webpack 2 and its Plugin Ecosystem.</p>', 7, 'https://angular-academy.s3.amazonaws.com/thumbnails/webpack-small.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.699+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (11, 'angular2-ngrx', 'NgRx Angular 2 Reactive Extensions', '<p class=''course-description''>Learn some of the most useful libraries in the Angular 2 Ecosystem.</p>', 9, 'https://angular-academy.s3.amazonaws.com/thumbnails/ngrx.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.715+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (12, 'angular2-universal', 'Angular 2 Universal', '<p class=''course-description''>Learn maybe the biggest game changing technology in the Angular 2 Ecosystem.</p>', 10, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular_universal.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.736+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (4, 'angular2-forms', 'Angular 2 Forms', '<p class=''course-description''>Learn how to build validatable and user-friendly data Forms effectively.</p>', 3, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular-forms-small.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.611+02', 'https://angular-academy.s3.amazonaws.com/course-logos/lesson-icons/forms.jpg');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (9, 'angular2-http', 'Angular 2 HTTP and Services', '<p class=''course-description''>Build Services using Observables, learn to use the HTTP module effectively.</p>', 1, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular-http.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.632+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (13, 'angular2-progressive-web-applications', 'Angular 2 Progressive Web Apps', '<p class=''course-description''>Learn the Future of Mobile development: Progressive Web Applications.</p>', 11, 'https://angular-academy.s3.amazonaws.com/thumbnails/pwa.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.75+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (6, 'angular2-advanced-components', 'Angular 2 Advanced Components', '<p class=''course-description''>A deep dive on Components, focusing on commonly needed advanced use cases.</p>', 5, 'https://angular-academy.s3.amazonaws.com/thumbnails/advanced-components.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.63+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (1, 'getting-started-with-angular2', 'Angular 2 Tutorial For Beginners', '<p class=''course-description''>Establish a solid layer of fundamentals, learn what''s under the hood of Angular 2</p>', 0, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-for-beginners-small.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.606+02', 'https://angular-academy.s3.amazonaws.com/main-logo/main-page-logo-small-hat.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (14, 'angular2-architecture', 'Angular 2 Architecture', '<p class=''course-description''>Learn how to build next-generation (Post-REST ?) user interfaces in Angular 2.</p>', 12, 'https://angular-academy.s3.amazonaws.com/thumbnails/architecture.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-08-16 15:55:24.236181+02', '2016-10-07 21:16:20.75+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (15, 'angular2-security', 'Angular 2 Security', '<p class=''course-description''>Learn how to build secure Angular 2 Applications Using JSON Web Tokens.</p>', 13, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-security.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-08-16 15:59:06.727615+02', '2016-10-07 21:16:20.751+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+
+
+
+
+
+
+
+
+
+
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (17, 'angular2-component-events', 'Angular 2 Event Handling', '4:44', 3, 1, false, 'cz2k4v9ru9', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:29.967+02', '2016-10-07 21:16:21.458+02', '184142889');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (74, 'angular2-template-driven-forms-ngmodel', 'Angular 2 Template Driven Forms   - NgModel is Not Only For Two-Way Data Binding', '4:59', 0, 4, false, 'qepcman198', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:17:36.888+02', '2016-10-07 21:16:24.725+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (182, 'angular2-firebase-logout', 'Setup the Logout Functionality', '1:42', 51, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.385+02', '2016-10-07 21:16:33.618+02', '185645254');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (92, 'angular2-router-initial-setup', 'Angular 2 Router Setup - Avoid A Pitfall Right From The Start, Setup Router Debugging', '5:33', 1, 7, false, '7yelea6od7', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:06.18+02', '2016-10-07 21:16:34.147+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (19, 'angular2-components-styling-component-isolation', 'Styling Angular 2 Components - Learn About Component Style Isolation', '3:27', 5, 1, true, 'k015b52000', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:30.014+02', '2016-10-07 21:16:21.463+02', '184142895');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (101, 'angular2-router-avoid-memory-leaks', 'Exiting an Angular 2 Route - How To Prevent Memory Leaks', '4:48', 9, 7, true, 'eq79s94k7e', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.305+02', '2016-10-07 21:16:35.13+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (105, 'angular2-router-auxiliary-route-parameters', 'Angular 2 Auxiliary Routes - How To Pass Router Parameters', '2:55', 13, 7, true, '2reddha2qe', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.858+02', '2016-10-07 21:16:35.504+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (168, 'angular2-firebase-choose-ide', 'Choosing an IDE', '1:50', -1, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:29.569+02', '2016-10-06 17:06:57.988+02', '185502826');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (108, 'angular2-router-exercise-build-a-dashboard', 'Exercise - Implement a Widget Dashboard With Multiple Auxiliary Routes', '2:50', 18, 7, true, 'lqmnh3aec3', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:08.387+02', '2016-10-07 21:16:36.018+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (20, 'angular2-components-component-interaction', 'Angular 2 Component Interaction - Extended Components Example', '9:22', 6, 1, true, '4vxtb8n8om', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:30.015+02', '2016-10-07 21:16:21.463+02', '184142892');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (116, 'angular2-firebase-cli-hello-world', 'Angular 2 Final Application Scaffolding using the Angular CLI', '2:58', 0, 5, true, 'kje3e5vy3m', 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:16:17.567+02', '2016-10-07 21:16:28.407+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (119, 'angular2-firebase-references-and-snapshots', 'Firebase Fundamentals  - References,  Snapshots and Keys', '3:24', 3, 5, false, 'sedl4g5c4b', 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:16:17.569+02', '2016-10-07 21:16:28.813+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (112, 'angular2-lazy-loading-shared-modules', 'Angular 2 Router Lazy Loading and Shared Modules - How to Lazy-Load a Module', '8:43', 16, 7, false, 'myy3p2x53f', 'https://github.com/angular-university/courses', '', 'ADVANCED', '2016-09-02 16:31:04.247+02', '2016-10-07 21:16:35.722+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (12, 'angular2-setting-up-a-project-using-typescript-systemjs', 'Angular 2 Development Environment - Start Development Using a Beginner Friendly Playground', '10:56', 23, 1, false, '1djl556fwl', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-07-25 20:55:31.536+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (13, 'introduction-to-angular2-running-the-lessons', 'Running the the Lessons Code', '3:00', -2, 1, false, '2mv2gtsbbz', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:20.889+02', '184970245');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (172, 'angular2-firebase-create-form-component', 'Creating the Lesson Form Component - Used both for Edit and for Creation', '6:37', 41, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.333+02', '2016-10-07 21:16:32.567+02', '185821061');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (177, 'angular2-firebase-edit-lesson-show-data-in-edit-form', 'Edit Lesson - Passing the Retrieved Data to the Lesson Form', '3:25', 46, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.856+02', '2016-10-07 21:16:33.09+02', '185629439');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (16, 'angular2-hello-world-write-first-application', 'Angular 2 Tutorial For Beginners - Build Your First App - Hello World Step By Step', '2:49', 0, 1, false, 'do2r7udndo', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:29.945+02', '2016-10-07 21:16:20.898+02', '184142896');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (15, 'angular2-build-your-first-component', 'Building Your First Angular 2 Component - Component Composition', '2:07', 1, 1, false, 'izvg348ckx', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:29.967+02', '2016-10-07 21:16:20.899+02', '184142897');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (18, 'angular2-component-templates-internal-vs-external', 'Angular 2 Component Templates - Inline Vs External', '2:55', 4, 1, true, '8fvvouohu8', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:29.988+02', '2016-10-07 21:16:21.464+02', '184142888');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (11, 'angular2-debugging-with-augury-or-console', 'How To Debug An Angular 2 Application - Debugging via Augury or the Console', '2:59', 22, 1, true, 'ehxvwqujir', 'https://github.com/angular-university/courses', 'http://www/google.com', 'INTERMEDIATE', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.112+02', '184142989');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (187, 'angular2-firebase-rounding-up', 'Rounding Up the Course', '01:01', 56, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.911+02', '2016-10-06 17:27:09.056+02', '185700728');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (50, 'angular2-introduction-to-typescript-the-arrow-operator', 'Introduction To Typescript - The Arrow (=>) Operator', '4:52', 34, 1, true, 'ukndfgobup', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:47:27.989+02', '2016-10-07 21:16:24.189+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (167, 'angular2-firebase-starter-kit', 'Installing the Starter Kit', '2:14', 1, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:29.571+02', '2016-10-07 21:16:28.427+02', '185793640');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (6, 'angular2-core-directives-ngfor', 'Angular 2 Core Directives  - ngFor', '3:46', 11, 1, true, '4plhp3lf3p', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.008+02', '184142919');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (76, 'angular2-ngmodel-bidirectional-binding', 'NgModel - Why Would You Want To Turn Off Two-Way Data Binding ?', '3:44', 1, 4, false, 'asyqh8c5oo', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:14.349+02', '2016-10-07 21:16:24.724+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (24, 'angular2-write-first-injectable-service', 'Angular 2 Services Tutorial - Writing Your First Service - Learn @Injectable', '3:46', 25, 1, true, '5t4wrxs4m0', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-01 22:25:57.621+02', '2016-10-07 21:16:23.632+02', '184142963');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (46, 'angular2-introduction-to-directives-write-a-custom-directive', 'Angular 2 Directives Tutorial - Write Your First Custom Directive', '4:31', 9, 1, true, 'wwzbuk564h', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:05:54.065+02', '2016-10-07 21:16:22.009+02', '184142924');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (48, 'angular2-directives-exercise-improve-collapsible-directive', 'Introduction to Angular 2 Directives - Exercise - Improve the Collapsible Directive', '1:30', 15, 1, true, 'k6rp4j98y3', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:05:55.14+02', '2016-10-07 21:16:22.553+02', '184142925');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (3, 'angular2-template-syntax-interpolation', 'Angular 2 Template Syntax - Interpolation', '2:41', 18, 1, true, 'dpfn1w9gd1', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.103+02', '184142935');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (42, 'angular2-http-error-handling', 'Angular 2 Services - HTTP Error Handling', '2:21', 28, 1, true, 'wz873e5qm0', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-03 10:25:37.253+02', '2016-10-07 21:16:23.653+02', '184142969');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (41, 'angular2-http-how-to-do-an-http-post-call', 'Angular 2 Services - Using the HTTP service to do an HTTP POST ', '5:32', 27, 1, true, '42andffp81', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-03 10:25:36.712+02', '2016-10-07 21:16:23.641+02', '184142963');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (75, 'angular2-form-state-classes', 'Angular 2 Form CSS State Classes with NgModel - How to Mark a Field As Mandatory ?', '4:02', 2, 4, true, 'y63g98brmp', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:14.362+02', '2016-10-07 21:16:24.724+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (81, 'angular2-ngmodelgroup', 'Control Groups with ngModelGroup - Validation And Binding', '3:03', 6, 4, true, 'sv0te31xaf', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.077+02', '2016-10-07 21:16:25.256+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (4, 'angular2-template-syntax-events', 'Template Syntax - Introduction To Zones - How does the Angular 2 event handling mechanism work?', '5:14', 19, 1, true, 'g5y4yahjkv', 'https://github.com/angular-university/courses', 'http://www/google.com', 'ADVANCED', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.103+02', '184142934');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (23, 'anhular-http-do-a-get-call-to-express-server', 'Angular 2 Services - Introduction to the HTTP Service - Do a GET HTTP Server Call', '3:43', 26, 1, true, '', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-01 22:25:57.642+02', '2016-10-07 21:16:23.642+02', '184142965');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (43, 'angular2-introduction-to-services-exercise', 'Angular 2 Services  - Exercise - Do an HTTP DELETE', '0:54', 31, 1, true, 'uonpjji210', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-03 10:25:37.254+02', '2016-10-07 21:16:24.183+02', '184142964');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (10, 'angular2-guided-tour-pipes', 'Angular 2 Pipes - Learn Why Standard Pipes Might Not Work, Create a Custom Pipe', '5:01', 21, 1, true, 'tbc7tut0xd', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.104+02', '184142990');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (87, 'angular2-formcontrol-directive', 'Angular 2 Model Driven Forms - The formControl Directive', '1:57', 12, 4, true, '0l3zswws9x', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.629+02', '2016-10-07 21:16:25.789+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (88, 'angular2-custom-validator-form-driven', 'Angular 2 Template Driven Form Custom Validator', '5:44', 14, 4, true, 'j0lv6idl3n', 'https://github.com/angular-university/courses', '', 'ADVANCED', '2016-07-14 10:56:15.634+02', '2016-10-07 21:16:26.228+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (173, 'angular2-firebase-save-new-lesson', 'Lessons Service - Add Save New Lesson Functionality', '12:58', 42, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.335+02', '2016-10-07 21:16:32.572+02', '185630740');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (178, 'angular2-firebase-edit-lesson-implement-lessons-service', 'Edit Lesson - Implement the Save Lesson Service', '3:02', 47, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.863+02', '2016-10-07 21:16:33.095+02', '185614367');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (183, 'angular2-firebase-redirect-to-login-router-guard', 'Redirect User To Login Page Using a Router Guard', '5:33', 52, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.391+02', '2016-10-07 21:16:33.621+02', '185655550');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (5, 'angular2-guided-tour-components', 'Guided Tour to Angular 2 Components', '5:57', 20, 1, true, 'bsvsucnvi1', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-07-25 20:55:31.53+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (100, 'angular2-router-child-routes', 'Child Routes - How To Setup a Master Detail Route - What Are Componentless Routes ?', '4:09', 5, 7, false, 'dz01hx4vk8', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.271+02', '2016-10-07 21:16:34.668+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (103, 'angular2-router-auxiliary-routes', 'Configure Auxiliary Routes in the Angular 2 Router - What is the Difference Towards a Primary Route?', '5:16', 12, 7, false, 'ni0s94foyl', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.838+02', '2016-10-07 21:16:35.194+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (77, 'angular2-standard-validators', 'Angular 2 Standard Form Validators How do Template Driven Forms Work Under The Hood ?', '3:32', 3, 4, false, '02wcuod8mq', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:14.379+02', '2016-10-07 21:16:24.729+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (80, 'angular2-model-driven-reactive-forms', 'Angular 2 Reactive or Model Driven Forms - formGroup and formControlName', '4:07', 7, 4, false, 't86f6p3iwg', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.068+02', '2016-10-07 21:16:25.257+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (169, 'angular2-firebase-router-navigate-detail-to-lesson', 'Navigating From Lesson To Lesson - Part 1', '5:17', 37, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:33.863+02', '2016-10-07 21:16:32.052+02', '185489289');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (85, 'angular2-model-driven-forms-errors', 'Angular 2 Model Driven Forms - Mark Fields in Error', '2:08', 11, 4, true, '5tx0g7gvir', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.62+02', '2016-10-07 21:16:25.79+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (58, 'angular2-what-is-an-observable', 'What is an Observable ? Introduction to Streams and RxJs Observables', '5:41', 0, 9, false, 'qkszh2b23j', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-16 17:25:37.294+02', '2016-10-07 21:16:26.747+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (7, 'angular2-core-directives-ngclass-ngstyle', 'Angular 2 Core Directives - ngClass and ngStyle', '3:15', 12, 1, true, 'lqf7s80in4', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.545+02', '184142920');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (69, 'angular2-how-to-setup-an-http-request-sequence-using-the-rxjs-switchmap-operator', 'How to setup an HTTP request sequence using the RxJs switchMap Operator', '4:33', 10, 9, true, '6bq8ok9kyu', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.787+02', '2016-10-07 21:16:27.783+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (60, 'angular2-observables-error-handling-and-completion-network-calls-as-observables', 'Observables Error Handling and Completion - How do Observables handle Errors?', '5:28', 1, 9, false, '57mzkztwna', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-17 11:22:44.281+02', '2016-10-07 21:16:26.846+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (70, 'angular2-retry-http-requests-in-error-using-the-retry-and-retrywhen-rxjs-operators', 'Retry HTTP requests in Error using the retry and retryWhen RxJs Operators', '3:42', 11, 9, true, '5tp98dm1z9', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.875+02', '2016-10-07 21:16:27.884+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (71, 'angular2-how-to-cancel-an-http-request-using-an-rxjs-subscription', 'How to Cancel an HTTP Request using an RxJs Subscription', '2:56', 12, 9, true, 'nmxsxewesw', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.878+02', '2016-10-07 21:16:27.893+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (49, 'angular2-directives-exercise-solution-improve-collapsible-directive', 'Introduction to Angular 2 Directives - Exercise Solution', '2:40', 16, 1, true, 'z0bhpmmjvg', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:05:55.146+02', '2016-10-07 21:16:22.553+02', '184142926');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (174, 'angular2-firebase-custom-url-validator', 'Add New Lesson - Add a Custom Url Field Validator', '3:05', 43, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.407+02', '2016-10-07 21:16:32.575+02', '185617264');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (179, 'angular2-firebase-authentication-login-page', 'Setup Firebase Authentication, Create a Login Page', '8:52', 48, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.929+02', '2016-10-07 21:16:33.094+02', '185637428');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (184, 'angular2-firebase-rest', 'REST and Firebase - Using the Firebase REST API', '8:25', 53, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.452+02', '2016-10-07 21:16:33.621+02', '185672097');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (68, 'angular2-how-to-do-two-http-requests-in-parallel-using-the-rxjs-combinelatest-operator', 'How to do two HTTP Requests in Parallel using the RxJs combineLatest Operator', '3:58', 9, 9, true, '5hje9r3scu', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.362+02', '2016-10-07 21:16:27.393+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (99, 'angular2-router-optional-route-parameters', 'Optional Route Query Parameters - The queryParams Directive and the Query Parameters Observable', '2:38', 8, 7, true, 'truncmdgqd', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.27+02', '2016-10-07 21:16:34.99+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (72, 'angular2-exercise-improve-a-search-service-and-build-a-typeahead', 'Exercise - Improve a Search Service and Build a Typeahead', '3:15', 13, 9, true, '4zghhkugte', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.878+02', '2016-10-07 21:16:27.908+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (106, 'angular2-router-redirects-path-matching', 'Angular 2 Router Redirects and Path Matching - Avoid Common Routing Pitfall', '2:59', 14, 7, true, '5c64ijq3jp', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.866+02', '2016-10-07 21:16:35.643+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (59, 'angular2-', 'When To Use Template Driven Vs Model Driven Forms ? It Might Surprise You', '6:10', 15, 9, false, 'gk8rvjtlcs', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', '', 'BEGINNER', '2016-06-17 11:02:05.708+02', '2016-07-14 10:51:02.929+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (45, 'angular2-introduction-to-services-exercise-solution', 'Angular 2 Services - Exercise Solution - Do an HTTP DELETE', '3:55', 32, 1, true, 'xzmcddzprl', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-03 10:25:37.259+02', '2016-10-07 21:16:24.188+02', '184142961');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (51, 'angular2-introduction-to-typescript-high-level-overview', 'Introduction to Typescript - High-level Overview', '7:00', 32, 1, true, '5liaw3xqcl', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', '', 'BEGINNER', '2016-06-10 14:47:27.988+02', '2016-07-25 20:55:32.629+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (93, 'angular2-router-styling-active-routes', 'Styling Active Routes With The routerLinkActive And routerLinkActiveOptions Directives', '2:00', 4, 7, true, 'cmvn3agj0r', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:06.205+02', '2016-10-07 21:16:34.611+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (90, 'angular2-signup-form', 'Angular 2 Forms Section Exercise - Build a Signup Form', '1:34', 17, 4, true, 'ln7apm0k55', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:16.158+02', '2016-10-07 21:16:26.334+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (175, 'angular2-firebase-edit-lesson-initial-setup', 'Edit Lesson - Initial Screen Setup', '2:35', 44, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.567+02', '2016-10-07 21:16:32.937+02', '185619063');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (1, 'angular2-mvc-hello-world-controllers-and-templates', 'Angular 2 Hello World from an MVC point of View - Controllers and Templates', '3:56', 16, 1, true, '34uq56rny5', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-07-25 20:55:30.976+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (91, 'angular2-signup-form-example', 'Exercise - Build an Angular 2 Signup Form - Lets do a little Functional Programming', '6:10', 18, 4, true, 't3biv0e0b1', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:16.172+02', '2016-10-07 21:16:26.335+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (62, 'angular2-observable-map-operator-how-to-create-an-observable-from-another', 'The RxJs Map Operator - How to create an Observable from another Observable', '3:04', 5, 9, true, 'teu8cvuxpk', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-17 12:32:57.146+02', '2016-10-07 21:16:27.267+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (83, 'angular2-formbuilder', 'Building Reactive or Model Driven Forms using the FormBuilder', '2:13', 9, 4, true, 'hwqdlbed1s', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.076+02', '2016-10-07 21:16:25.718+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (22, 'angular2-components-exercise-solution', 'Angular 2 Components Tutorial For Beginners - Components Exercise Solution Inside', '2:08', 8, 1, true, '0dn1er1mhl', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:30.033+02', '2016-10-07 21:16:22.002+02', '184142886');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (180, 'angular2-firebase-authentication-observable-data-service', 'Building an Authentication Observable Data Service', '7:06', 49, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.094+02', '2016-10-07 21:16:33.45+02', '185651290');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (118, 'angular2-firebase-typescript', 'Use Firebase SDK with Typescript - Preparing to Run a Firebase Database Population Script', '3:18', 4, 5, true, '07krcugyia', 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:16:17.593+02', '2016-10-07 21:16:28.922+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (185, 'angular2-firebase-security-rules', 'Protect Write Access Using Security Rules', '1:34', 54, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.63+02', '2016-10-07 21:16:33.964+02', '185697988');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (157, 'angular2-firebase-join-3', 'Joins in Firebase - Performance Considerations', '7:39', 28, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:19.844+02', '2016-10-07 21:16:31.393+02', '184967346');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (154, 'angular2-setup-dev-environment-1', 'Setting Up an Angular 2 Development Environment', '8:47', -3, 1, false, NULL, 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-09-30 10:32:13.193+02', '2016-10-07 21:16:20.888+02', '184970793');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (144, 'angular2-firebase-home-screen', 'Starting the Application From the Beginning - Build the Home Screen', '3:33', 16, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.926+02', '2016-10-07 21:16:29.98+02', '184666053');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (47, 'angular2-directives-inputs-outputs-event-emitters', 'Angular 2 Directives - Inputs, Output Event Emitters and How To Export Template References', '4:01', 10, 1, true, 'ewor3ytohi', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:05:54.592+02', '2016-10-07 21:16:22.009+02', '184142922');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (137, 'angular2-angular-cli', 'Getting Started with Angular 2 - Off the Ground Running with the Angular CLI', '8:47', -1, 1, false, NULL, 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-09-25 20:47:01.476+02', '2016-10-07 21:16:20.898+02', '184146937');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (162, 'angular2-firebase-pagination-3', 'Firebase Pagination Concluded - Loading the Previous Page', '2:11', 33, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:20.364+02', '2016-10-07 21:16:31.905+02', '184967551');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (96, 'angular2-router-home-route-fallback-route', 'Configuring a Home Route and Fallback Route - Learn An Essential Routing Concept', '2:55', 3, 7, false, '4n4vg3xnw2', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:06.199+02', '2016-10-07 21:16:34.477+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (86, 'angular2-custom-validator-model-driven', 'Angular 2 Model Driven Form Custom Validator', '3:05', 13, 4, true, '3mv64gc7ox', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.629+02', '2016-10-07 21:16:25.789+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (170, 'angular2-firebase-detail-navigation-route-params-observable', 'Navigating From Lesson To Lesson - The Route Params Observable', '4:48', 39, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.031+02', '2016-10-07 21:16:32.423+02', '185493478');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (102, 'angular2-router-can-activate-guard', 'CanActivate Route Guard - An Example of An Asynchronous Route Guard', '3:31', 11, 7, true, 'fpfcigk7f4', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.838+02', '2016-10-07 21:16:35.195+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (67, 'angular2-how-to-do-multiple-http-requests-using-the-rxjs-concat-operator', 'How to do multiple HTTP requests using the RxJs Concat Operator', '4:19', 8, 9, true, 'nolo492foa', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.319+02', '2016-10-07 21:16:27.391+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (133, 'angular2-firebase-arrays', 'Firebase Arrays - Does Firebase Support Arrays ? ', '5:34', 9, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:22:37.174+02', '2016-10-07 21:16:29.445+02', '184016880');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (150, 'angular2-firebase-router-config', 'Setting Up the Router Configuration of our Application', '4:47', 21, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:15.458+02', '2016-10-07 21:16:30.498+02', '184682667');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (107, 'angular2-router-hash-location-strategy', 'Angular 2 Router Hash Location Strategy vs HTML5 Location Strategy', '3:04', 15, 7, true, 'kh88uahdfi', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:08.384+02', '2016-10-07 21:16:35.719+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (97, 'angular2-router-manual-navigation', 'Programmatic Router Navigation via the Router API - Relative And Absolute Router Navigation', '3:59', 6, 7, true, '4h570iufj2', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.269+02', '2016-10-07 21:16:34.671+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (53, 'angular2-introduction-to-typescript-array-spread-operator-object-destructuring', 'Introduction To Typescript - The Array Spread Operator, Object Destructuring and more', '4:54', 35, 1, true, '1hxfcykcqb', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:47:27.99+02', '2016-10-07 21:16:24.196+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (54, 'angular2-introduction-to-typescript-imports-and-exports', 'Introduction To Typescript - Imports and Exports - One of the main missing features of ES5 ?', '4:32', 36, 1, true, 'hhostv2mm3', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:47:28.017+02', '2016-10-07 21:16:24.691+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (113, 'angular2-shared-modules-service-configuration', 'Shared Modules And Lazy Loading - How to Setup Shared Services', '6:39', 17, 7, true, 'eyqw5spxpt', 'https://github.com/angular-university/courses', '', 'ADVANCED', '2016-09-02 16:31:04.607+02', '2016-10-07 21:16:35.721+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (8, 'angular2-core-directives-ngIf', 'Angular 2 Core Directives - ngIf', '3:56', 13, 1, true, 'pxzihsuyyl', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.547+02', '184142921');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (84, 'angular2-reactive-forms-rxjs', 'Reactive Forms with RxJs - Learn Why They Are more Powerful than Template Driven', '6:23', 10, 4, true, 'lwp06a352f', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.417+02', '2016-10-07 21:16:25.784+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (61, 'angular2-observable-composition-combine-latests', 'Observable Composition - combine multiple Observables Using combineLatest', '5:59', 6, 9, true, 'dvjz3ljjis', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-17 12:32:57.158+02', '2016-10-07 21:16:27.363+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (110, 'angular2-ngmodule', 'Angular 2 Modularity - @NgModule and Feature Modules - Learn why a Component Might Not Be Visible', '4:48', 30, 1, false, 'vpir75f1ts', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-09-02 15:52:42.033+02', '2016-10-07 21:16:24.162+02', '184142991');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (171, 'angular2-firebase-create-new-lesson', 'The Create New Lesson Form', '5:21', 40, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.035+02', '2016-10-07 21:16:32.552+02', '185498124');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (186, 'angular2-firebase-node-queue', 'Build a Custom Node Backend Using Firebase Queue', '11:46', 55, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.635+02', '2016-10-07 21:16:34.09+02', '185696987');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (176, 'angular2-firebase-edit-lesson-router-resolve', 'Edit Lesson - Retrieve Lesson using the Router Resolve Functionality', '7:54', 45, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.569+02', '2016-10-07 21:16:33.065+02', '185627971');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (79, 'angular2-form-field-errors', 'How to display Form Field Validation Error Messages with NgModel', '3:28', 5, 4, true, '10h56dk1oh', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:14.895+02', '2016-10-07 21:16:25.252+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (145, 'angular2-firebase-service-layer-example', 'Building our First Firebase Service - The Lessons Service', '7:24', 17, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.93+02', '2016-10-07 21:16:29.984+02', '184669713');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (2, 'angular2-template-syntax-properties', 'Angular 2 Template Syntax - Properties', '5:12', 17, 1, true, 'sir1uv5mc2', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.094+02', '184142936');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (146, 'angular2-firebase-smart-vs-presentation-components', 'Angular 2 Smart Components vs Presentation Components: What''s the Difference and When to Use Each ?', '4:36', 18, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.969+02', '2016-10-07 21:16:30.364+02', '184671952');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (52, 'angular2-introduction-to-typescript-classes-and-interfaces', 'Introduction To Typescript - Classes and Interfaces', '3:47', 33, 1, true, 'nrsfl3an8z', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', '', 'BEGINNER', '2016-06-10 14:47:27.989+02', '2016-09-25 21:35:33.363+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (66, 'angular2-how-to--aAvoid-duplicate-http-requests-rxjs-cache-operator', 'Avoid the Biggest Pitfall of Angular 2 HTTP - Learn the RxJs Cache Operator', '5:10', 7, 9, true, 'oiizaw0h1s', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.312+02', '2016-10-07 21:16:27.378+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (73, 'angular2-exercise-solution-learn-how-to-build-a-typeahead-that-cancels-obsolete-search-requests', 'Exercise Solution - Learn How to build a Typeahead that cancels obsolete search requests', '5:07', 14, 9, true, 'tc2l6vx42h', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.903+02', '2016-10-07 21:16:27.911+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (114, 'what-is-a-single-page-application', 'What is a Single Page Application ? Learn Why They Might Become More Frequent In The Future', '4:00', 0, 7, false, 'lhmqnc3l2j', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-09-20 13:16:05.526+02', '2016-10-07 21:16:34.144+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (89, 'angular2-template-driven-vs-model-driven-forms', 'When To Use Angular 2 Template Driven Vs Model Driven Forms, and Why ? ', '5:04', 16, 4, false, 'gk8rvjtlcs', 'https://github.com/angular-university/courses', '', 'ADVANCED', '2016-07-14 10:56:15.937+02', '2016-10-07 21:16:26.331+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (98, 'angular2-router-navigation-parameters', 'Master Detail Navigation And Route Parameters  - The Route Parameters Observable', '6:03', 7, 7, true, '3lmeqar4p2', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.27+02', '2016-10-07 21:16:34.674+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (104, 'angular2-router-can-deactivate-guard', 'CanDeactivate Route Guard - How To Confirm If The User Wants To Exit A Route', '4:42', 10, 7, true, 'sdelhsbl7r', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.839+02', '2016-10-07 21:16:35.191+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (44, 'angular2-rest-api-http-server-development', 'How to Setup a Development REST API HTTP Server with Express and ts-node', '2:46', 29, 1, true, 'jiyxgjgzbr', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-03 10:25:37.254+02', '2016-10-07 21:16:23.653+02', '184142966');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (109, 'angular2-router-exercise-solution-build-a-dashboard', 'Exercise Solution - Implement a Widget Dashboard With Multiple Auxiliary Routes', '4:41', 19, 7, true, 'ik1079l3pc', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:08.387+02', '2016-10-07 21:16:36.157+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (147, 'angular2-firebase-typescript-pitfall', 'Pitfall of Using Typescript Classes when Querying Data From a Backend', '6:21', 19, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.972+02', '2016-10-07 21:16:30.477+02', '184675938');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (149, 'angular2-firebase-navigation-menu', 'Building a Navigation Menu Using The Angular 2 Router', '5:53', 22, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:15.456+02', '2016-10-07 21:16:30.501+02', '184686519');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (181, 'angular2-firebase-user-registration-page', 'Build a User Registration Page', '3:50', 50, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.106+02', '2016-10-07 21:16:33.579+02', '185643819');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (151, 'angular2-firebase-master-detail', 'Setting Up the Master Screen of the Master Detail Pattern', '6:46', 23, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:15.486+02', '2016-10-07 21:16:30.879+02', '184690497');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (94, 'angular2-router-navigation', 'Navigate Between Angular 2 Routes - Several Ways Of Using the routerLink Directive', '3:18', 2, 7, false, 'dmlwjcbloz', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:06.198+02', '2016-10-07 21:16:34.15+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (134, 'angular2-firebase-data-modelling', 'Firebase Data Modeling 101 - How To Model Data In Firebase ?', '4:11', 7, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:22:37.173+02', '2016-10-07 21:16:28.946+02', '184016867');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (140, 'angular2-firebase-list-push', 'How to Write Data to the Database using AngularFire 2 ? Adding Elements to a List', '3:52', 12, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 16:44:44.433+02', '2016-10-07 21:16:29.468+02', '184659309');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (142, 'angular2-firebase-list-remove', 'How To Remove an Element from a List using AngularFire 2 ?', '3:08', 13, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.406+02', '2016-10-07 21:16:29.847+02', '184661218');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (95, 'angular2-router-introduction', 'Angular 2 Router Demo - Why Build Single Applications ?', '4:00', 0, 7, false, '7yelea6od7', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', '', 'BEGINNER', '2016-07-22 13:11:06.17+02', '2016-07-22 19:39:03.616+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (148, 'angular2-firebase-client-side-search', 'How To Implement Client-Side Search in Angular 2 ?', '4:00', 20, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:15.348+02', '2016-10-07 21:16:30.485+02', '184680629');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (141, 'angular2-firebase-list-update', 'How To Update an Element in a Firebase List using AngularFire 2 ?', '1:11', 14, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.406+02', '2016-10-07 21:16:29.961+02', '184662832');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (166, 'angular2-firebase-install-node-and-demo-app', 'Installing Node and the Angular 2 and Firebase Demo Application', '4:45', -2, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:50:35.241+02', '2016-10-07 21:16:28.403+02', '184967332');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (115, 'angular2-firebase-sdk-hello-world', 'Firebase Real-Time Database Hello World - First Query - Debug Websockets !', '8:15', 2, 5, false, '2d4z8awdln', 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:16:17.568+02', '2016-10-07 21:16:28.43+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (123, 'angular2-populate-firebase-db-ts-node', 'Populate a Firebase Database with a Node Program - Use Typescript with Node using ts-node', '4:24', 5, 5, true, 'wypbcta6wu', 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:16:18.338+02', '2016-10-07 21:16:28.927+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (136, 'angular2-firebase-db-script-explained', 'Populate a Firebase Database -Initialization Script Explained Step By Step', '3:53', 6, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:22:37.165+02', '2016-10-07 21:16:28.943+02', '184016862');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (152, 'angular2-firebase-master-detail-navigation', 'Configuring the Angular 2 Router for Master To Detail Navigation', '3:23', 24, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:15.499+02', '2016-10-07 21:16:30.993+02', '184691854');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (135, 'angular2-firebase-database-ekeys', 'Firebase Key Generation - How to use the Firebase Push Keys, Should We Use Them and Why ?', '3:09', 8, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:22:37.174+02', '2016-10-07 21:16:29.327+02', '184016876');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (82, 'angular2-model-driven-forms-validation', 'Angular 2 Form  Validation in Model Driven Forms - Configuring a Form Validator', '2:29', 8, 4, true, 'wj3sc15qom', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.077+02', '2016-10-07 21:16:25.256+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (111, 'angular2-set-form-value-reset-form', 'Angular 2 Model Driven Forms - How to Set a Form Value and Reset a Form', '4:48', 15, 4, false, '4nje3w2hw4', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-09-02 16:24:08.915+02', '2016-10-07 21:16:26.32+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (14, 'angular2-passing-data-to-component-using-input', 'Component @Input - How To Pass Input Data To an Angular 2 Component', '2:33', 2, 1, false, '827hgtrr29', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:29.966+02', '2016-10-07 21:16:21.457+02', '184142891');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (63, 'how-does-angular2-use-observables-http-response-object', 'How does Angular 2 HTTP use Observables ? The HTTP Response object', '4:32', 2, 9, false, 'd7vtjvt8dt', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-17 12:46:12.757+02', '2016-10-07 21:16:26.858+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (64, 'angular2-how-to-use-observables-and-http-to-build-a-servicelayer', 'How to use Observables and HTTP to build a Service Layer', '4:32', 3, 9, false, 'g2hhysapd4', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-17 12:46:13.26+02', '2016-10-07 21:16:26.87+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (21, 'angular2-components-exercise', 'Angular 2 Components Tutorial For Beginners - Components Exercise !', '1:26', 7, 1, true, 'ipfegcf8bp', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:30.024+02', '2016-10-07 21:16:22.001+02', '184142887');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (65, 'angular2-how-to-use-the-async-pipe-to-pass-observables-into-a-template', 'Introduction to Functional Reactive Programming - Using the Async Pipe - Pitfalls to Avoid', '4:36', 4, 9, true, 'k6htip99ui', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-17 12:46:13.311+02', '2016-10-07 21:16:26.872+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (9, 'angular2-guided-tour-directives', 'Directives Guided Tour - Learn Why Directives Might be a Better Choice Than Components', '7:58', 14, 1, true, 'ne47xhs228', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.545+02', '184142927');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (117, 'angular2-firebase-demo-course-intro', 'Build an Application with Angular 2 and Firebase - Application Demo and Course Objectives', '6:51', -3, 5, false, '9c48aolpe7', 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:16:17.566+02', '2016-10-07 21:16:28.297+02', '184967711');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (153, 'angular2-firebase-master-detail-detail-screen', 'Setting Up the Detail Screen of a Master Detail Setup', '5:03', 25, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:15.866+02', '2016-10-07 21:16:31.001+02', '184696927');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (143, 'angular2-firebase-object-set-update', 'How to Modify an Object in Firebase using AngularFire 2, what is the Difference Between Set and Update?', '3:31', 15, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.83+02', '2016-10-07 21:16:29.97+02', '184664186');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (78, 'angular2-form-exports', 'Understanding Angular 2 Form Exports -  Disable a Form Button Until the Form is Valid', '3:15', 4, 4, true, 't0shk04mov', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:14.379+02', '2016-10-07 21:16:25.202+02', NULL);
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (138, 'angular2-firebase-list-observable', 'AngularFire 2 Hello World - How To Write your First Query using AngularFire 2 List Observables ?', '7:43', 10, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 16:44:44.347+02', '2016-10-07 21:16:29.457+02', '184654417');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (139, 'angular2-firebase-object-observable', 'AngularFire 2 Object Observables - How to Read Objects from a Firebase Database?', '2:19', 11, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 16:44:44.429+02', '2016-10-07 21:16:29.466+02', '184656039');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (156, 'angular2-firebase-join-1', 'How To Make a Join in Firebase Using AngularFire 2 ? Reading a Course based on its url', '9:30', 26, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:19.502+02', '2016-10-07 21:16:31.014+02', '184967342');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (155, 'angular2-firebase-join-2', 'Joins in Firebase Continued - Querying the List Of Lesson Keys Of Lessons that Belong to a Course', '2:51', 27, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:19.504+02', '2016-10-07 21:16:31.016+02', '184818312');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (158, 'angular2-rxjs-clean-code', 'How to Write Maintainable RxJs Code ? Some Tips and Tricks on How to Write Clean Reactive Code', '4:53', 29, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:19.898+02', '2016-10-07 21:16:31.512+02', '184967546');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (159, 'angular2-firebase-pagination-display-course-lessons', 'Displaying the Lessons Per Course in the Course Detail Page', '3:50', 30, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:19.934+02', '2016-10-07 21:16:31.514+02', '184967349');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (160, 'angular2-firebase-pagination', 'How To Do Pagination in Firebase ? Loading the First Page of a Paginated Table', '7:52', 31, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:20.063+02', '2016-10-07 21:16:31.53+02', '184967342');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (161, 'angular2-firebase-pagination-2', 'Firebase Pagination Continued - Loading the Next Page', '4:12', 32, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:20.08+02', '2016-10-07 21:16:31.533+02', '184978774');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (163, 'angular2-firebase-navigate-from-course-to-lesson', 'Navigate From Course Detail to Lesson', '5:17', 34, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:20.435+02', '2016-10-07 21:16:32.036+02', '184967348');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (164, 'angular2-firebase-lesson-detail', 'Building a Lesson Detail Component', '4:17', 35, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:20.476+02', '2016-10-07 21:16:32.046+02', '184967345');
+INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (165, 'angular2-firebase-security-iframe', 'Angular 2 Security - Adding an iframe to an Angular 2 Template', '4:14', 36, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:20.585+02', '2016-10-07 21:16:32.053+02', '184967547');
+
+

From e7973f2a10d40534f7976dd15f81931643d5b2f9 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 12:08:12 +0200
Subject: [PATCH 04/49] ongoing REST API

---
 hello-world.ts  |  6 -----
 package.json    |  8 +++++-
 sql-examples.ts | 65 +++++++++++++++++++++++++++++++++++++++++++++++++
 tsconfig.json   |  4 +--
 4 files changed, 74 insertions(+), 9 deletions(-)
 create mode 100644 sql-examples.ts

diff --git a/hello-world.ts b/hello-world.ts
index 17a7b61..9e5f5f8 100644
--- a/hello-world.ts
+++ b/hello-world.ts
@@ -2,12 +2,6 @@
 
 
 
-var user;
-
-
-user.name = 'Vasco';
-
-
 
 
 
diff --git a/package.json b/package.json
index 277d3a8..8c67fdf 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,8 @@
   "description": "",
   "main": "index.js",
   "scripts": {
-    "hello": "./node_modules/.bin/ts-node ./hello-world.ts"
+    "hello": "./node_modules/.bin/ts-node ./hello-world.ts",
+    "sql": "./node_modules/.bin/ts-node ./sql-examples.ts"
   },
   "repository": {
     "type": "git",
@@ -20,5 +21,10 @@
     "http-server": "^0.9.0",
     "ts-node": "^1.6.0",
     "typescript": "^2.0.3"
+  },
+  "dependencies": {
+    "@types/sequelize": "^4.0.38",
+    "pg": "^6.1.0",
+    "sequelize": "^3.24.4"
   }
 }
diff --git a/sql-examples.ts b/sql-examples.ts
new file mode 100644
index 0000000..a894212
--- /dev/null
+++ b/sql-examples.ts
@@ -0,0 +1,65 @@
+
+
+import Sequelize = require("Sequelize");
+
+
+
+
+const loggingConfig = {benchmark:true, logging:console.log};
+
+const dbUrl = 'postgres://postgres:postgres@localhost:5432/complete-typescript-course';
+
+
+export const sequelize = new Sequelize(dbUrl, loggingConfig);
+
+
+
+const CourseModel = sequelize.define('Course', {
+    description: Sequelize.STRING,
+    url:  Sequelize.STRING,
+    longDescription: Sequelize.TEXT,
+    iconUrl: Sequelize.STRING,
+    courseListIcon:Sequelize.STRING,
+    seqNo: Sequelize.INTEGER,
+    comingSoon: Sequelize.BOOLEAN,
+    isNew: Sequelize.BOOLEAN,
+    isOngoing: Sequelize.BOOLEAN,
+    visibleFrom: Sequelize.DATE
+}, {
+    classMethods: {
+        associate: function (models:any) {
+            models.Course.hasMany(models.Lesson, {foreignKey: 'courseId'});
+        }
+    }
+});
+
+
+
+
+
+
+
+function findAllLessons() {
+    return CourseModel.findAll({
+        order: ['seqNo']
+    });
+}
+
+
+
+
+let lessons = findAllLessons();
+
+
+
+
+
+lessons
+    .then((data:any) => {
+
+        console.log(data[0].dataValues);
+
+    })
+    .catch(console.error);
+
+
diff --git a/tsconfig.json b/tsconfig.json
index d8edcff..7c8d130 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -7,7 +7,7 @@
         "strictNullChecks": true,
         "sourceMap": true
     },
-  "files": [
-    "hello-world.ts"
+  "exclude": [
+    "node_modules"
   ]
 }
\ No newline at end of file

From fb2ec0ac099961c70e7d0ed67a0e67443940939d Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 12:49:58 +0200
Subject: [PATCH 05/49] ongoing REST API

---
 sql-examples.ts                | 32 ++++----------------------------
 src/model/init-course-model.ts | 28 ++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+), 28 deletions(-)
 create mode 100644 src/model/init-course-model.ts

diff --git a/sql-examples.ts b/sql-examples.ts
index a894212..9c5fe25 100644
--- a/sql-examples.ts
+++ b/sql-examples.ts
@@ -1,11 +1,13 @@
 
 
 import Sequelize = require("Sequelize");
+import {initCourseModel} from "./src/model/init-course-model";
+import {LoggingOptions} from 'sequelize';
 
 
 
 
-const loggingConfig = {benchmark:true, logging:console.log};
+const loggingConfig: LoggingOptions = {benchmark:true, logging:console.log};
 
 const dbUrl = 'postgres://postgres:postgres@localhost:5432/complete-typescript-course';
 
@@ -13,29 +15,7 @@ const dbUrl = 'postgres://postgres:postgres@localhost:5432/complete-typescript-c
 export const sequelize = new Sequelize(dbUrl, loggingConfig);
 
 
-
-const CourseModel = sequelize.define('Course', {
-    description: Sequelize.STRING,
-    url:  Sequelize.STRING,
-    longDescription: Sequelize.TEXT,
-    iconUrl: Sequelize.STRING,
-    courseListIcon:Sequelize.STRING,
-    seqNo: Sequelize.INTEGER,
-    comingSoon: Sequelize.BOOLEAN,
-    isNew: Sequelize.BOOLEAN,
-    isOngoing: Sequelize.BOOLEAN,
-    visibleFrom: Sequelize.DATE
-}, {
-    classMethods: {
-        associate: function (models:any) {
-            models.Course.hasMany(models.Lesson, {foreignKey: 'courseId'});
-        }
-    }
-});
-
-
-
-
+const CourseModel = initCourseModel(sequelize);
 
 
 
@@ -46,14 +26,10 @@ function findAllLessons() {
 }
 
 
-
-
 let lessons = findAllLessons();
 
 
 
-
-
 lessons
     .then((data:any) => {
 
diff --git a/src/model/init-course-model.ts b/src/model/init-course-model.ts
new file mode 100644
index 0000000..b09a3ac
--- /dev/null
+++ b/src/model/init-course-model.ts
@@ -0,0 +1,28 @@
+
+
+import ORM = require("Sequelize");
+import {Sequelize, DataTypes} from 'Sequelize';
+
+
+
+
+export function initCourseModel(sequelize:Sequelize) {
+    return sequelize.define('Course', {
+        description: ORM.STRING,
+        url:  ORM.STRING,
+        longDescription: ORM.TEXT,
+        iconUrl: ORM.STRING,
+        courseListIcon: ORM.STRING,
+        seqNo: ORM.INTEGER,
+        comingSoon: ORM.BOOLEAN,
+        isNew: ORM.BOOLEAN,
+        isOngoing: ORM.BOOLEAN,
+        visibleFrom: ORM.DATE
+    }, {
+        classMethods: {
+            associate: function (models:any) {
+                models.Course.hasMany(models.Lesson, {foreignKey: 'courseId'});
+            }
+        }
+    });
+}
\ No newline at end of file

From f6469988c3abeb10f12c2e0fcd72c96be6a20178 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 13:51:19 +0200
Subject: [PATCH 06/49] ongoing REST API

---
 package.json                   |  6 ++++--
 sql-examples.ts                | 11 +----------
 src/model/index.ts             | 17 +++++++++++++++++
 src/model/init-course-model.ts |  2 +-
 src/model/init-lesson-model.ts | 28 ++++++++++++++++++++++++++++
 5 files changed, 51 insertions(+), 13 deletions(-)
 create mode 100644 src/model/index.ts
 create mode 100644 src/model/init-lesson-model.ts

diff --git a/package.json b/package.json
index 8c67fdf..75c1395 100644
--- a/package.json
+++ b/package.json
@@ -20,10 +20,12 @@
   "devDependencies": {
     "http-server": "^0.9.0",
     "ts-node": "^1.6.0",
-    "typescript": "^2.0.3"
+    "typescript": "^2.0.3",
+    "@types/express": "^4.14.0",
+    "@types/sequelize": "^3.24.4"
   },
   "dependencies": {
-    "@types/sequelize": "^4.0.38",
+    "express": "^4.14.0",
     "pg": "^6.1.0",
     "sequelize": "^3.24.4"
   }
diff --git a/sql-examples.ts b/sql-examples.ts
index 9c5fe25..8b9fb72 100644
--- a/sql-examples.ts
+++ b/sql-examples.ts
@@ -1,22 +1,13 @@
 
 
-import Sequelize = require("Sequelize");
-import {initCourseModel} from "./src/model/init-course-model";
-import {LoggingOptions} from 'sequelize';
 
+import {CourseModel} from "./src/model";
 
 
 
-const loggingConfig: LoggingOptions = {benchmark:true, logging:console.log};
 
-const dbUrl = 'postgres://postgres:postgres@localhost:5432/complete-typescript-course';
 
 
-export const sequelize = new Sequelize(dbUrl, loggingConfig);
-
-
-const CourseModel = initCourseModel(sequelize);
-
 
 
 function findAllLessons() {
diff --git a/src/model/index.ts b/src/model/index.ts
new file mode 100644
index 0000000..76a1b52
--- /dev/null
+++ b/src/model/index.ts
@@ -0,0 +1,17 @@
+
+import Sequelize = require("Sequelize");
+import {LoggingOptions} from 'sequelize';
+import {initCourseModel} from "./init-course-model";
+import {initLessonModel} from "./init-lesson-model";
+
+
+const loggingConfig: LoggingOptions = {benchmark:true, logging:console.log};
+
+const dbUrl = 'postgres://postgres:postgres@localhost:5432/complete-typescript-course';
+
+export const sequelize = new Sequelize(dbUrl, loggingConfig);
+
+
+export const CourseModel = initCourseModel(sequelize);
+
+export const LessonModel = initLessonModel(sequelize);
diff --git a/src/model/init-course-model.ts b/src/model/init-course-model.ts
index b09a3ac..d8224b5 100644
--- a/src/model/init-course-model.ts
+++ b/src/model/init-course-model.ts
@@ -1,7 +1,7 @@
 
 
 import ORM = require("Sequelize");
-import {Sequelize, DataTypes} from 'Sequelize';
+import {Sequelize} from 'Sequelize';
 
 
 
diff --git a/src/model/init-lesson-model.ts b/src/model/init-lesson-model.ts
new file mode 100644
index 0000000..03b01c5
--- /dev/null
+++ b/src/model/init-lesson-model.ts
@@ -0,0 +1,28 @@
+
+
+import ORM = require("Sequelize");
+import {Sequelize} from 'Sequelize';
+
+
+
+export function initLessonModel(sequelize:Sequelize) {
+    return sequelize.define('Lesson', {
+        url: ORM.STRING,
+        description: ORM.STRING,
+        duration: ORM.STRING,
+        seqNo: ORM.INTEGER,
+        courseId: ORM.INTEGER,
+        pro: ORM.BOOLEAN,
+        tags: ORM.STRING,
+        videoId: ORM.STRING,
+        vimeoid: ORM.STRING,
+        gitHubUrl: ORM.STRING,
+        downloadUrl: ORM.STRING
+    }, {
+        classMethods: {
+            associate: function (models:any) {
+                models.Lesson.belongsTo(models.Course, {foreignKey: 'courseId'});
+            }
+        }
+    });
+}
\ No newline at end of file

From 95aafa262bfaf743c37aaf061894ab83446ccb96 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 13:53:08 +0200
Subject: [PATCH 07/49] ongoing REST API

---
 sql-examples.ts               | 15 ++-------------
 src/queries/findAllLessons.ts |  8 ++++++++
 2 files changed, 10 insertions(+), 13 deletions(-)
 create mode 100644 src/queries/findAllLessons.ts

diff --git a/sql-examples.ts b/sql-examples.ts
index 8b9fb72..55ed651 100644
--- a/sql-examples.ts
+++ b/sql-examples.ts
@@ -1,26 +1,15 @@
 
 
 
-import {CourseModel} from "./src/model";
+import {findAllLessons} from "./src/queries/findAllLessons";
 
 
 
-
-
-
-
-
-function findAllLessons() {
-    return CourseModel.findAll({
-        order: ['seqNo']
-    });
-}
-
-
 let lessons = findAllLessons();
 
 
 
+
 lessons
     .then((data:any) => {
 
diff --git a/src/queries/findAllLessons.ts b/src/queries/findAllLessons.ts
new file mode 100644
index 0000000..ebf7ad9
--- /dev/null
+++ b/src/queries/findAllLessons.ts
@@ -0,0 +1,8 @@
+
+import {CourseModel} from "../model";
+
+export function findAllLessons() {
+    return CourseModel.findAll({
+        order: ['seqNo']
+    });
+}

From 0231382b4823b0e799953b827397cdf53f18fbbf Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 14:01:01 +0200
Subject: [PATCH 08/49] ongoing REST API

---
 src/model/index.ts                                     | 5 +++--
 src/model/{init-course-model.ts => initCourseModel.ts} | 0
 src/model/{init-lesson-model.ts => initLessonModel.ts} | 0
 3 files changed, 3 insertions(+), 2 deletions(-)
 rename src/model/{init-course-model.ts => initCourseModel.ts} (100%)
 rename src/model/{init-lesson-model.ts => initLessonModel.ts} (100%)

diff --git a/src/model/index.ts b/src/model/index.ts
index 76a1b52..c4f2f0b 100644
--- a/src/model/index.ts
+++ b/src/model/index.ts
@@ -1,8 +1,9 @@
 
 import Sequelize = require("Sequelize");
 import {LoggingOptions} from 'sequelize';
-import {initCourseModel} from "./init-course-model";
-import {initLessonModel} from "./init-lesson-model";
+import {initCourseModel} from "./initCourseModel";
+import {initLessonModel} from "./initLessonModel";
+
 
 
 const loggingConfig: LoggingOptions = {benchmark:true, logging:console.log};
diff --git a/src/model/init-course-model.ts b/src/model/initCourseModel.ts
similarity index 100%
rename from src/model/init-course-model.ts
rename to src/model/initCourseModel.ts
diff --git a/src/model/init-lesson-model.ts b/src/model/initLessonModel.ts
similarity index 100%
rename from src/model/init-lesson-model.ts
rename to src/model/initLessonModel.ts

From 5c3ce02ba61f9e7d3a39522b0af1e2d5904a91c3 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 14:02:14 +0200
Subject: [PATCH 09/49] ongoing REST API

---
 sql-examples.ts                                      | 6 ++----
 src/model/index.ts                                   | 2 ++
 src/queries/{findAllLessons.ts => findAllCourses.ts} | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)
 rename src/queries/{findAllLessons.ts => findAllCourses.ts} (75%)

diff --git a/sql-examples.ts b/sql-examples.ts
index 55ed651..d913bd0 100644
--- a/sql-examples.ts
+++ b/sql-examples.ts
@@ -1,11 +1,9 @@
 
 
+import {findAllCourses} from "./src/queries/findAllCourses";
 
-import {findAllLessons} from "./src/queries/findAllLessons";
 
-
-
-let lessons = findAllLessons();
+let lessons = findAllCourses();
 
 
 
diff --git a/src/model/index.ts b/src/model/index.ts
index c4f2f0b..af65956 100644
--- a/src/model/index.ts
+++ b/src/model/index.ts
@@ -16,3 +16,5 @@ export const sequelize = new Sequelize(dbUrl, loggingConfig);
 export const CourseModel = initCourseModel(sequelize);
 
 export const LessonModel = initLessonModel(sequelize);
+
+
diff --git a/src/queries/findAllLessons.ts b/src/queries/findAllCourses.ts
similarity index 75%
rename from src/queries/findAllLessons.ts
rename to src/queries/findAllCourses.ts
index ebf7ad9..071e156 100644
--- a/src/queries/findAllLessons.ts
+++ b/src/queries/findAllCourses.ts
@@ -1,7 +1,7 @@
 
 import {CourseModel} from "../model";
 
-export function findAllLessons() {
+export function findAllCourses() {
     return CourseModel.findAll({
         order: ['seqNo']
     });

From 9e24593bf2d65933042a1cb9953b9bac7e48807b Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 14:10:43 +0200
Subject: [PATCH 10/49] ongoing REST API

---
 package.json                  | 4 ++--
 rest-examples.ts              | 5 +++++
 src/queries/findAllCourses.ts | 2 ++
 3 files changed, 9 insertions(+), 2 deletions(-)
 create mode 100644 rest-examples.ts

diff --git a/package.json b/package.json
index 75c1395..a206f58 100644
--- a/package.json
+++ b/package.json
@@ -21,8 +21,8 @@
     "http-server": "^0.9.0",
     "ts-node": "^1.6.0",
     "typescript": "^2.0.3",
-    "@types/express": "^4.14.0",
-    "@types/sequelize": "^3.24.4"
+    "@types/express": "^4.0.33",
+    "@types/sequelize": "^4.0.38"
   },
   "dependencies": {
     "express": "^4.14.0",
diff --git a/rest-examples.ts b/rest-examples.ts
new file mode 100644
index 0000000..dbade34
--- /dev/null
+++ b/rest-examples.ts
@@ -0,0 +1,5 @@
+
+
+
+import * as express from 'express';
+
diff --git a/src/queries/findAllCourses.ts b/src/queries/findAllCourses.ts
index 071e156..aa6c1aa 100644
--- a/src/queries/findAllCourses.ts
+++ b/src/queries/findAllCourses.ts
@@ -6,3 +6,5 @@ export function findAllCourses() {
         order: ['seqNo']
     });
 }
+
+

From 888c6eabcb277a3a65a3f24c1de18ffa4b0261bf Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 14:13:43 +0200
Subject: [PATCH 11/49] ongoing REST API

---
 src/model/initCourseModel.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/model/initCourseModel.ts b/src/model/initCourseModel.ts
index d8224b5..c4c9022 100644
--- a/src/model/initCourseModel.ts
+++ b/src/model/initCourseModel.ts
@@ -1,6 +1,6 @@
 
 
-import ORM = require("Sequelize");
+import * as ORM from "Sequelize";
 import {Sequelize} from 'Sequelize';
 
 

From 24397bb9f7ff9cf96e20aa74003cd99c940e3283 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 15:26:27 +0200
Subject: [PATCH 12/49] ongoing REST API

---
 hello-world.ts   |  5 +----
 package.json     | 10 ++++++----
 rest-examples.ts | 23 ++++++++++++++++++++++-
 tsconfig.json    |  5 +----
 4 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/hello-world.ts b/hello-world.ts
index 9e5f5f8..6a16023 100644
--- a/hello-world.ts
+++ b/hello-world.ts
@@ -1,7 +1,4 @@
 
 
 
-
-
-
-
+console.log('Hello World !');
\ No newline at end of file
diff --git a/package.json b/package.json
index a206f58..986484a 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,8 @@
   "main": "index.js",
   "scripts": {
     "hello": "./node_modules/.bin/ts-node ./hello-world.ts",
-    "sql": "./node_modules/.bin/ts-node ./sql-examples.ts"
+    "sql": "./node_modules/.bin/ts-node ./sql-examples.ts",
+    "rest":"./node_modules/.bin/ts-node ./rest-examples.ts"
   },
   "repository": {
     "type": "git",
@@ -18,11 +19,12 @@
   },
   "homepage": "https://github.com/angular-university/complete-typescript-course#readme",
   "devDependencies": {
+    "@types/express": "^4.0.33",
+    "@types/node": "^6.0.45",
+    "@types/sequelize": "^4.0.38",
     "http-server": "^0.9.0",
     "ts-node": "^1.6.0",
-    "typescript": "^2.0.3",
-    "@types/express": "^4.0.33",
-    "@types/sequelize": "^4.0.38"
+    "typescript": "^2.0.3"
   },
   "dependencies": {
     "express": "^4.14.0",
diff --git a/rest-examples.ts b/rest-examples.ts
index dbade34..1bd66ff 100644
--- a/rest-examples.ts
+++ b/rest-examples.ts
@@ -1,5 +1,26 @@
 
+import * as express from 'express';
+import * as path from 'path';
+
+const port = 8090;
+
+const app = express();
+
+
+let root = path.join(path.resolve(__dirname, '.'));
+
+
+app.use(express.static(root));
+
+
+
+
+app.listen(port, () => {
+    console.log('Listen on port:' + port + ' at ' + new Date());
+});
+
+
+
 
 
-import * as express from 'express';
 
diff --git a/tsconfig.json b/tsconfig.json
index 7c8d130..0149e5d 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -6,8 +6,5 @@
         "skipLibCheck":true,
         "strictNullChecks": true,
         "sourceMap": true
-    },
-  "exclude": [
-    "node_modules"
-  ]
+    }
 }
\ No newline at end of file

From 417dfaf0e7deb3d09d2bf404ea70abe3e0def56c Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 16:29:56 +0200
Subject: [PATCH 13/49] ongoing REST API

---
 package.json     |  4 +++-
 rest-examples.ts | 16 ++++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 986484a..6a343eb 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
   "scripts": {
     "hello": "./node_modules/.bin/ts-node ./hello-world.ts",
     "sql": "./node_modules/.bin/ts-node ./sql-examples.ts",
-    "rest":"./node_modules/.bin/ts-node ./rest-examples.ts"
+    "rest": "./node_modules/.bin/ts-node ./rest-examples.ts"
   },
   "repository": {
     "type": "git",
@@ -27,8 +27,10 @@
     "typescript": "^2.0.3"
   },
   "dependencies": {
+    "body-parser": "^1.15.2",
     "express": "^4.14.0",
     "pg": "^6.1.0",
+    "response-time": "^2.3.1",
     "sequelize": "^3.24.4"
   }
 }
diff --git a/rest-examples.ts b/rest-examples.ts
index 1bd66ff..b1ccbe7 100644
--- a/rest-examples.ts
+++ b/rest-examples.ts
@@ -1,6 +1,8 @@
 
 import * as express from 'express';
 import * as path from 'path';
+var bodyParser = require('body-parser');
+
 
 const port = 8090;
 
@@ -10,9 +12,23 @@ const app = express();
 let root = path.join(path.resolve(__dirname, '.'));
 
 
+app.use(bodyParser.json());
 app.use(express.static(root));
 
 
+function apiGetAllCourses(req: express.Request, res: express.Response) {
+
+    res.status(200).send();
+
+
+}
+
+
+app.route('/api/courses').get(apiGetAllCourses);
+
+
+
+
 
 
 app.listen(port, () => {

From 9b0db4f7e2775ccc16f37d14bc09016e2e5b57ee Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 16:52:25 +0200
Subject: [PATCH 14/49] ongoing REST API

---
 package.json     |  1 +
 rest-examples.ts | 11 ++++++++++-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 6a343eb..ed7fea5 100644
--- a/package.json
+++ b/package.json
@@ -20,6 +20,7 @@
   "homepage": "https://github.com/angular-university/complete-typescript-course#readme",
   "devDependencies": {
     "@types/express": "^4.0.33",
+    "@types/express-serve-static-core": "^4.0.37",
     "@types/node": "^6.0.45",
     "@types/sequelize": "^4.0.38",
     "http-server": "^0.9.0",
diff --git a/rest-examples.ts b/rest-examples.ts
index b1ccbe7..b98ee98 100644
--- a/rest-examples.ts
+++ b/rest-examples.ts
@@ -4,6 +4,9 @@ import * as path from 'path';
 var bodyParser = require('body-parser');
 
 
+
+
+
 const port = 8090;
 
 const app = express();
@@ -16,7 +19,11 @@ app.use(bodyParser.json());
 app.use(express.static(root));
 
 
-function apiGetAllCourses(req: express.Request, res: express.Response) {
+function apiGetAllCourses(req:any, res:any) {
+
+
+
+
 
     res.status(200).send();
 
@@ -24,6 +31,8 @@ function apiGetAllCourses(req: express.Request, res: express.Response) {
 }
 
 
+
+
 app.route('/api/courses').get(apiGetAllCourses);
 
 

From c79aff293811a37f1a0cab91da38ccd057dd292b Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 17:18:11 +0200
Subject: [PATCH 15/49] ongoing REST API

---
 rest-examples.ts | 16 ++++++++++------
 sql-examples.ts  |  6 ++----
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/rest-examples.ts b/rest-examples.ts
index b98ee98..23165c5 100644
--- a/rest-examples.ts
+++ b/rest-examples.ts
@@ -1,6 +1,8 @@
 
 import * as express from 'express';
+import {Request, Response} from 'express';
 import * as path from 'path';
+import {findAllCourses} from "./src/queries/findAllCourses";
 var bodyParser = require('body-parser');
 
 
@@ -19,15 +21,17 @@ app.use(bodyParser.json());
 app.use(express.static(root));
 
 
-function apiGetAllCourses(req:any, res:any) {
 
 
+function apiGetAllCourses(req:Request, res:Response) {
+    findAllCourses()
+        .then((data:any) => {
+            res.status(200).json(data);
 
-
-
-    res.status(200).send();
-
-
+        })
+        .catch(() => {
+            res.status(500).send();
+        });
 }
 
 
diff --git a/sql-examples.ts b/sql-examples.ts
index d913bd0..b70dc93 100644
--- a/sql-examples.ts
+++ b/sql-examples.ts
@@ -3,12 +3,10 @@
 import {findAllCourses} from "./src/queries/findAllCourses";
 
 
-let lessons = findAllCourses();
+let courses = findAllCourses();
 
 
-
-
-lessons
+courses
     .then((data:any) => {
 
         console.log(data[0].dataValues);

From 8460e889eb6c9d0b46eb6b3ddda4cd3a59b9d526 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 17:26:38 +0200
Subject: [PATCH 16/49] ongoing REST API

---
 package.json | 1 -
 1 file changed, 1 deletion(-)

diff --git a/package.json b/package.json
index ed7fea5..6a343eb 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,6 @@
   "homepage": "https://github.com/angular-university/complete-typescript-course#readme",
   "devDependencies": {
     "@types/express": "^4.0.33",
-    "@types/express-serve-static-core": "^4.0.37",
     "@types/node": "^6.0.45",
     "@types/sequelize": "^4.0.38",
     "http-server": "^0.9.0",

From 1ca541426875ffc8543664d33ad698fe1d952e65 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 17:29:45 +0200
Subject: [PATCH 17/49] ongoing REST API

---
 rest-examples.ts            | 20 +++-----------------
 src/api/api.ts              | 11 +++++++++++
 src/api/apiGetAllCourses.ts | 14 ++++++++++++++
 3 files changed, 28 insertions(+), 17 deletions(-)
 create mode 100644 src/api/api.ts
 create mode 100644 src/api/apiGetAllCourses.ts

diff --git a/rest-examples.ts b/rest-examples.ts
index 23165c5..5926a1f 100644
--- a/rest-examples.ts
+++ b/rest-examples.ts
@@ -1,8 +1,8 @@
 
 import * as express from 'express';
-import {Request, Response} from 'express';
+
 import * as path from 'path';
-import {findAllCourses} from "./src/queries/findAllCourses";
+import {initApi} from "./src/api/api";
 var bodyParser = require('body-parser');
 
 
@@ -20,24 +20,10 @@ let root = path.join(path.resolve(__dirname, '.'));
 app.use(bodyParser.json());
 app.use(express.static(root));
 
+initApi(app);
 
 
 
-function apiGetAllCourses(req:Request, res:Response) {
-    findAllCourses()
-        .then((data:any) => {
-            res.status(200).json(data);
-
-        })
-        .catch(() => {
-            res.status(500).send();
-        });
-}
-
-
-
-
-app.route('/api/courses').get(apiGetAllCourses);
 
 
 
diff --git a/src/api/api.ts b/src/api/api.ts
new file mode 100644
index 0000000..4e3aaf6
--- /dev/null
+++ b/src/api/api.ts
@@ -0,0 +1,11 @@
+
+
+import {apiGetAllCourses} from "./apiGetAllCourses";
+import {Application} from "express";
+
+
+export function initApi(app: Application) {
+
+    app.route('/api/courses').get(apiGetAllCourses);
+
+}
\ No newline at end of file
diff --git a/src/api/apiGetAllCourses.ts b/src/api/apiGetAllCourses.ts
new file mode 100644
index 0000000..81d92f0
--- /dev/null
+++ b/src/api/apiGetAllCourses.ts
@@ -0,0 +1,14 @@
+
+import {Request, Response} from 'express';
+import {findAllCourses} from "../queries/findAllCourses";
+
+export function apiGetAllCourses(req:Request, res:Response) {
+    findAllCourses()
+        .then((data:any) => {
+            res.status(200).json(data);
+
+        })
+        .catch(() => {
+            res.status(500).send();
+        });
+}

From 421a6dce74e0c015ca61b49ba2bc271d046dba83 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 17:31:07 +0200
Subject: [PATCH 18/49] ongoing REST API

---
 package.json                  | 2 +-
 rest-examples.ts => server.ts | 0
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename rest-examples.ts => server.ts (100%)

diff --git a/package.json b/package.json
index 6a343eb..d591ce6 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
   "scripts": {
     "hello": "./node_modules/.bin/ts-node ./hello-world.ts",
     "sql": "./node_modules/.bin/ts-node ./sql-examples.ts",
-    "rest": "./node_modules/.bin/ts-node ./rest-examples.ts"
+    "server": "./node_modules/.bin/ts-node ./server.ts"
   },
   "repository": {
     "type": "git",
diff --git a/rest-examples.ts b/server.ts
similarity index 100%
rename from rest-examples.ts
rename to server.ts

From 782fcdfe75dbf8a52672343750156c3e474a2d15 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 17:32:12 +0200
Subject: [PATCH 19/49] ongoing REST API

---
 src/api/apiGetAllCourses.ts | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/api/apiGetAllCourses.ts b/src/api/apiGetAllCourses.ts
index 81d92f0..e3ebe83 100644
--- a/src/api/apiGetAllCourses.ts
+++ b/src/api/apiGetAllCourses.ts
@@ -2,6 +2,10 @@
 import {Request, Response} from 'express';
 import {findAllCourses} from "../queries/findAllCourses";
 
+
+
+
+
 export function apiGetAllCourses(req:Request, res:Response) {
     findAllCourses()
         .then((data:any) => {

From b642b440b2b2794baf35815e2e03c9578910d2ff Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 18:15:37 +0200
Subject: [PATCH 20/49] ongoing REST API

---
 package.json                |  4 +++-
 src/api/apiErrorHandler.ts  | 22 ++++++++++++++++++++++
 src/api/apiGetAllCourses.ts | 10 +++++++---
 server.ts => src/server.ts  |  4 +++-
 4 files changed, 35 insertions(+), 5 deletions(-)
 create mode 100644 src/api/apiErrorHandler.ts
 rename server.ts => src/server.ts (77%)

diff --git a/package.json b/package.json
index d591ce6..dd8e1d1 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,8 @@
   "scripts": {
     "hello": "./node_modules/.bin/ts-node ./hello-world.ts",
     "sql": "./node_modules/.bin/ts-node ./sql-examples.ts",
-    "server": "./node_modules/.bin/ts-node ./server.ts"
+    "server": "./node_modules/.bin/ts-node ./src/server.ts",
+    "watch": "./node_modules/.bin/nodemon -V -w src --ext \".ts\" --exec \"npm run server\""
   },
   "repository": {
     "type": "git",
@@ -23,6 +24,7 @@
     "@types/node": "^6.0.45",
     "@types/sequelize": "^4.0.38",
     "http-server": "^0.9.0",
+    "nodemon": "^1.11.0",
     "ts-node": "^1.6.0",
     "typescript": "^2.0.3"
   },
diff --git a/src/api/apiErrorHandler.ts b/src/api/apiErrorHandler.ts
new file mode 100644
index 0000000..5b7281d
--- /dev/null
+++ b/src/api/apiErrorHandler.ts
@@ -0,0 +1,22 @@
+
+import {Request, Response, RequestHandler, ErrorRequestHandler, NextFunction} from 'express';
+
+
+
+
+
+export const apiErrorHandler: ErrorRequestHandler =  (err: any, req: Request, res: Response, next: NextFunction) => {
+
+    console.log('error handler triggered');
+
+    if (req.xhr) {
+        res.status(500).send({ error: 'Something failed!' });
+    } else {
+        console.log('not an ajax request, continuing....');
+        next(err);
+    }
+
+
+};
+
+
diff --git a/src/api/apiGetAllCourses.ts b/src/api/apiGetAllCourses.ts
index e3ebe83..102f578 100644
--- a/src/api/apiGetAllCourses.ts
+++ b/src/api/apiGetAllCourses.ts
@@ -7,12 +7,16 @@ import {findAllCourses} from "../queries/findAllCourses";
 
 
 export function apiGetAllCourses(req:Request, res:Response) {
+
+    throw new Error("Error occurred");
+
+    /*
+
     findAllCourses()
         .then((data:any) => {
             res.status(200).json(data);
 
-        })
-        .catch(() => {
-            res.status(500).send();
         });
+
+    */
 }
diff --git a/server.ts b/src/server.ts
similarity index 77%
rename from server.ts
rename to src/server.ts
index 5926a1f..c57ee76 100644
--- a/server.ts
+++ b/src/server.ts
@@ -2,7 +2,8 @@
 import * as express from 'express';
 
 import * as path from 'path';
-import {initApi} from "./src/api/api";
+import {initApi} from "./api/api";
+import {apiErrorHandler} from "./api/apiErrorHandler";
 var bodyParser = require('body-parser');
 
 
@@ -23,6 +24,7 @@ app.use(express.static(root));
 initApi(app);
 
 
+app.use(apiErrorHandler);
 
 
 

From 2c2ac82fc1037043b8aac8cf94f321ddd0f492f3 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 18:23:00 +0200
Subject: [PATCH 21/49] ongoing REST API

---
 package.json                    |  2 +-
 src/api/fallbackErrorHandler.ts | 17 +++++++++++++++++
 src/server.ts                   |  4 +++-
 3 files changed, 21 insertions(+), 2 deletions(-)
 create mode 100644 src/api/fallbackErrorHandler.ts

diff --git a/package.json b/package.json
index dd8e1d1..9cd4577 100644
--- a/package.json
+++ b/package.json
@@ -7,7 +7,7 @@
     "hello": "./node_modules/.bin/ts-node ./hello-world.ts",
     "sql": "./node_modules/.bin/ts-node ./sql-examples.ts",
     "server": "./node_modules/.bin/ts-node ./src/server.ts",
-    "watch": "./node_modules/.bin/nodemon -V -w src --ext \".ts\" --exec \"npm run server\""
+    "watch": "./node_modules/.bin/nodemon -w src --ext \".ts\" --exec \"npm run server\""
   },
   "repository": {
     "type": "git",
diff --git a/src/api/fallbackErrorHandler.ts b/src/api/fallbackErrorHandler.ts
new file mode 100644
index 0000000..78bdf49
--- /dev/null
+++ b/src/api/fallbackErrorHandler.ts
@@ -0,0 +1,17 @@
+
+
+import {ErrorRequestHandler} from 'express';
+import {NextFunction} from "express-serve-static-core";
+import {Response} from "express-serve-static-core";
+import {Request} from "express-serve-static-core";
+
+
+
+
+export function fallbackErrorHandler(err: any, req: Request, res: Response, next: NextFunction) {
+
+    res.status(500).send();
+
+}
+
+
diff --git a/src/server.ts b/src/server.ts
index c57ee76..a5a9381 100644
--- a/src/server.ts
+++ b/src/server.ts
@@ -4,6 +4,8 @@ import * as express from 'express';
 import * as path from 'path';
 import {initApi} from "./api/api";
 import {apiErrorHandler} from "./api/apiErrorHandler";
+import {fallbackErrorHandler} from "./api/fallbackErrorHandler";
+
 var bodyParser = require('body-parser');
 
 
@@ -25,7 +27,7 @@ initApi(app);
 
 
 app.use(apiErrorHandler);
-
+app.use(fallbackErrorHandler);
 
 
 

From d2fd1f9d1f9826f3bfcf5a6e7c3bd54b52864447 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 18:23:39 +0200
Subject: [PATCH 22/49] ongoing REST API

---
 src/api/fallbackErrorHandler.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/api/fallbackErrorHandler.ts b/src/api/fallbackErrorHandler.ts
index 78bdf49..1a82718 100644
--- a/src/api/fallbackErrorHandler.ts
+++ b/src/api/fallbackErrorHandler.ts
@@ -10,7 +10,7 @@ import {Request} from "express-serve-static-core";
 
 export function fallbackErrorHandler(err: any, req: Request, res: Response, next: NextFunction) {
 
-    res.status(500).send();
+    res.status(500).send("Error Occurred.");
 
 }
 

From f17da8a6b1029ef48ae79485bc00764ae546643d Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Tue, 18 Oct 2016 18:32:36 +0200
Subject: [PATCH 23/49] ongoing REST API

---
 package.json                | 1 -
 src/api/apiGetAllCourses.ts | 7 -------
 src/server.ts               | 3 +++
 3 files changed, 3 insertions(+), 8 deletions(-)

diff --git a/package.json b/package.json
index 9cd4577..9ac62ec 100644
--- a/package.json
+++ b/package.json
@@ -32,7 +32,6 @@
     "body-parser": "^1.15.2",
     "express": "^4.14.0",
     "pg": "^6.1.0",
-    "response-time": "^2.3.1",
     "sequelize": "^3.24.4"
   }
 }
diff --git a/src/api/apiGetAllCourses.ts b/src/api/apiGetAllCourses.ts
index 102f578..e44f065 100644
--- a/src/api/apiGetAllCourses.ts
+++ b/src/api/apiGetAllCourses.ts
@@ -7,16 +7,9 @@ import {findAllCourses} from "../queries/findAllCourses";
 
 
 export function apiGetAllCourses(req:Request, res:Response) {
-
-    throw new Error("Error occurred");
-
-    /*
-
     findAllCourses()
         .then((data:any) => {
             res.status(200).json(data);
 
         });
-
-    */
 }
diff --git a/src/server.ts b/src/server.ts
index a5a9381..cc94a48 100644
--- a/src/server.ts
+++ b/src/server.ts
@@ -21,8 +21,11 @@ let root = path.join(path.resolve(__dirname, '.'));
 
 
 app.use(bodyParser.json());
+
 app.use(express.static(root));
 
+
+
 initApi(app);
 
 

From a852ff9cac2071987f2d6081e2fbd1ff0e35b291 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 10:16:45 +0200
Subject: [PATCH 24/49] ongoing REST API

---
 package.json                  |  6 ++++--
 src/api/apiGetAllCourses.ts   | 12 +++++++-----
 src/api/onError.ts            |  9 +++++++++
 src/api/onSuccess.ts          |  6 ++++++
 src/queries/findAllCourses.ts |  3 ++-
 5 files changed, 28 insertions(+), 8 deletions(-)
 create mode 100644 src/api/onError.ts
 create mode 100644 src/api/onSuccess.ts

diff --git a/package.json b/package.json
index 9ac62ec..d014cc2 100644
--- a/package.json
+++ b/package.json
@@ -6,8 +6,8 @@
   "scripts": {
     "hello": "./node_modules/.bin/ts-node ./hello-world.ts",
     "sql": "./node_modules/.bin/ts-node ./sql-examples.ts",
-    "server": "./node_modules/.bin/ts-node ./src/server.ts",
-    "watch": "./node_modules/.bin/nodemon -w src --ext \".ts\" --exec \"npm run server\""
+    "start": "./node_modules/.bin/ts-node ./src/server.ts",
+    "watch": "./node_modules/.bin/nodemon -w src --ext \".ts\" --exec \"npm run start\""
   },
   "repository": {
     "type": "git",
@@ -21,6 +21,7 @@
   "homepage": "https://github.com/angular-university/complete-typescript-course#readme",
   "devDependencies": {
     "@types/express": "^4.0.33",
+    "@types/lodash": "^4.14.37",
     "@types/node": "^6.0.45",
     "@types/sequelize": "^4.0.38",
     "http-server": "^0.9.0",
@@ -31,6 +32,7 @@
   "dependencies": {
     "body-parser": "^1.15.2",
     "express": "^4.14.0",
+    "lodash": "^4.16.4",
     "pg": "^6.1.0",
     "sequelize": "^3.24.4"
   }
diff --git a/src/api/apiGetAllCourses.ts b/src/api/apiGetAllCourses.ts
index e44f065..db23595 100644
--- a/src/api/apiGetAllCourses.ts
+++ b/src/api/apiGetAllCourses.ts
@@ -1,15 +1,17 @@
 
 import {Request, Response} from 'express';
 import {findAllCourses} from "../queries/findAllCourses";
+import * as _ from 'lodash';
+import {onSuccess} from "./onSuccess";
+import {onError} from "./onError";
 
 
 
 
 
-export function apiGetAllCourses(req:Request, res:Response) {
-    findAllCourses()
-        .then((data:any) => {
-            res.status(200).json(data);
 
-        });
+export function apiGetAllCourses(req:Request, res:Response) {
+        findAllCourses()
+            .then(_.partial(onSuccess, res))
+            .catch( _.partial(onError, res, "Could not find all courses") );
 }
diff --git a/src/api/onError.ts b/src/api/onError.ts
new file mode 100644
index 0000000..22616e1
--- /dev/null
+++ b/src/api/onError.ts
@@ -0,0 +1,9 @@
+
+import {Request, Response} from 'express';
+
+
+export function onError(res:Response, message: string, err:any) {
+    console.error(message, err);
+    res.status(500).send();
+
+}
diff --git a/src/api/onSuccess.ts b/src/api/onSuccess.ts
new file mode 100644
index 0000000..6c26826
--- /dev/null
+++ b/src/api/onSuccess.ts
@@ -0,0 +1,6 @@
+
+import {Request, Response} from 'express';
+
+export function onSuccess(res: Response, data:any) {
+    res.status(200).send(data);
+}
diff --git a/src/queries/findAllCourses.ts b/src/queries/findAllCourses.ts
index aa6c1aa..c2e4900 100644
--- a/src/queries/findAllCourses.ts
+++ b/src/queries/findAllCourses.ts
@@ -1,10 +1,11 @@
 
 import {CourseModel} from "../model";
 
+
 export function findAllCourses() {
     return CourseModel.findAll({
         order: ['seqNo']
-    });
+    })
 }
 
 

From 04197ac47875f7eebec377c6233a3de2eae5c016 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 10:44:43 +0200
Subject: [PATCH 25/49] ongoing REST API

---
 src/api/api.ts                | 11 +++++++++++
 src/api/apiCreateLesson.ts    |  7 +++++++
 src/api/apiDeleteLesson.ts    |  7 +++++++
 src/api/apiGetCourseDetail.ts |  6 ++++++
 src/api/apiPatchLesson.ts     |  6 ++++++
 5 files changed, 37 insertions(+)
 create mode 100644 src/api/apiCreateLesson.ts
 create mode 100644 src/api/apiDeleteLesson.ts
 create mode 100644 src/api/apiGetCourseDetail.ts
 create mode 100644 src/api/apiPatchLesson.ts

diff --git a/src/api/api.ts b/src/api/api.ts
index 4e3aaf6..6585dc6 100644
--- a/src/api/api.ts
+++ b/src/api/api.ts
@@ -2,10 +2,21 @@
 
 import {apiGetAllCourses} from "./apiGetAllCourses";
 import {Application} from "express";
+import {apiGetCourseDetail} from "./apiGetCourseDetail";
+import {apiPatchLesson} from "./apiPatchLesson";
+import {apiDeleteLesson} from "./apiDeleteLesson";
+import {apiCreateLesson} from "./apiCreateLesson";
 
 
 export function initApi(app: Application) {
 
     app.route('/api/courses').get(apiGetAllCourses);
+    app.route('/api/courses/:id').get(apiGetCourseDetail);
+
+
+    app.route('/api/lesson').patch(apiPatchLesson);
+    app.route('/api/lesson').delete(apiDeleteLesson);
+    app.route('/api/lesson').post(apiCreateLesson);
+
 
 }
\ No newline at end of file
diff --git a/src/api/apiCreateLesson.ts b/src/api/apiCreateLesson.ts
new file mode 100644
index 0000000..c9a7f20
--- /dev/null
+++ b/src/api/apiCreateLesson.ts
@@ -0,0 +1,7 @@
+
+import {Request, Response} from 'express';
+
+
+export function apiCreateLesson(req:Request, res:Response) {
+
+}
\ No newline at end of file
diff --git a/src/api/apiDeleteLesson.ts b/src/api/apiDeleteLesson.ts
new file mode 100644
index 0000000..c9cdd38
--- /dev/null
+++ b/src/api/apiDeleteLesson.ts
@@ -0,0 +1,7 @@
+
+import {Request, Response} from 'express';
+
+
+export function apiDeleteLesson(req:Request, res:Response) {
+
+}
\ No newline at end of file
diff --git a/src/api/apiGetCourseDetail.ts b/src/api/apiGetCourseDetail.ts
new file mode 100644
index 0000000..f220807
--- /dev/null
+++ b/src/api/apiGetCourseDetail.ts
@@ -0,0 +1,6 @@
+
+import {Request, Response} from 'express';
+
+export function apiGetCourseDetail(req:Request, res:Response) {
+
+}
\ No newline at end of file
diff --git a/src/api/apiPatchLesson.ts b/src/api/apiPatchLesson.ts
new file mode 100644
index 0000000..5c80ba3
--- /dev/null
+++ b/src/api/apiPatchLesson.ts
@@ -0,0 +1,6 @@
+
+import {Request, Response} from 'express';
+
+export function apiPatchLesson(req:Request, res:Response) {
+
+}
\ No newline at end of file

From 862084a8e82c2bc12303fcb71e56eff68cd5ffbc Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 11:10:39 +0200
Subject: [PATCH 26/49] ongoing REST API

---
 src/api/apiGetCourseDetail.ts   | 11 +++++++++++
 src/queries/findCourseDetail.ts |  7 +++++++
 2 files changed, 18 insertions(+)
 create mode 100644 src/queries/findCourseDetail.ts

diff --git a/src/api/apiGetCourseDetail.ts b/src/api/apiGetCourseDetail.ts
index f220807..0181673 100644
--- a/src/api/apiGetCourseDetail.ts
+++ b/src/api/apiGetCourseDetail.ts
@@ -1,6 +1,17 @@
 
 import {Request, Response} from 'express';
+import {findCourseDetail} from "../queries/findCourseDetail";
+import {onSuccess} from "./onSuccess";
+import {onError} from "./onError";
+
+
 
 export function apiGetCourseDetail(req:Request, res:Response) {
 
+    const courseId = req.params.id;
+
+    findCourseDetail(courseId)
+        .then(_.partial(onSuccess, res))
+        .catch( _.partial(onError, res, `Could not find course detail for id ${courseId}`) );
+
 }
\ No newline at end of file
diff --git a/src/queries/findCourseDetail.ts b/src/queries/findCourseDetail.ts
new file mode 100644
index 0000000..bf84635
--- /dev/null
+++ b/src/queries/findCourseDetail.ts
@@ -0,0 +1,7 @@
+
+
+export function findCourseDetail(courseId:string) {
+
+    return Promise.resolve({});
+
+}
\ No newline at end of file

From d9f0a997ef4cbfc27028239a30b1ccacb658fd36 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 11:24:22 +0200
Subject: [PATCH 27/49] ongoing REST API

---
 package.json                    |  1 +
 src/api/api.ts                  |  6 +++---
 src/api/apiPatchLesson.ts       | 19 ++++++++++++++++++-
 src/queries/findCourseDetail.ts |  2 ++
 src/queries/updateLesson.ts     |  9 +++++++++
 5 files changed, 33 insertions(+), 4 deletions(-)
 create mode 100644 src/queries/updateLesson.ts

diff --git a/package.json b/package.json
index d014cc2..2580032 100644
--- a/package.json
+++ b/package.json
@@ -20,6 +20,7 @@
   },
   "homepage": "https://github.com/angular-university/complete-typescript-course#readme",
   "devDependencies": {
+    "@types/es6-promise": "0.0.32",
     "@types/express": "^4.0.33",
     "@types/lodash": "^4.14.37",
     "@types/node": "^6.0.45",
diff --git a/src/api/api.ts b/src/api/api.ts
index 6585dc6..3b5f825 100644
--- a/src/api/api.ts
+++ b/src/api/api.ts
@@ -14,9 +14,9 @@ export function initApi(app: Application) {
     app.route('/api/courses/:id').get(apiGetCourseDetail);
 
 
-    app.route('/api/lesson').patch(apiPatchLesson);
-    app.route('/api/lesson').delete(apiDeleteLesson);
-    app.route('/api/lesson').post(apiCreateLesson);
+    app.route('/api/lesson/:id').patch(apiPatchLesson);
+    app.route('/api/lesson/:id').delete(apiDeleteLesson);
+    app.route('/api/lesson/:id').post(apiCreateLesson);
 
 
 }
\ No newline at end of file
diff --git a/src/api/apiPatchLesson.ts b/src/api/apiPatchLesson.ts
index 5c80ba3..dda0a1e 100644
--- a/src/api/apiPatchLesson.ts
+++ b/src/api/apiPatchLesson.ts
@@ -1,6 +1,23 @@
 
 import {Request, Response} from 'express';
+import {onSuccess} from "./onSuccess";
+import {onError} from "./onError";
+import {updateLesson} from "../queries/updateLesson";
+
+
+
+
+
+
 
 export function apiPatchLesson(req:Request, res:Response) {
 
-}
\ No newline at end of file
+    const lessonId = req.params.id;
+
+    updateLesson(lessonId, req.body)
+        .then(_.partial(onSuccess, res))
+        .catch( _.partial(onError, res, "Could not update lesson") );
+}
+
+
+
diff --git a/src/queries/findCourseDetail.ts b/src/queries/findCourseDetail.ts
index bf84635..a1cada7 100644
--- a/src/queries/findCourseDetail.ts
+++ b/src/queries/findCourseDetail.ts
@@ -1,4 +1,6 @@
 
+import {Promise} from 'es6-promise';
+
 
 export function findCourseDetail(courseId:string) {
 
diff --git a/src/queries/updateLesson.ts b/src/queries/updateLesson.ts
new file mode 100644
index 0000000..4ce2553
--- /dev/null
+++ b/src/queries/updateLesson.ts
@@ -0,0 +1,9 @@
+
+
+
+
+export function updateLesson(lessonId:string, updatedProperties: any) {
+
+    return Promise.resolve({});
+
+}
\ No newline at end of file

From 3e6498816f7405ab7243850cc674748590cd99fa Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 11:32:15 +0200
Subject: [PATCH 28/49] ongoing REST API

---
 src/api/apiCreateLesson.ts  |  9 +++++++++
 src/api/apiDeleteLesson.ts  |  9 +++++++++
 src/queries/createLesson.ts | 11 +++++++++++
 src/queries/deleteLesson.ts |  7 +++++++
 4 files changed, 36 insertions(+)
 create mode 100644 src/queries/createLesson.ts
 create mode 100644 src/queries/deleteLesson.ts

diff --git a/src/api/apiCreateLesson.ts b/src/api/apiCreateLesson.ts
index c9a7f20..da8a900 100644
--- a/src/api/apiCreateLesson.ts
+++ b/src/api/apiCreateLesson.ts
@@ -1,7 +1,16 @@
 
 import {Request, Response} from 'express';
+import {createLesson} from "../queries/createLesson";
+import {onSuccess} from "./onSuccess";
+import {onError} from "./onError";
 
 
 export function apiCreateLesson(req:Request, res:Response) {
 
+    const lessonId = req.params.id;
+
+    createLesson(lessonId, req.body)
+        .then(_.partial(onSuccess, res))
+        .catch( _.partial(onError, res, `Could not create lesson ${lessonId}`) );
+
 }
\ No newline at end of file
diff --git a/src/api/apiDeleteLesson.ts b/src/api/apiDeleteLesson.ts
index c9cdd38..049412f 100644
--- a/src/api/apiDeleteLesson.ts
+++ b/src/api/apiDeleteLesson.ts
@@ -1,7 +1,16 @@
 
 import {Request, Response} from 'express';
+import {onError} from "./onError";
+import {onSuccess} from "./onSuccess";
+import {deleteLesson} from "../queries/deleteLesson";
 
 
 export function apiDeleteLesson(req:Request, res:Response) {
 
+    const lessonId = req.params.id;
+
+    deleteLesson(lessonId, req.body)
+        .then(_.partial(onSuccess, res))
+        .catch( _.partial(onError, res, `Could not delete lesson ${lessonId}`) );
+
 }
\ No newline at end of file
diff --git a/src/queries/createLesson.ts b/src/queries/createLesson.ts
new file mode 100644
index 0000000..c5e2c35
--- /dev/null
+++ b/src/queries/createLesson.ts
@@ -0,0 +1,11 @@
+
+
+
+
+
+export function createLesson(lessonId:string, updatedProperties: any) {
+    return Promise.resolve({});
+}
+
+
+
diff --git a/src/queries/deleteLesson.ts b/src/queries/deleteLesson.ts
new file mode 100644
index 0000000..f712523
--- /dev/null
+++ b/src/queries/deleteLesson.ts
@@ -0,0 +1,7 @@
+
+
+
+export function deleteLesson(lessonId:string, updatedProperties: any) {
+    return Promise.resolve({});
+}
+

From 208b582b7a1d03922ef480fe1a142bdbf91764fd Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 12:04:05 +0200
Subject: [PATCH 29/49] ongoing REST API

---
 src/api/apiCreateLesson.ts      | 2 +-
 src/api/apiDeleteLesson.ts      | 2 +-
 src/api/apiGetCourseDetail.ts   | 4 ++--
 src/api/apiPatchLesson.ts       | 2 +-
 src/api/onError.ts              | 3 +++
 src/api/onSuccess.ts            | 5 ++++-
 src/queries/findCourseDetail.ts | 5 +++--
 7 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/src/api/apiCreateLesson.ts b/src/api/apiCreateLesson.ts
index da8a900..f379639 100644
--- a/src/api/apiCreateLesson.ts
+++ b/src/api/apiCreateLesson.ts
@@ -3,7 +3,7 @@ import {Request, Response} from 'express';
 import {createLesson} from "../queries/createLesson";
 import {onSuccess} from "./onSuccess";
 import {onError} from "./onError";
-
+import * as _ from 'lodash';
 
 export function apiCreateLesson(req:Request, res:Response) {
 
diff --git a/src/api/apiDeleteLesson.ts b/src/api/apiDeleteLesson.ts
index 049412f..cc2924d 100644
--- a/src/api/apiDeleteLesson.ts
+++ b/src/api/apiDeleteLesson.ts
@@ -3,7 +3,7 @@ import {Request, Response} from 'express';
 import {onError} from "./onError";
 import {onSuccess} from "./onSuccess";
 import {deleteLesson} from "../queries/deleteLesson";
-
+import * as _ from 'lodash';
 
 export function apiDeleteLesson(req:Request, res:Response) {
 
diff --git a/src/api/apiGetCourseDetail.ts b/src/api/apiGetCourseDetail.ts
index 0181673..c892df9 100644
--- a/src/api/apiGetCourseDetail.ts
+++ b/src/api/apiGetCourseDetail.ts
@@ -3,12 +3,12 @@ import {Request, Response} from 'express';
 import {findCourseDetail} from "../queries/findCourseDetail";
 import {onSuccess} from "./onSuccess";
 import {onError} from "./onError";
-
+import * as _ from 'lodash';
 
 
 export function apiGetCourseDetail(req:Request, res:Response) {
 
-    const courseId = req.params.id;
+    const courseId = parseInt(req.params.id);
 
     findCourseDetail(courseId)
         .then(_.partial(onSuccess, res))
diff --git a/src/api/apiPatchLesson.ts b/src/api/apiPatchLesson.ts
index dda0a1e..d19d210 100644
--- a/src/api/apiPatchLesson.ts
+++ b/src/api/apiPatchLesson.ts
@@ -3,7 +3,7 @@ import {Request, Response} from 'express';
 import {onSuccess} from "./onSuccess";
 import {onError} from "./onError";
 import {updateLesson} from "../queries/updateLesson";
-
+import * as _ from 'lodash';
 
 
 
diff --git a/src/api/onError.ts b/src/api/onError.ts
index 22616e1..79f8fdc 100644
--- a/src/api/onError.ts
+++ b/src/api/onError.ts
@@ -3,6 +3,9 @@ import {Request, Response} from 'express';
 
 
 export function onError(res:Response, message: string, err:any) {
+
+    console.log('onError', err);
+
     console.error(message, err);
     res.status(500).send();
 
diff --git a/src/api/onSuccess.ts b/src/api/onSuccess.ts
index 6c26826..c3e4630 100644
--- a/src/api/onSuccess.ts
+++ b/src/api/onSuccess.ts
@@ -2,5 +2,8 @@
 import {Request, Response} from 'express';
 
 export function onSuccess(res: Response, data:any) {
-    res.status(200).send(data);
+
+    console.log('OK');
+
+    res.status(200).json(data);
 }
diff --git a/src/queries/findCourseDetail.ts b/src/queries/findCourseDetail.ts
index a1cada7..302b821 100644
--- a/src/queries/findCourseDetail.ts
+++ b/src/queries/findCourseDetail.ts
@@ -1,9 +1,10 @@
 
 import {Promise} from 'es6-promise';
+import {CourseModel} from "../model";
 
 
-export function findCourseDetail(courseId:string) {
+export function findCourseDetail(courseId:number) {
 
-    return Promise.resolve({});
+    return CourseModel.findById(courseId);
 
 }
\ No newline at end of file

From 40e88bee061fa51905f696bee034c93de9349086 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 12:34:15 +0200
Subject: [PATCH 30/49] ongoing REST API

---
 src/api/apiGetCourseDetail.ts   |  4 +++-
 src/model/index.ts              | 10 ++++++----
 src/model/initCourseModel.ts    |  6 ------
 src/model/initLessonModel.ts    |  6 ------
 src/queries/findCourseDetail.ts | 10 ++++++++--
 5 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/src/api/apiGetCourseDetail.ts b/src/api/apiGetCourseDetail.ts
index c892df9..bfc2483 100644
--- a/src/api/apiGetCourseDetail.ts
+++ b/src/api/apiGetCourseDetail.ts
@@ -14,4 +14,6 @@ export function apiGetCourseDetail(req:Request, res:Response) {
         .then(_.partial(onSuccess, res))
         .catch( _.partial(onError, res, `Could not find course detail for id ${courseId}`) );
 
-}
\ No newline at end of file
+}
+
+
diff --git a/src/model/index.ts b/src/model/index.ts
index af65956..03da73b 100644
--- a/src/model/index.ts
+++ b/src/model/index.ts
@@ -5,16 +5,18 @@ import {initCourseModel} from "./initCourseModel";
 import {initLessonModel} from "./initLessonModel";
 
 
-
 const loggingConfig: LoggingOptions = {benchmark:true, logging:console.log};
 
 const dbUrl = 'postgres://postgres:postgres@localhost:5432/complete-typescript-course';
 
-export const sequelize = new Sequelize(dbUrl, loggingConfig);
+const sequelize = new Sequelize(dbUrl, loggingConfig);
+
 
+export const CourseModel:any = initCourseModel(sequelize);
 
-export const CourseModel = initCourseModel(sequelize);
+export const LessonModel:any = initLessonModel(sequelize);
 
-export const LessonModel = initLessonModel(sequelize);
 
+CourseModel.hasMany(LessonModel, {foreignKey: 'courseId'});
 
+LessonModel.belongsTo(CourseModel, {foreignKey: 'courseId'});
\ No newline at end of file
diff --git a/src/model/initCourseModel.ts b/src/model/initCourseModel.ts
index c4c9022..4988052 100644
--- a/src/model/initCourseModel.ts
+++ b/src/model/initCourseModel.ts
@@ -18,11 +18,5 @@ export function initCourseModel(sequelize:Sequelize) {
         isNew: ORM.BOOLEAN,
         isOngoing: ORM.BOOLEAN,
         visibleFrom: ORM.DATE
-    }, {
-        classMethods: {
-            associate: function (models:any) {
-                models.Course.hasMany(models.Lesson, {foreignKey: 'courseId'});
-            }
-        }
     });
 }
\ No newline at end of file
diff --git a/src/model/initLessonModel.ts b/src/model/initLessonModel.ts
index 03b01c5..2fb05bd 100644
--- a/src/model/initLessonModel.ts
+++ b/src/model/initLessonModel.ts
@@ -18,11 +18,5 @@ export function initLessonModel(sequelize:Sequelize) {
         vimeoid: ORM.STRING,
         gitHubUrl: ORM.STRING,
         downloadUrl: ORM.STRING
-    }, {
-        classMethods: {
-            associate: function (models:any) {
-                models.Lesson.belongsTo(models.Course, {foreignKey: 'courseId'});
-            }
-        }
     });
 }
\ No newline at end of file
diff --git a/src/queries/findCourseDetail.ts b/src/queries/findCourseDetail.ts
index 302b821..eb02d35 100644
--- a/src/queries/findCourseDetail.ts
+++ b/src/queries/findCourseDetail.ts
@@ -1,10 +1,16 @@
 
 import {Promise} from 'es6-promise';
-import {CourseModel} from "../model";
+import {CourseModel, LessonModel} from "../model";
 
 
 export function findCourseDetail(courseId:number) {
 
-    return CourseModel.findById(courseId);
+    return CourseModel.findById(courseId, {
+        include: [
+            {
+                model: LessonModel
+            }
+        ]
+    });
 
 }
\ No newline at end of file

From dea3586302181f952db4f5a2e4da411370e95fe6 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 13:06:56 +0200
Subject: [PATCH 31/49] ongoing REST API

---
 src/api/apiGetCourseDetail.ts | 13 +++++++++++++
 src/api/onSuccess.ts          |  3 ---
 src/queries/updateLesson.ts   |  5 +++--
 3 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/api/apiGetCourseDetail.ts b/src/api/apiGetCourseDetail.ts
index bfc2483..6870241 100644
--- a/src/api/apiGetCourseDetail.ts
+++ b/src/api/apiGetCourseDetail.ts
@@ -11,9 +11,22 @@ export function apiGetCourseDetail(req:Request, res:Response) {
     const courseId = parseInt(req.params.id);
 
     findCourseDetail(courseId)
+        .then(sortLessonsPerSeqNo)
         .then(_.partial(onSuccess, res))
         .catch( _.partial(onError, res, `Could not find course detail for id ${courseId}`) );
 
 }
 
 
+
+function sortLessonsPerSeqNo(result: any) {
+
+    const course = result.dataValues;
+
+    const courseWithSortedLessons = _.clone(course);
+
+    courseWithSortedLessons.lessons = _.sortBy( course.Lessons, ['seqNo']);
+
+    return Promise.resolve(courseWithSortedLessons);
+}
+
diff --git a/src/api/onSuccess.ts b/src/api/onSuccess.ts
index c3e4630..d26d548 100644
--- a/src/api/onSuccess.ts
+++ b/src/api/onSuccess.ts
@@ -2,8 +2,5 @@
 import {Request, Response} from 'express';
 
 export function onSuccess(res: Response, data:any) {
-
-    console.log('OK');
-
     res.status(200).json(data);
 }
diff --git a/src/queries/updateLesson.ts b/src/queries/updateLesson.ts
index 4ce2553..0b194fc 100644
--- a/src/queries/updateLesson.ts
+++ b/src/queries/updateLesson.ts
@@ -2,8 +2,9 @@
 
 
 
-export function updateLesson(lessonId:string, updatedProperties: any) {
+import {LessonModel} from "../model";
 
-    return Promise.resolve({});
 
+export function updateLesson(id:string, updatedProperties: any) {
+    return LessonModel.update(updatedProperties, {where: {id}});
 }
\ No newline at end of file

From face29d64d0c1390b8e1e90cf3c7c6d117ba8f18 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 13:36:32 +0200
Subject: [PATCH 32/49] ongoing REST API

---
 package.json                    |  3 ++-
 src/api/apiGetCourseDetail.ts   | 12 ------------
 src/queries/findCourseDetail.ts |  5 ++++-
 3 files changed, 6 insertions(+), 14 deletions(-)

diff --git a/package.json b/package.json
index 2580032..e0d36e7 100644
--- a/package.json
+++ b/package.json
@@ -7,7 +7,8 @@
     "hello": "./node_modules/.bin/ts-node ./hello-world.ts",
     "sql": "./node_modules/.bin/ts-node ./sql-examples.ts",
     "start": "./node_modules/.bin/ts-node ./src/server.ts",
-    "watch": "./node_modules/.bin/nodemon -w src --ext \".ts\" --exec \"npm run start\""
+    "watch": "./node_modules/.bin/nodemon -w src --ext \".ts\" --exec \"npm run start\"",
+    "debug": "node --inspect --debug-brk   ./src/server.js"
   },
   "repository": {
     "type": "git",
diff --git a/src/api/apiGetCourseDetail.ts b/src/api/apiGetCourseDetail.ts
index 6870241..300a8ac 100644
--- a/src/api/apiGetCourseDetail.ts
+++ b/src/api/apiGetCourseDetail.ts
@@ -11,7 +11,6 @@ export function apiGetCourseDetail(req:Request, res:Response) {
     const courseId = parseInt(req.params.id);
 
     findCourseDetail(courseId)
-        .then(sortLessonsPerSeqNo)
         .then(_.partial(onSuccess, res))
         .catch( _.partial(onError, res, `Could not find course detail for id ${courseId}`) );
 
@@ -19,14 +18,3 @@ export function apiGetCourseDetail(req:Request, res:Response) {
 
 
 
-function sortLessonsPerSeqNo(result: any) {
-
-    const course = result.dataValues;
-
-    const courseWithSortedLessons = _.clone(course);
-
-    courseWithSortedLessons.lessons = _.sortBy( course.Lessons, ['seqNo']);
-
-    return Promise.resolve(courseWithSortedLessons);
-}
-
diff --git a/src/queries/findCourseDetail.ts b/src/queries/findCourseDetail.ts
index eb02d35..3276abe 100644
--- a/src/queries/findCourseDetail.ts
+++ b/src/queries/findCourseDetail.ts
@@ -1,5 +1,5 @@
 
-import {Promise} from 'es6-promise';
+
 import {CourseModel, LessonModel} from "../model";
 
 
@@ -10,6 +10,9 @@ export function findCourseDetail(courseId:number) {
             {
                 model: LessonModel
             }
+        ],
+        order: [
+            [ LessonModel, 'seqNo' , 'ASC']
         ]
     });
 

From 771a968eb1f84f1e946c1ede6d2ea1f53b44459d Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 14:53:10 +0200
Subject: [PATCH 33/49] ongoing REST API

---
 src/api/apiDeleteLesson.ts  | 2 +-
 src/model/index.ts          | 4 ++--
 src/queries/deleteLesson.ts | 8 ++++++--
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/api/apiDeleteLesson.ts b/src/api/apiDeleteLesson.ts
index cc2924d..38bd660 100644
--- a/src/api/apiDeleteLesson.ts
+++ b/src/api/apiDeleteLesson.ts
@@ -9,7 +9,7 @@ export function apiDeleteLesson(req:Request, res:Response) {
 
     const lessonId = req.params.id;
 
-    deleteLesson(lessonId, req.body)
+    deleteLesson(lessonId)
         .then(_.partial(onSuccess, res))
         .catch( _.partial(onError, res, `Could not delete lesson ${lessonId}`) );
 
diff --git a/src/model/index.ts b/src/model/index.ts
index 03da73b..8d2b329 100644
--- a/src/model/index.ts
+++ b/src/model/index.ts
@@ -12,9 +12,9 @@ const dbUrl = 'postgres://postgres:postgres@localhost:5432/complete-typescript-c
 const sequelize = new Sequelize(dbUrl, loggingConfig);
 
 
-export const CourseModel:any = initCourseModel(sequelize);
+export const CourseModel = initCourseModel(sequelize);
 
-export const LessonModel:any = initLessonModel(sequelize);
+export const LessonModel = initLessonModel(sequelize);
 
 
 CourseModel.hasMany(LessonModel, {foreignKey: 'courseId'});
diff --git a/src/queries/deleteLesson.ts b/src/queries/deleteLesson.ts
index f712523..0c9974e 100644
--- a/src/queries/deleteLesson.ts
+++ b/src/queries/deleteLesson.ts
@@ -1,7 +1,11 @@
 
 
 
-export function deleteLesson(lessonId:string, updatedProperties: any) {
-    return Promise.resolve({});
+import {LessonModel} from "../model";
+
+export function deleteLesson(id:string) {
+    return LessonModel.destroy({
+        where: {id}
+    });
 }
 

From 8260fcf5ca9bfef6d309a92c35efc9cff2428f57 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 15:06:47 +0200
Subject: [PATCH 34/49] ongoing REST API

---
 src/queries/createLesson.ts | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/queries/createLesson.ts b/src/queries/createLesson.ts
index c5e2c35..b66486c 100644
--- a/src/queries/createLesson.ts
+++ b/src/queries/createLesson.ts
@@ -3,8 +3,13 @@
 
 
 
-export function createLesson(lessonId:string, updatedProperties: any) {
-    return Promise.resolve({});
+import {LessonModel} from "../model";
+
+export function createLesson(id:string, props: any) {
+    return LessonModel.findOrCreate({
+        where: {id},
+        defaults: props
+    });
 }
 
 

From c9b125a735d2d385330a92704e50690b386aba0b Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 15:07:57 +0200
Subject: [PATCH 35/49] ongoing REST API

---
 package.json                                | 2 +-
 {src => server}/api/api.ts                  | 0
 {src => server}/api/apiCreateLesson.ts      | 0
 {src => server}/api/apiDeleteLesson.ts      | 0
 {src => server}/api/apiErrorHandler.ts      | 0
 {src => server}/api/apiGetAllCourses.ts     | 0
 {src => server}/api/apiGetCourseDetail.ts   | 0
 {src => server}/api/apiPatchLesson.ts       | 0
 {src => server}/api/fallbackErrorHandler.ts | 0
 {src => server}/api/onError.ts              | 0
 {src => server}/api/onSuccess.ts            | 0
 {src => server}/model/index.ts              | 0
 {src => server}/model/initCourseModel.ts    | 0
 {src => server}/model/initLessonModel.ts    | 0
 {src => server}/queries/createLesson.ts     | 0
 {src => server}/queries/deleteLesson.ts     | 0
 {src => server}/queries/findAllCourses.ts   | 0
 {src => server}/queries/findCourseDetail.ts | 0
 {src => server}/queries/updateLesson.ts     | 0
 {src => server}/server.ts                   | 2 +-
 20 files changed, 2 insertions(+), 2 deletions(-)
 rename {src => server}/api/api.ts (100%)
 rename {src => server}/api/apiCreateLesson.ts (100%)
 rename {src => server}/api/apiDeleteLesson.ts (100%)
 rename {src => server}/api/apiErrorHandler.ts (100%)
 rename {src => server}/api/apiGetAllCourses.ts (100%)
 rename {src => server}/api/apiGetCourseDetail.ts (100%)
 rename {src => server}/api/apiPatchLesson.ts (100%)
 rename {src => server}/api/fallbackErrorHandler.ts (100%)
 rename {src => server}/api/onError.ts (100%)
 rename {src => server}/api/onSuccess.ts (100%)
 rename {src => server}/model/index.ts (100%)
 rename {src => server}/model/initCourseModel.ts (100%)
 rename {src => server}/model/initLessonModel.ts (100%)
 rename {src => server}/queries/createLesson.ts (100%)
 rename {src => server}/queries/deleteLesson.ts (100%)
 rename {src => server}/queries/findAllCourses.ts (100%)
 rename {src => server}/queries/findCourseDetail.ts (100%)
 rename {src => server}/queries/updateLesson.ts (100%)
 rename {src => server}/server.ts (91%)

diff --git a/package.json b/package.json
index e0d36e7..e4d6fb5 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
   "scripts": {
     "hello": "./node_modules/.bin/ts-node ./hello-world.ts",
     "sql": "./node_modules/.bin/ts-node ./sql-examples.ts",
-    "start": "./node_modules/.bin/ts-node ./src/server.ts",
+    "start": "./node_modules/.bin/ts-node ./server/server.ts",
     "watch": "./node_modules/.bin/nodemon -w src --ext \".ts\" --exec \"npm run start\"",
     "debug": "node --inspect --debug-brk   ./src/server.js"
   },
diff --git a/src/api/api.ts b/server/api/api.ts
similarity index 100%
rename from src/api/api.ts
rename to server/api/api.ts
diff --git a/src/api/apiCreateLesson.ts b/server/api/apiCreateLesson.ts
similarity index 100%
rename from src/api/apiCreateLesson.ts
rename to server/api/apiCreateLesson.ts
diff --git a/src/api/apiDeleteLesson.ts b/server/api/apiDeleteLesson.ts
similarity index 100%
rename from src/api/apiDeleteLesson.ts
rename to server/api/apiDeleteLesson.ts
diff --git a/src/api/apiErrorHandler.ts b/server/api/apiErrorHandler.ts
similarity index 100%
rename from src/api/apiErrorHandler.ts
rename to server/api/apiErrorHandler.ts
diff --git a/src/api/apiGetAllCourses.ts b/server/api/apiGetAllCourses.ts
similarity index 100%
rename from src/api/apiGetAllCourses.ts
rename to server/api/apiGetAllCourses.ts
diff --git a/src/api/apiGetCourseDetail.ts b/server/api/apiGetCourseDetail.ts
similarity index 100%
rename from src/api/apiGetCourseDetail.ts
rename to server/api/apiGetCourseDetail.ts
diff --git a/src/api/apiPatchLesson.ts b/server/api/apiPatchLesson.ts
similarity index 100%
rename from src/api/apiPatchLesson.ts
rename to server/api/apiPatchLesson.ts
diff --git a/src/api/fallbackErrorHandler.ts b/server/api/fallbackErrorHandler.ts
similarity index 100%
rename from src/api/fallbackErrorHandler.ts
rename to server/api/fallbackErrorHandler.ts
diff --git a/src/api/onError.ts b/server/api/onError.ts
similarity index 100%
rename from src/api/onError.ts
rename to server/api/onError.ts
diff --git a/src/api/onSuccess.ts b/server/api/onSuccess.ts
similarity index 100%
rename from src/api/onSuccess.ts
rename to server/api/onSuccess.ts
diff --git a/src/model/index.ts b/server/model/index.ts
similarity index 100%
rename from src/model/index.ts
rename to server/model/index.ts
diff --git a/src/model/initCourseModel.ts b/server/model/initCourseModel.ts
similarity index 100%
rename from src/model/initCourseModel.ts
rename to server/model/initCourseModel.ts
diff --git a/src/model/initLessonModel.ts b/server/model/initLessonModel.ts
similarity index 100%
rename from src/model/initLessonModel.ts
rename to server/model/initLessonModel.ts
diff --git a/src/queries/createLesson.ts b/server/queries/createLesson.ts
similarity index 100%
rename from src/queries/createLesson.ts
rename to server/queries/createLesson.ts
diff --git a/src/queries/deleteLesson.ts b/server/queries/deleteLesson.ts
similarity index 100%
rename from src/queries/deleteLesson.ts
rename to server/queries/deleteLesson.ts
diff --git a/src/queries/findAllCourses.ts b/server/queries/findAllCourses.ts
similarity index 100%
rename from src/queries/findAllCourses.ts
rename to server/queries/findAllCourses.ts
diff --git a/src/queries/findCourseDetail.ts b/server/queries/findCourseDetail.ts
similarity index 100%
rename from src/queries/findCourseDetail.ts
rename to server/queries/findCourseDetail.ts
diff --git a/src/queries/updateLesson.ts b/server/queries/updateLesson.ts
similarity index 100%
rename from src/queries/updateLesson.ts
rename to server/queries/updateLesson.ts
diff --git a/src/server.ts b/server/server.ts
similarity index 91%
rename from src/server.ts
rename to server/server.ts
index cc94a48..a1a250c 100644
--- a/src/server.ts
+++ b/server/server.ts
@@ -17,7 +17,7 @@ const port = 8090;
 const app = express();
 
 
-let root = path.join(path.resolve(__dirname, '.'));
+let root = path.join(path.resolve(__dirname, '..'));
 
 
 app.use(bodyParser.json());

From 09be4e4cb04ac25e6df46b20010fb6f81e74358b Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 15:13:44 +0200
Subject: [PATCH 36/49] ongoing REST API

---
 db-schema-create-and-populate.sql | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/db-schema-create-and-populate.sql b/db-schema-create-and-populate.sql
index 4e8460d..32cbe31 100644
--- a/db-schema-create-and-populate.sql
+++ b/db-schema-create-and-populate.sql
@@ -57,21 +57,21 @@ CREATE UNIQUE INDEX "sortByUrl"
   (url COLLATE pg_catalog."default");
 
 
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (3, 'angular2-pipes', 'Angular 2 Pipes', '<p class=''course-description''>Learn how to leverage Pipes in Angular 2, both stateless and stateful.</p>', 3, 'https://angular-academy.s3.amazonaws.com/course-logos/pipes.jpg', true, false, true, '2100-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-06-10 21:54:55.142+02', NULL);
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (2, 'angular2-components-and-directives', 'Angular 2 Components and Directives', '<p class=''course-description''>Learn Components and maybe the most useful feature of Angular 2: Directives.</p>', 2, 'https://angular-academy.s3.amazonaws.com/course-logos/components-and-directives.svg', true, false, true, '2100-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-06-10 21:54:55.16+02', NULL);
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (5, 'build-an-application-with-angular2', 'Build a Web App with Angular 2 and Firebase', '<p class=''course-description''>Put all the concepts together to build a fully running Angular 2 application using Firebase as the database.</p>', 4, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular_app-firebase-small.jpg', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.671+02', 'https://angular-academy.s3.amazonaws.com/thumbnails/firebase-logo.jpg');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (10, 'angular2-rxjs-observable-data-services', 'RxJs Observable Data Services', '<p class=''course-description''>Use RxJs to build service layers using the Observable Data Service Pattern.</p>', 8, 'https://angular-academy.s3.amazonaws.com/thumbnails/observable-data-services.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.697+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (7, 'angular2-routing', 'Angular 2 Router', '<p class=''course-description''>Build Single Page Applications with Angular 2 and its powerful Router.</p>', 3, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-routing-small.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.698+02', '/src/images/router-icon.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (8, 'module-loaders-and-systemjs', 'Module Loaders and Webpack 2', '<p class=''course-description''>Learn how Module Loaders Work - Learn Webpack 2 and its Plugin Ecosystem.</p>', 7, 'https://angular-academy.s3.amazonaws.com/thumbnails/webpack-small.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.699+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (11, 'angular2-ngrx', 'NgRx Angular 2 Reactive Extensions', '<p class=''course-description''>Learn some of the most useful libraries in the Angular 2 Ecosystem.</p>', 9, 'https://angular-academy.s3.amazonaws.com/thumbnails/ngrx.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.715+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (12, 'angular2-universal', 'Angular 2 Universal', '<p class=''course-description''>Learn maybe the biggest game changing technology in the Angular 2 Ecosystem.</p>', 10, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular_universal.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.736+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (4, 'angular2-forms', 'Angular 2 Forms', '<p class=''course-description''>Learn how to build validatable and user-friendly data Forms effectively.</p>', 3, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular-forms-small.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.611+02', 'https://angular-academy.s3.amazonaws.com/course-logos/lesson-icons/forms.jpg');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (9, 'angular2-http', 'Angular 2 HTTP and Services', '<p class=''course-description''>Build Services using Observables, learn to use the HTTP module effectively.</p>', 1, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular-http.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.632+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (13, 'angular2-progressive-web-applications', 'Angular 2 Progressive Web Apps', '<p class=''course-description''>Learn the Future of Mobile development: Progressive Web Applications.</p>', 11, 'https://angular-academy.s3.amazonaws.com/thumbnails/pwa.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.75+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (6, 'angular2-advanced-components', 'Angular 2 Advanced Components', '<p class=''course-description''>A deep dive on Components, focusing on commonly needed advanced use cases.</p>', 5, 'https://angular-academy.s3.amazonaws.com/thumbnails/advanced-components.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.63+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (1, 'getting-started-with-angular2', 'Angular 2 Tutorial For Beginners', '<p class=''course-description''>Establish a solid layer of fundamentals, learn what''s under the hood of Angular 2</p>', 0, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-for-beginners-small.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.606+02', 'https://angular-academy.s3.amazonaws.com/main-logo/main-page-logo-small-hat.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (14, 'angular2-architecture', 'Angular 2 Architecture', '<p class=''course-description''>Learn how to build next-generation (Post-REST ?) user interfaces in Angular 2.</p>', 12, 'https://angular-academy.s3.amazonaws.com/thumbnails/architecture.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-08-16 15:55:24.236181+02', '2016-10-07 21:16:20.75+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (15, 'angular2-security', 'Angular 2 Security', '<p class=''course-description''>Learn how to build secure Angular 2 Applications Using JSON Web Tokens.</p>', 13, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-security.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-08-16 15:59:06.727615+02', '2016-10-07 21:16:20.751+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (3, 'angular2-pipes', 'Angular 2 Pipes', 'Learn how to leverage Pipes in Angular 2, both stateless and stateful.', 3, 'https://angular-academy.s3.amazonaws.com/course-logos/pipes.jpg', true, false, true, '2100-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-06-10 21:54:55.142+02', NULL);
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (2, 'angular2-components-and-directives', 'Angular 2 Components and Directives', 'Learn Components and maybe the most useful feature of Angular 2: Directives.', 2, 'https://angular-academy.s3.amazonaws.com/course-logos/components-and-directives.svg', true, false, true, '2100-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-06-10 21:54:55.16+02', NULL);
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (5, 'build-an-application-with-angular2', 'Build a Web App with Angular 2 and Firebase', 'Put all the concepts together to build a fully running Angular 2 application using Firebase as the database.', 4, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular_app-firebase-small.jpg', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.671+02', 'https://angular-academy.s3.amazonaws.com/thumbnails/firebase-logo.jpg');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (10, 'angular2-rxjs-observable-data-services', 'RxJs Observable Data Services', 'Use RxJs to build service layers using the Observable Data Service Pattern.', 8, 'https://angular-academy.s3.amazonaws.com/thumbnails/observable-data-services.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.697+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (7, 'angular2-routing', 'Angular 2 Router', 'Build Single Page Applications with Angular 2 and its powerful Router.', 3, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-routing-small.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.698+02', '/src/images/router-icon.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (8, 'module-loaders-and-systemjs', 'Module Loaders and Webpack 2', 'Learn how Module Loaders Work - Learn Webpack 2 and its Plugin Ecosystem.', 7, 'https://angular-academy.s3.amazonaws.com/thumbnails/webpack-small.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.699+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (11, 'angular2-ngrx', 'NgRx Angular 2 Reactive Extensions', 'Learn some of the most useful libraries in the Angular 2 Ecosystem.', 9, 'https://angular-academy.s3.amazonaws.com/thumbnails/ngrx.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.715+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (12, 'angular2-universal', 'Angular 2 Universal', 'Learn maybe the biggest game changing technology in the Angular 2 Ecosystem.', 10, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular_universal.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.736+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (4, 'angular2-forms', 'Angular 2 Forms', 'Learn how to build validatable and user-friendly data Forms effectively.', 3, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular-forms-small.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.611+02', 'https://angular-academy.s3.amazonaws.com/course-logos/lesson-icons/forms.jpg');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (9, 'angular2-http', 'Angular 2 HTTP and Services', 'Build Services using Observables, learn to use the HTTP module effectively.', 1, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular-http.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.632+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (13, 'angular2-progressive-web-applications', 'Angular 2 Progressive Web Apps', 'Learn the Future of Mobile development: Progressive Web Applications.', 11, 'https://angular-academy.s3.amazonaws.com/thumbnails/pwa.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.75+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (6, 'angular2-advanced-components', 'Angular 2 Advanced Components', 'A deep dive on Components, focusing on commonly needed advanced use cases.', 5, 'https://angular-academy.s3.amazonaws.com/thumbnails/advanced-components.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.63+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (1, 'getting-started-with-angular2', 'Angular 2 Tutorial For Beginners', 'Establish a solid layer of fundamentals, learn what''s under the hood of Angular 2', 0, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-for-beginners-small.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.606+02', 'https://angular-academy.s3.amazonaws.com/main-logo/main-page-logo-small-hat.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (14, 'angular2-architecture', 'Angular 2 Architecture', 'Learn how to build next-generation (Post-REST ?) user interfaces in Angular 2.', 12, 'https://angular-academy.s3.amazonaws.com/thumbnails/architecture.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-08-16 15:55:24.236181+02', '2016-10-07 21:16:20.75+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (15, 'angular2-security', 'Angular 2 Security', 'Learn how to build secure Angular 2 Applications Using JSON Web Tokens.', 13, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-security.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-08-16 15:59:06.727615+02', '2016-10-07 21:16:20.751+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
 
 
 

From aec2710713097ffd3d258145af9a23e6f3f1ee8f Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 15:47:05 +0200
Subject: [PATCH 37/49] ongoing REST API

---
 db-schema-create-and-populate.sql |  3 ---
 server/model/initCourseModel.ts   |  3 +--
 server/model/initLessonModel.ts   |  5 +----
 shared/model/course.ts            | 15 +++++++++++++++
 shared/model/lesson.ts            | 13 +++++++++++++
 5 files changed, 30 insertions(+), 9 deletions(-)
 create mode 100644 shared/model/course.ts
 create mode 100644 shared/model/lesson.ts

diff --git a/db-schema-create-and-populate.sql b/db-schema-create-and-populate.sql
index 32cbe31..975e0f6 100644
--- a/db-schema-create-and-populate.sql
+++ b/db-schema-create-and-populate.sql
@@ -34,13 +34,10 @@ CREATE TABLE "Lessons"
   "seqNo" integer NOT NULL,
   "courseId" integer,
   pro boolean DEFAULT false,
-  "videoId" character varying(255),
   "gitHubUrl" character varying(255) NOT NULL,
-  "downloadUrl" character varying(255) NOT NULL,
   tags character varying(255) DEFAULT ''::character varying,
   "createdAt" timestamp with time zone NOT NULL,
   "updatedAt" timestamp with time zone NOT NULL,
-  vimeoid character varying(50),
   CONSTRAINT "Lessons_pkey" PRIMARY KEY (id),
   CONSTRAINT "Lessons_courseId_fkey" FOREIGN KEY ("courseId")
       REFERENCES "Courses" (id) MATCH SIMPLE
diff --git a/server/model/initCourseModel.ts b/server/model/initCourseModel.ts
index 4988052..5f6bbd2 100644
--- a/server/model/initCourseModel.ts
+++ b/server/model/initCourseModel.ts
@@ -16,7 +16,6 @@ export function initCourseModel(sequelize:Sequelize) {
         seqNo: ORM.INTEGER,
         comingSoon: ORM.BOOLEAN,
         isNew: ORM.BOOLEAN,
-        isOngoing: ORM.BOOLEAN,
-        visibleFrom: ORM.DATE
+        isOngoing: ORM.BOOLEAN
     });
 }
\ No newline at end of file
diff --git a/server/model/initLessonModel.ts b/server/model/initLessonModel.ts
index 2fb05bd..581f29a 100644
--- a/server/model/initLessonModel.ts
+++ b/server/model/initLessonModel.ts
@@ -14,9 +14,6 @@ export function initLessonModel(sequelize:Sequelize) {
         courseId: ORM.INTEGER,
         pro: ORM.BOOLEAN,
         tags: ORM.STRING,
-        videoId: ORM.STRING,
-        vimeoid: ORM.STRING,
-        gitHubUrl: ORM.STRING,
-        downloadUrl: ORM.STRING
+        gitHubUrl: ORM.STRING
     });
 }
\ No newline at end of file
diff --git a/shared/model/course.ts b/shared/model/course.ts
new file mode 100644
index 0000000..fcc54bd
--- /dev/null
+++ b/shared/model/course.ts
@@ -0,0 +1,15 @@
+
+
+type Course = {
+
+    description: string,
+    url:  string,
+    longDescription: string,
+    iconUrl: string,
+    courseListIcon: string,
+    seqNo: number,
+    comingSoon: boolean,
+    isNew: boolean,
+    isOngoing: boolean
+
+}
\ No newline at end of file
diff --git a/shared/model/lesson.ts b/shared/model/lesson.ts
new file mode 100644
index 0000000..8642eba
--- /dev/null
+++ b/shared/model/lesson.ts
@@ -0,0 +1,13 @@
+
+
+type Lesson = {
+
+    readonly url:string;
+    readonly description: string;
+    readonly duration: string;
+    readonly seqNo: number;
+    readonly courseId:string;
+    readonly pro: boolean;
+    readonly tags: string;
+
+}
\ No newline at end of file

From ac4c0e944b1dc316db96c29c4f76af0c9e0d449d Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 16:20:25 +0200
Subject: [PATCH 38/49] ongoing REST API

---
 package.json                       |  2 +-
 server/queries/findCourseDetail.ts | 29 ++++++++++++++++++++++++++---
 shared/model/course.ts             |  3 ++-
 3 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/package.json b/package.json
index e4d6fb5..83dc738 100644
--- a/package.json
+++ b/package.json
@@ -7,7 +7,7 @@
     "hello": "./node_modules/.bin/ts-node ./hello-world.ts",
     "sql": "./node_modules/.bin/ts-node ./sql-examples.ts",
     "start": "./node_modules/.bin/ts-node ./server/server.ts",
-    "watch": "./node_modules/.bin/nodemon -w src --ext \".ts\" --exec \"npm run start\"",
+    "watch": "./node_modules/.bin/nodemon -w . --ext \".ts\" --exec \"npm run start\"",
     "debug": "node --inspect --debug-brk   ./src/server.js"
   },
   "repository": {
diff --git a/server/queries/findCourseDetail.ts b/server/queries/findCourseDetail.ts
index 3276abe..ded27d1 100644
--- a/server/queries/findCourseDetail.ts
+++ b/server/queries/findCourseDetail.ts
@@ -1,9 +1,11 @@
 
 
 import {CourseModel, LessonModel} from "../model";
+import Bluebird = require("bluebird");
 
 
-export function findCourseDetail(courseId:number) {
+
+export function findCourseDetail(courseId:number): Bluebird<Course | null> {
 
     return CourseModel.findById(courseId, {
         include: [
@@ -14,6 +16,27 @@ export function findCourseDetail(courseId:number) {
         order: [
             [ LessonModel, 'seqNo' , 'ASC']
         ]
-    });
+    })
+    .then(({description, url, longDescription, iconUrl, courseListIcon, seqNo, comingSoon, isNew, isOngoing}:any) => {
+
+            const course : Course = {
+                description,
+                url,
+                longDescription,
+                iconUrl,
+                courseListIcon,
+                seqNo,
+                comingSoon,
+                isNew,
+                isOngoing,
+                lessons: []
+            };
+
+            return Promise.resolve(course);
+
+        }
+    );
+
+}
+
 
-}
\ No newline at end of file
diff --git a/shared/model/course.ts b/shared/model/course.ts
index fcc54bd..fb36d2c 100644
--- a/shared/model/course.ts
+++ b/shared/model/course.ts
@@ -10,6 +10,7 @@ type Course = {
     seqNo: number,
     comingSoon: boolean,
     isNew: boolean,
-    isOngoing: boolean
+    isOngoing: boolean,
+    lessons: Lesson[];
 
 }
\ No newline at end of file

From 19d5503a9c5fcfa94fd9a295ff622ce2b18a4b78 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 16:37:45 +0200
Subject: [PATCH 39/49] ongoing REST API

---
 server/queries/findCourseDetail.ts |  9 ++++++---
 shared/model/lesson.ts             | 19 ++++++++++++++++++-
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/server/queries/findCourseDetail.ts b/server/queries/findCourseDetail.ts
index ded27d1..16dee5c 100644
--- a/server/queries/findCourseDetail.ts
+++ b/server/queries/findCourseDetail.ts
@@ -2,7 +2,8 @@
 
 import {CourseModel, LessonModel} from "../model";
 import Bluebird = require("bluebird");
-
+import * as _ from 'lodash';
+import {mapLesson} from "../../shared/model/lesson";
 
 
 export function findCourseDetail(courseId:number): Bluebird<Course | null> {
@@ -17,7 +18,7 @@ export function findCourseDetail(courseId:number): Bluebird<Course | null> {
             [ LessonModel, 'seqNo' , 'ASC']
         ]
     })
-    .then(({description, url, longDescription, iconUrl, courseListIcon, seqNo, comingSoon, isNew, isOngoing}:any) => {
+    .then(({description, url, longDescription, iconUrl, courseListIcon, seqNo, comingSoon, isNew, isOngoing, Lessons}:any) => {
 
             const course : Course = {
                 description,
@@ -29,7 +30,7 @@ export function findCourseDetail(courseId:number): Bluebird<Course | null> {
                 comingSoon,
                 isNew,
                 isOngoing,
-                lessons: []
+                lessons: Lessons.map((lesson:any) => mapLesson(lesson) )
             };
 
             return Promise.resolve(course);
@@ -40,3 +41,5 @@ export function findCourseDetail(courseId:number): Bluebird<Course | null> {
 }
 
 
+
+
diff --git a/shared/model/lesson.ts b/shared/model/lesson.ts
index 8642eba..e7ca7de 100644
--- a/shared/model/lesson.ts
+++ b/shared/model/lesson.ts
@@ -10,4 +10,21 @@ type Lesson = {
     readonly pro: boolean;
     readonly tags: string;
 
-}
\ No newline at end of file
+}
+
+
+
+export function mapLesson({url, description, duration, seqNo,courseId, pro, tags}:any): Lesson {
+    return {
+        url,
+        description,
+        duration,
+        seqNo,
+        courseId,
+        pro,
+        tags
+    }
+}
+
+
+

From ddb95ffcaeefec736c2b974aa78c528992a3046d Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 16:46:23 +0200
Subject: [PATCH 40/49] ongoing REST API

---
 server/queries/findCourseDetail.ts | 26 +++++++-------------------
 shared/model/course.ts             | 20 +++++++++++++++++++-
 shared/model/lesson.ts             |  2 +-
 3 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/server/queries/findCourseDetail.ts b/server/queries/findCourseDetail.ts
index 16dee5c..b782868 100644
--- a/server/queries/findCourseDetail.ts
+++ b/server/queries/findCourseDetail.ts
@@ -3,11 +3,12 @@
 import {CourseModel, LessonModel} from "../model";
 import Bluebird = require("bluebird");
 import * as _ from 'lodash';
-import {mapLesson} from "../../shared/model/lesson";
+import {Course, mapCourseAndLessons} from "../../shared/model/course";
+
 
 
-export function findCourseDetail(courseId:number): Bluebird<Course | null> {
 
+export function findCourseDetail(courseId:number): Bluebird<Course | null> {
     return CourseModel.findById(courseId, {
         include: [
             {
@@ -18,23 +19,8 @@ export function findCourseDetail(courseId:number): Bluebird<Course | null> {
             [ LessonModel, 'seqNo' , 'ASC']
         ]
     })
-    .then(({description, url, longDescription, iconUrl, courseListIcon, seqNo, comingSoon, isNew, isOngoing, Lessons}:any) => {
-
-            const course : Course = {
-                description,
-                url,
-                longDescription,
-                iconUrl,
-                courseListIcon,
-                seqNo,
-                comingSoon,
-                isNew,
-                isOngoing,
-                lessons: Lessons.map((lesson:any) => mapLesson(lesson) )
-            };
-
-            return Promise.resolve(course);
-
+    .then(result => {
+            return Promise.resolve(mapCourseAndLessons(result));
         }
     );
 
@@ -43,3 +29,5 @@ export function findCourseDetail(courseId:number): Bluebird<Course | null> {
 
 
 
+
+
diff --git a/shared/model/course.ts b/shared/model/course.ts
index fb36d2c..ac6b73d 100644
--- a/shared/model/course.ts
+++ b/shared/model/course.ts
@@ -1,6 +1,9 @@
 
 
-type Course = {
+import {mapLesson} from "./lesson";
+import {Lesson} from "../../../angular-academy.io/src/app/screens/lesson/lesson";
+
+export type Course = {
 
     description: string,
     url:  string,
@@ -13,4 +16,19 @@ type Course = {
     isOngoing: boolean,
     lessons: Lesson[];
 
+}
+
+export function mapCourseAndLessons({description, url, longDescription, iconUrl, courseListIcon, seqNo, comingSoon, isNew, isOngoing, Lessons}:any): Course {
+    return {
+        description,
+        url,
+        longDescription,
+        iconUrl,
+        courseListIcon,
+        seqNo,
+        comingSoon,
+        isNew,
+        isOngoing,
+        lessons: Lessons.map((lesson:any) => mapLesson(lesson) )
+    };
 }
\ No newline at end of file
diff --git a/shared/model/lesson.ts b/shared/model/lesson.ts
index e7ca7de..757505f 100644
--- a/shared/model/lesson.ts
+++ b/shared/model/lesson.ts
@@ -1,6 +1,6 @@
 
 
-type Lesson = {
+export type Lesson = {
 
     readonly url:string;
     readonly description: string;

From 84c62b621c5f531df166f9607dd4b423d57c533f Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 16:48:49 +0200
Subject: [PATCH 41/49] ongoing REST API

---
 server/queries/findCourseDetail.ts | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/server/queries/findCourseDetail.ts b/server/queries/findCourseDetail.ts
index b782868..ef01ece 100644
--- a/server/queries/findCourseDetail.ts
+++ b/server/queries/findCourseDetail.ts
@@ -19,15 +19,16 @@ export function findCourseDetail(courseId:number): Bluebird<Course | null> {
             [ LessonModel, 'seqNo' , 'ASC']
         ]
     })
-    .then(result => {
-            return Promise.resolve(mapCourseAndLessons(result));
-        }
-    );
+    .then(onCourseModelFound);
 
 }
 
 
 
+function onCourseModelFound(result:any) {
+    return Promise.resolve(mapCourseAndLessons(result));
+}
+
 
 
 

From 174a78c75d79ff27ac338e1b92c840fd1053c25d Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 17:03:21 +0200
Subject: [PATCH 42/49] ongoing REST API

---
 frontend/.editorconfig                        |  14 +++
 frontend/.gitignore                           |  33 ++++++
 frontend/angular-cli.json                     |  44 +++++++
 frontend/e2e/app.e2e-spec.ts                  |  14 +++
 frontend/e2e/app.po.ts                        |  11 ++
 frontend/e2e/tsconfig.json                    |  16 +++
 frontend/package.json                         |  44 +++++++
 frontend/src/app/app-routing.module.ts        |  11 ++
 frontend/src/app/app.component.css            |   0
 frontend/src/app/app.component.html           |   3 +
 frontend/src/app/app.component.spec.ts        |  33 ++++++
 frontend/src/app/app.component.ts             |  10 ++
 frontend/src/app/app.module.ts                |  20 ++++
 frontend/src/app/index.ts                     |   2 +
 frontend/src/app/shared/index.ts              |   0
 frontend/src/assets/.gitkeep                  |   0
 frontend/src/assets/.npmignore                |   0
 frontend/src/environments/environment.prod.ts |   3 +
 frontend/src/environments/environment.ts      |   8 ++
 frontend/src/favicon.ico                      | Bin 0 -> 5430 bytes
 frontend/src/index.html                       |  14 +++
 frontend/src/main.ts                          |  12 ++
 frontend/src/polyfills.ts                     |  19 +++
 frontend/src/styles.css                       |   1 +
 frontend/src/test.ts                          |  34 ++++++
 frontend/src/tsconfig.json                    |  17 +++
 frontend/src/typings.d.ts                     |   5 +
 frontend/tslint.json                          | 112 ++++++++++++++++++
 shared/model/course.ts                        |  24 ++--
 29 files changed, 492 insertions(+), 12 deletions(-)
 create mode 100644 frontend/.editorconfig
 create mode 100644 frontend/.gitignore
 create mode 100644 frontend/angular-cli.json
 create mode 100644 frontend/e2e/app.e2e-spec.ts
 create mode 100644 frontend/e2e/app.po.ts
 create mode 100644 frontend/e2e/tsconfig.json
 create mode 100644 frontend/package.json
 create mode 100644 frontend/src/app/app-routing.module.ts
 create mode 100644 frontend/src/app/app.component.css
 create mode 100644 frontend/src/app/app.component.html
 create mode 100644 frontend/src/app/app.component.spec.ts
 create mode 100644 frontend/src/app/app.component.ts
 create mode 100644 frontend/src/app/app.module.ts
 create mode 100644 frontend/src/app/index.ts
 create mode 100644 frontend/src/app/shared/index.ts
 create mode 100644 frontend/src/assets/.gitkeep
 create mode 100644 frontend/src/assets/.npmignore
 create mode 100644 frontend/src/environments/environment.prod.ts
 create mode 100644 frontend/src/environments/environment.ts
 create mode 100644 frontend/src/favicon.ico
 create mode 100644 frontend/src/index.html
 create mode 100644 frontend/src/main.ts
 create mode 100644 frontend/src/polyfills.ts
 create mode 100644 frontend/src/styles.css
 create mode 100644 frontend/src/test.ts
 create mode 100644 frontend/src/tsconfig.json
 create mode 100644 frontend/src/typings.d.ts
 create mode 100644 frontend/tslint.json

diff --git a/frontend/.editorconfig b/frontend/.editorconfig
new file mode 100644
index 0000000..f352616
--- /dev/null
+++ b/frontend/.editorconfig
@@ -0,0 +1,14 @@
+# Editor configuration, see http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+max_line_length = 0
+trim_trailing_whitespace = false
diff --git a/frontend/.gitignore b/frontend/.gitignore
new file mode 100644
index 0000000..fccc4d9
--- /dev/null
+++ b/frontend/.gitignore
@@ -0,0 +1,33 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+/dist
+/tmp
+
+# dependencies
+/node_modules
+/bower_components
+
+# IDEs and editors
+/.idea
+.project
+.classpath
+*.launch
+.settings/
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage/*
+/libpeerconnection.log
+npm-debug.log
+testem.log
+/typings
+
+# e2e
+/e2e/*.js
+/e2e/*.map
+
+#System Files
+.DS_Store
+Thumbs.db
diff --git a/frontend/angular-cli.json b/frontend/angular-cli.json
new file mode 100644
index 0000000..a648678
--- /dev/null
+++ b/frontend/angular-cli.json
@@ -0,0 +1,44 @@
+{
+  "project": {
+    "version": "1.0.0-beta.16",
+    "name": "frontend"
+  },
+  "apps": [
+    {
+      "root": "src",
+      "outDir": "dist",
+      "assets": "assets",
+      "index": "index.html",
+      "main": "main.ts",
+      "test": "test.ts",
+      "tsconfig": "tsconfig.json",
+      "prefix": "app",
+      "mobile": false,
+      "styles": [
+        "styles.css"
+      ],
+      "scripts": [],
+      "environments": {
+        "source": "environments/environment.ts",
+        "dev": "environments/environment.ts",
+        "prod": "environments/environment.prod.ts"
+      }
+    }
+  ],
+  "addons": [],
+  "packages": [],
+  "e2e": {
+    "protractor": {
+      "config": "./protractor.conf.js"
+    }
+  },
+  "test": {
+    "karma": {
+      "config": "./karma.conf.js"
+    }
+  },
+  "defaults": {
+    "styleExt": "css",
+    "prefixInterfaces": false
+  }
+}
diff --git a/frontend/e2e/app.e2e-spec.ts b/frontend/e2e/app.e2e-spec.ts
new file mode 100644
index 0000000..68ef1b0
--- /dev/null
+++ b/frontend/e2e/app.e2e-spec.ts
@@ -0,0 +1,14 @@
+import { FrontendPage } from './app.po';
+
+describe('frontend App', function() {
+  let page: FrontendPage;
+
+  beforeEach(() => {
+    page = new FrontendPage();
+  });
+
+  it('should display message saying app works', () => {
+    page.navigateTo();
+    expect(page.getParagraphText()).toEqual('app works!');
+  });
+});
diff --git a/frontend/e2e/app.po.ts b/frontend/e2e/app.po.ts
new file mode 100644
index 0000000..6991fd4
--- /dev/null
+++ b/frontend/e2e/app.po.ts
@@ -0,0 +1,11 @@
+import { browser, element, by } from 'protractor';
+
+export class FrontendPage {
+  navigateTo() {
+    return browser.get('/');
+  }
+
+  getParagraphText() {
+    return element(by.css('app-root h1')).getText();
+  }
+}
diff --git a/frontend/e2e/tsconfig.json b/frontend/e2e/tsconfig.json
new file mode 100644
index 0000000..656bdb1
--- /dev/null
+++ b/frontend/e2e/tsconfig.json
@@ -0,0 +1,16 @@
+{
+  "compileOnSave": false,
+  "compilerOptions": {
+    "declaration": false,
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "module": "commonjs",
+    "moduleResolution": "node",
+    "outDir": "../dist/out-tsc-e2e",
+    "sourceMap": true,
+    "target": "es5",
+    "typeRoots": [
+      "../node_modules/@types"
+    ]
+  }
+}
diff --git a/frontend/package.json b/frontend/package.json
new file mode 100644
index 0000000..afa369f
--- /dev/null
+++ b/frontend/package.json
@@ -0,0 +1,44 @@
+{
+  "name": "frontend",
+  "version": "0.0.0",
+  "license": "MIT",
+  "angular-cli": {},
+  "scripts": {
+    "start": "ng serve",
+    "lint": "tslint \"src/**/*.ts\"",
+    "test": "ng test",
+    "pree2e": "webdriver-manager update",
+    "e2e": "protractor"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/common": "2.0.0",
+    "@angular/compiler": "2.0.0",
+    "@angular/core": "2.0.0",
+    "@angular/forms": "2.0.0",
+    "@angular/http": "2.0.0",
+    "@angular/platform-browser": "2.0.0",
+    "@angular/platform-browser-dynamic": "2.0.0",
+    "@angular/router": "3.0.0",
+    "core-js": "^2.4.1",
+    "rxjs": "5.0.0-beta.12",
+    "ts-helpers": "^1.1.1",
+    "zone.js": "^0.6.23"
+  },
+  "devDependencies": {
+    "@types/jasmine": "^2.2.30",
+    "angular-cli": "1.0.0-beta.16",
+    "codelyzer": "~0.0.26",
+    "jasmine-core": "2.4.1",
+    "jasmine-spec-reporter": "2.5.0",
+    "karma": "1.2.0",
+    "karma-chrome-launcher": "^2.0.0",
+    "karma-cli": "^1.0.1",
+    "karma-jasmine": "^1.0.2",
+    "karma-remap-istanbul": "^0.2.1",
+    "protractor": "4.0.9",
+    "ts-node": "1.2.1",
+    "tslint": "3.13.0",
+    "typescript": "2.0.2"
+  }
+}
diff --git a/frontend/src/app/app-routing.module.ts b/frontend/src/app/app-routing.module.ts
new file mode 100644
index 0000000..daa7621
--- /dev/null
+++ b/frontend/src/app/app-routing.module.ts
@@ -0,0 +1,11 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+const routes: Routes = [];
+
+@NgModule({
+  imports: [RouterModule.forRoot(routes)],
+  exports: [RouterModule],
+  providers: []
+})
+export class FrontendRoutingModule { }
diff --git a/frontend/src/app/app.component.css b/frontend/src/app/app.component.css
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html
new file mode 100644
index 0000000..b6931b5
--- /dev/null
+++ b/frontend/src/app/app.component.html
@@ -0,0 +1,3 @@
+<h1>
+  {{title}}
+</h1>
diff --git a/frontend/src/app/app.component.spec.ts b/frontend/src/app/app.component.spec.ts
new file mode 100644
index 0000000..54a5538
--- /dev/null
+++ b/frontend/src/app/app.component.spec.ts
@@ -0,0 +1,33 @@
+/* tslint:disable:no-unused-variable */
+
+import { TestBed, async } from '@angular/core/testing';
+import { AppComponent } from './app.component';
+
+describe('App: Frontend', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      declarations: [
+        AppComponent
+      ],
+    });
+  });
+
+  it('should create the app', async(() => {
+    let fixture = TestBed.createComponent(AppComponent);
+    let app = fixture.debugElement.componentInstance;
+    expect(app).toBeTruthy();
+  }));
+
+  it(`should have as title 'app works!'`, async(() => {
+    let fixture = TestBed.createComponent(AppComponent);
+    let app = fixture.debugElement.componentInstance;
+    expect(app.title).toEqual('app works!');
+  }));
+
+  it('should render title in a h1 tag', async(() => {
+    let fixture = TestBed.createComponent(AppComponent);
+    fixture.detectChanges();
+    let compiled = fixture.debugElement.nativeElement;
+    expect(compiled.querySelector('h1').textContent).toContain('app works!');
+  }));
+});
diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts
new file mode 100644
index 0000000..ff63e05
--- /dev/null
+++ b/frontend/src/app/app.component.ts
@@ -0,0 +1,10 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-root',
+  templateUrl: './app.component.html',
+  styleUrls: ['./app.component.css']
+})
+export class AppComponent {
+  title = 'app works!';
+}
diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts
new file mode 100644
index 0000000..67ae491
--- /dev/null
+++ b/frontend/src/app/app.module.ts
@@ -0,0 +1,20 @@
+import { BrowserModule } from '@angular/platform-browser';
+import { NgModule } from '@angular/core';
+import { FormsModule } from '@angular/forms';
+import { HttpModule } from '@angular/http';
+
+import { AppComponent } from './app.component';
+
+@NgModule({
+  declarations: [
+    AppComponent
+  ],
+  imports: [
+    BrowserModule,
+    FormsModule,
+    HttpModule
+  ],
+  providers: [],
+  bootstrap: [AppComponent]
+})
+export class AppModule { }
diff --git a/frontend/src/app/index.ts b/frontend/src/app/index.ts
new file mode 100644
index 0000000..875bdb2
--- /dev/null
+++ b/frontend/src/app/index.ts
@@ -0,0 +1,2 @@
+export * from './app.component';
+export * from './app.module';
diff --git a/frontend/src/app/shared/index.ts b/frontend/src/app/shared/index.ts
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/src/assets/.gitkeep b/frontend/src/assets/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/src/assets/.npmignore b/frontend/src/assets/.npmignore
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts
new file mode 100644
index 0000000..3612073
--- /dev/null
+++ b/frontend/src/environments/environment.prod.ts
@@ -0,0 +1,3 @@
+export const environment = {
+  production: true
+};
diff --git a/frontend/src/environments/environment.ts b/frontend/src/environments/environment.ts
new file mode 100644
index 0000000..00313f1
--- /dev/null
+++ b/frontend/src/environments/environment.ts
@@ -0,0 +1,8 @@
+// The file contents for the current environment will overwrite these during build.
+// The build system defaults to the dev environment which uses `environment.ts`, but if you do
+// `ng build --env=prod` then `environment.prod.ts` will be used instead.
+// The list of which env maps to which file can be found in `angular-cli.json`.
+
+export const environment = {
+  production: false
+};
diff --git a/frontend/src/favicon.ico b/frontend/src/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..8081c7ceaf2be08bf59010158c586170d9d2d517
GIT binary patch
diff --git a/frontend/src/index.html b/frontend/src/index.html
new file mode 100644
index 0000000..1021499
--- /dev/null
+++ b/frontend/src/index.html
@@ -0,0 +1,14 @@
+<!doctype html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Frontend</title>
+  <base href="/">
+
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link rel="icon" type="image/x-icon" href="favicon.ico">
+</head>
+<body>
+  <app-root>Loading...</app-root>
+</body>
+</html>
diff --git a/frontend/src/main.ts b/frontend/src/main.ts
new file mode 100644
index 0000000..5c3c520
--- /dev/null
+++ b/frontend/src/main.ts
@@ -0,0 +1,12 @@
+import './polyfills.ts';
+
+import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
+import { enableProdMode } from '@angular/core';
+import { environment } from './environments/environment';
+import { AppModule } from './app/';
+
+if (environment.production) {
+  enableProdMode();
+}
+
+platformBrowserDynamic().bootstrapModule(AppModule);
diff --git a/frontend/src/polyfills.ts b/frontend/src/polyfills.ts
new file mode 100644
index 0000000..3b4c55b
--- /dev/null
+++ b/frontend/src/polyfills.ts
@@ -0,0 +1,19 @@
+// This file includes polyfills needed by Angular 2 and is loaded before
+// the app. You can add your own extra polyfills to this file.
+import 'core-js/es6/symbol';
+import 'core-js/es6/object';
+import 'core-js/es6/function';
+import 'core-js/es6/parse-int';
+import 'core-js/es6/parse-float';
+import 'core-js/es6/number';
+import 'core-js/es6/math';
+import 'core-js/es6/string';
+import 'core-js/es6/date';
+import 'core-js/es6/array';
+import 'core-js/es6/regexp';
+import 'core-js/es6/map';
+import 'core-js/es6/set';
+import 'core-js/es6/reflect';
+
+import 'core-js/es7/reflect';
+import 'zone.js/dist/zone';
diff --git a/frontend/src/styles.css b/frontend/src/styles.css
new file mode 100644
index 0000000..e50a47e
--- /dev/null
+++ b/frontend/src/styles.css
@@ -0,0 +1 @@
+/* You can add global styles to this file, and also import other style files */
\ No newline at end of file
diff --git a/frontend/src/test.ts b/frontend/src/test.ts
new file mode 100644
index 0000000..7727c8e
--- /dev/null
+++ b/frontend/src/test.ts
@@ -0,0 +1,34 @@
+import './polyfills.ts';
+
+import 'zone.js/dist/long-stack-trace-zone';
+import 'zone.js/dist/proxy.js';
+import 'zone.js/dist/sync-test';
+import 'zone.js/dist/jasmine-patch';
+import 'zone.js/dist/async-test';
+import 'zone.js/dist/fake-async-test';
+
+// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
+declare var __karma__: any;
+declare var require: any;
+
+// Prevent Karma from running prematurely.
+__karma__.loaded = function () {};
+
+
+Promise.all([
+  System.import('@angular/core/testing'),
+  System.import('@angular/platform-browser-dynamic/testing')
+])
+  // First, initialize the Angular testing environment.
+  .then(([testing, testingBrowser]) => {
+    testing.getTestBed().initTestEnvironment(
+      testingBrowser.BrowserDynamicTestingModule,
+      testingBrowser.platformBrowserDynamicTesting()
+    );
+  })
+  // Then we find all the tests.
+  .then(() => require.context('./', true, /\.spec\.ts/))
+  // And load the modules.
+  .then(context => context.keys().map(context))
+  // Finally, start Karma to run the tests.
+  .then(__karma__.start, __karma__.error);
diff --git a/frontend/src/tsconfig.json b/frontend/src/tsconfig.json
new file mode 100644
index 0000000..9b4c84c
--- /dev/null
+++ b/frontend/src/tsconfig.json
@@ -0,0 +1,17 @@
+{
+  "compilerOptions": {
+    "declaration": false,
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "lib": ["es6", "dom"],
+    "mapRoot": "./",
+    "module": "es6",
+    "moduleResolution": "node",
+    "outDir": "../dist/out-tsc",
+    "sourceMap": true,
+    "target": "es5",
+    "typeRoots": [
+      "../node_modules/@types"
+    ]
+  }
+}
diff --git a/frontend/src/typings.d.ts b/frontend/src/typings.d.ts
new file mode 100644
index 0000000..a73f586
--- /dev/null
+++ b/frontend/src/typings.d.ts
@@ -0,0 +1,5 @@
+// Typings reference file, see links for more information
+// https://github.com/typings/typings
+// https://www.typescriptlang.org/docs/handbook/writing-declaration-files.html
+
+declare var System: any;
diff --git a/frontend/tslint.json b/frontend/tslint.json
new file mode 100644
index 0000000..29f24ee
--- /dev/null
+++ b/frontend/tslint.json
@@ -0,0 +1,112 @@
+{
+  "rulesDirectory": [
+    "node_modules/codelyzer"
+  ],
+  "rules": {
+    "class-name": true,
+    "comment-format": [
+      true,
+      "check-space"
+    ],
+    "curly": true,
+    "eofline": true,
+    "forin": true,
+    "indent": [
+      true,
+      "spaces"
+    ],
+    "label-position": true,
+    "label-undefined": true,
+    "max-line-length": [
+      true,
+      140
+    ],
+    "member-access": false,
+    "member-ordering": [
+      true,
+      "static-before-instance",
+      "variables-before-functions"
+    ],
+    "no-arg": true,
+    "no-bitwise": true,
+    "no-console": [
+      true,
+      "debug",
+      "info",
+      "time",
+      "timeEnd",
+      "trace"
+    ],
+    "no-construct": true,
+    "no-debugger": true,
+    "no-duplicate-key": true,
+    "no-duplicate-variable": true,
+    "no-empty": false,
+    "no-eval": true,
+    "no-inferrable-types": true,
+    "no-shadowed-variable": true,
+    "no-string-literal": false,
+    "no-switch-case-fall-through": true,
+    "no-trailing-whitespace": true,
+    "no-unused-expression": true,
+    "no-unused-variable": true,
+    "no-unreachable": true,
+    "no-use-before-declare": true,
+    "no-var-keyword": true,
+    "object-literal-sort-keys": false,
+    "one-line": [
+      true,
+      "check-open-brace",
+      "check-catch",
+      "check-else",
+      "check-whitespace"
+    ],
+    "quotemark": [
+      true,
+      "single"
+    ],
+    "radix": true,
+    "semicolon": [
+      "always"
+    ],
+    "triple-equals": [
+      true,
+      "allow-null-check"
+    ],
+    "typedef-whitespace": [
+      true,
+      {
+        "call-signature": "nospace",
+        "index-signature": "nospace",
+        "parameter": "nospace",
+        "property-declaration": "nospace",
+        "variable-declaration": "nospace"
+      }
+    ],
+    "variable-name": false,
+    "whitespace": [
+      true,
+      "check-branch",
+      "check-decl",
+      "check-operator",
+      "check-separator",
+      "check-type"
+    ],
+
+    "directive-selector-prefix": [true, "app"],
+    "component-selector-prefix": [true, "app"],
+    "directive-selector-name": [true, "camelCase"],
+    "component-selector-name": [true, "kebab-case"],
+    "directive-selector-type": [true, "attribute"],
+    "component-selector-type": [true, "element"],
+    "use-input-property-decorator": true,
+    "use-output-property-decorator": true,
+    "use-host-property-decorator": true,
+    "no-input-rename": true,
+    "no-output-rename": true,
+    "use-life-cycle-interface": true,
+    "use-pipe-transform-interface": true,
+    "component-class-suffix": true,
+    "directive-class-suffix": true
+  }
+}
diff --git a/shared/model/course.ts b/shared/model/course.ts
index ac6b73d..b9255b3 100644
--- a/shared/model/course.ts
+++ b/shared/model/course.ts
@@ -1,20 +1,20 @@
 
 
-import {mapLesson} from "./lesson";
-import {Lesson} from "../../../angular-academy.io/src/app/screens/lesson/lesson";
+import {mapLesson, Lesson} from "./lesson";
+
 
 export type Course = {
 
-    description: string,
-    url:  string,
-    longDescription: string,
-    iconUrl: string,
-    courseListIcon: string,
-    seqNo: number,
-    comingSoon: boolean,
-    isNew: boolean,
-    isOngoing: boolean,
-    lessons: Lesson[];
+    readonly description: string,
+    readonly url:  string,
+    readonly longDescription: string,
+    readonly iconUrl: string,
+    readonly courseListIcon: string,
+    readonly seqNo: number,
+    readonly comingSoon: boolean,
+    readonly isNew: boolean,
+    readonly isOngoing: boolean,
+    readonly lessons: Lesson[];
 
 }
 

From c43606f6841c6c4ea2285b94564f076150a85dfd Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 17:06:21 +0200
Subject: [PATCH 43/49] ongoing REST API

---
 frontend/proxy.conf.json | 6 ++++++
 tsconfig.json            | 2 ++
 2 files changed, 8 insertions(+)
 create mode 100644 frontend/proxy.conf.json

diff --git a/frontend/proxy.conf.json b/frontend/proxy.conf.json
new file mode 100644
index 0000000..52cde71
--- /dev/null
+++ b/frontend/proxy.conf.json
@@ -0,0 +1,6 @@
+{
+  "/api": {
+    "target": "http://localhost:8090",
+    "secure": false
+  }
+}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index 0149e5d..a6cdafe 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,5 +1,7 @@
 {
     "compilerOptions": {
+        "emitDecoratorMetadata": true,
+        "experimentalDecorators": true,
         "module": "commonjs",
         "target": "es5",
         "noImplicitAny": true,

From fa9efba8f75a01b9963f9dd299b44460eb17ef4d Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 17:14:07 +0200
Subject: [PATCH 44/49] ongoing REST API

---
 frontend/src/app/app.component.html           |   5 +-
 frontend/src/app/app.module.ts                |   4 +-
 frontend/src/app/course/course.component.css  |   0
 frontend/src/app/course/course.component.html |   3 +
 .../src/app/course/course.component.spec.ts   |  11 +
 frontend/src/app/course/course.component.ts   |  15 +
 frontend/src/assets/app.css                   | 297 ++++++++++++++++++
 frontend/src/index.html                       |   8 +
 8 files changed, 339 insertions(+), 4 deletions(-)
 create mode 100644 frontend/src/app/course/course.component.css
 create mode 100644 frontend/src/app/course/course.component.html
 create mode 100644 frontend/src/app/course/course.component.spec.ts
 create mode 100644 frontend/src/app/course/course.component.ts
 create mode 100644 frontend/src/assets/app.css

diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html
index b6931b5..7f75e7b 100644
--- a/frontend/src/app/app.component.html
+++ b/frontend/src/app/app.component.html
@@ -1,3 +1,2 @@
-<h1>
-  {{title}}
-</h1>
+
+<course></course>
\ No newline at end of file
diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts
index 67ae491..be95cad 100644
--- a/frontend/src/app/app.module.ts
+++ b/frontend/src/app/app.module.ts
@@ -4,10 +4,12 @@ import { FormsModule } from '@angular/forms';
 import { HttpModule } from '@angular/http';
 
 import { AppComponent } from './app.component';
+import { CourseComponent } from './course/course.component';
 
 @NgModule({
   declarations: [
-    AppComponent
+    AppComponent,
+    CourseComponent
   ],
   imports: [
     BrowserModule,
diff --git a/frontend/src/app/course/course.component.css b/frontend/src/app/course/course.component.css
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/src/app/course/course.component.html b/frontend/src/app/course/course.component.html
new file mode 100644
index 0000000..16f10bf
--- /dev/null
+++ b/frontend/src/app/course/course.component.html
@@ -0,0 +1,3 @@
+<p>
+  course works!
+</p>
diff --git a/frontend/src/app/course/course.component.spec.ts b/frontend/src/app/course/course.component.spec.ts
new file mode 100644
index 0000000..16d695e
--- /dev/null
+++ b/frontend/src/app/course/course.component.spec.ts
@@ -0,0 +1,11 @@
+/* tslint:disable:no-unused-variable */
+
+import { TestBed, async } from '@angular/core/testing';
+import { CourseComponent } from './course.component';
+
+describe('Component: Course', () => {
+  it('should create an instance', () => {
+    let component = new CourseComponent();
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/frontend/src/app/course/course.component.ts b/frontend/src/app/course/course.component.ts
new file mode 100644
index 0000000..6ab4489
--- /dev/null
+++ b/frontend/src/app/course/course.component.ts
@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'course',
+  templateUrl: './course.component.html',
+  styleUrls: ['./course.component.css']
+})
+export class CourseComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {
+  }
+
+}
diff --git a/frontend/src/assets/app.css b/frontend/src/assets/app.css
new file mode 100644
index 0000000..150839d
--- /dev/null
+++ b/frontend/src/assets/app.css
@@ -0,0 +1,297 @@
+
+.lesson {
+    margin: 25px auto 0 auto;
+    max-width: 350px;
+}
+
+.lessons-list {
+    padding: 10px 10px 0 10px;
+    display: table-cell;
+    margin-bottom: 15px;
+}
+
+.lessons-list tr {
+    border-bottom: 1px solid darkgray;
+    cursor: pointer;
+}
+
+.lessons-list td {
+    padding-bottom: 5px;
+}
+
+.lesson-logo {
+    height: 20px;
+    margin-right: 10px;
+}
+
+.add-lesson {
+    width: 350px;
+    margin-bottom: 15px;
+}
+
+.md-icon {
+    font-family: 'Material Icons';
+    text-rendering: optimizeLegibility;
+    font-feature-settings: "liga" 1;
+    font-style: normal;
+    text-transform: none;
+    line-height: 1;
+    width: 24px;
+    height: 24px;
+    display: inline-block;
+    overflow: hidden;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.collapsible-indicator {
+    font-size: 30px;
+    line-height:30px;
+}
+
+
+.collapsible-section {
+    padding: 0 20px 20px 20px;
+}
+
+.collapsed .collapsible-section {
+    display: none;
+}
+
+
+.disable-text-selection {
+    -webkit-touch-callout: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+
+
+.course-logo {
+    height: 75px;
+    margin: 0 auto;
+    background-color: #FAFAFA;
+    background-image: url(https://angular-academy.s3.amazonaws.com/main-logo/main-page-logo-small-hat.png);
+    background-repeat: no-repeat;
+    background-position-x: center;
+    background-size: 65px;
+    background-position-y: center;
+}
+
+form label {
+    width: 100px;
+    display: inline-block;
+    text-align: right;
+    vertical-align: top;
+    margin-right: 5px;
+}
+
+.field-error-message {
+    text-align: right;
+    padding-right: 68px;
+    font-size: 16px;
+    color: #a10000;
+}
+
+form fieldset {
+    margin-bottom: 20px;
+}
+
+form textarea {
+    width: 170px;
+}
+
+form input[type='radio'] {
+    box-shadow: none;
+    width: 20px;
+    vertical-align: bottom;
+    margin-left: 10px;
+}
+
+form button[type='submit'] {
+    float: right;
+    margin-right: 75px;
+}
+
+.debug {
+    clear: both;
+    font-size: 14px;
+}
+
+.debug h3 {
+    margin-top: 20px;
+    margin-bottom: 5px;
+}
+
+.form-field {
+    margin-bottom: 15px;
+}
+
+.lesson-button {
+    background: #1976d2;
+    color: white;
+    font-weight: bold;
+}
+
+.lesson-button[disabled] {
+    background: grey;
+    color: white;
+    cursor: not-allowed;
+}
+
+button[disabled] {
+    cursor: not-allowed;
+    opacity: 0.5;
+}
+
+
+.top-menu {
+    margin-bottom: 30px;
+}
+
+
+
+
+.ng-dirty.ng-invalid {
+    border: 2px solid #ff2118;
+}
+
+.ng-touched.ng-invalid {
+    border: 1px solid #cccccc !important;
+}
+
+
+form.ng-dirty.ng-invalid {
+    border:none;
+}
+
+form.ng-touched.ng-invalid {
+    border:none !important;
+}
+
+.l-header img {
+    cursor: pointer;
+}
+
+.youtube-logo {
+    max-height: 100px;
+    border-radius: 4px;
+}
+
+.lessons-list {
+    text-align: left;
+}
+
+.home-screen {
+    margin-top: 50px;
+}
+
+.courses-list {
+    padding: 5px 10px;
+    text-align: left;
+}
+
+
+table.courses-list tr {
+    border-bottom: 1px solid darkgray;
+}
+
+table.courses-list tr td {
+    padding: 5px 0;
+}
+
+table.courses-list tr td.description {
+    padding-right: 15px;
+}
+
+table.courses-list tr td:first-child {
+    padding-left: 15px;
+}
+
+table.courses-list tr td:last-child {
+    padding-right: 15px;
+}
+
+ul.top-menu > li > a.menu-active {
+    color: #ee1c1b;
+    font-weight: bold;
+    text-decoration: underline;
+}
+
+.nav-button {
+    margin-bottom: 20px;
+}
+
+.playlist {
+    float: right;
+}
+
+.main-container .list {
+    display: inline-block;
+    max-width: 270px;
+    vertical-align: top;
+    margin-right: 50px;
+}
+
+
+.nav-fields {
+    margin-bottom: 40px;
+}
+
+.course-summary {
+    cursor: pointer;
+}
+
+.chat {
+
+}
+
+img.dashboard-section  {
+    display: block;
+    max-height: 300px;
+    margin: 0 auto 50px auto;
+
+}
+
+.toggle-buttons {
+    margin-bottom: 15px;
+}
+
+.graph-toggle {
+    width: 30px;
+    box-shadow: none;
+    vertical-align: bottom;
+}
+
+
+
+.l-header {
+    height: 58px;
+}
+
+.top-menu {
+    margin-left: 50px;
+}
+
+.top-menu li {
+    box-shadow: none !important;
+}
+
+.l-sample-app {
+    text-align: center;
+}
+
+.tools-bar {
+    text-align: right;
+    margin-top: 30px;
+}
+
+.login-form {
+    width: 350px;
+}
+
+.search-bar {
+    margin-bottom: 30px;
+    width: 250px;
+}
diff --git a/frontend/src/index.html b/frontend/src/index.html
index 1021499..fbc9008 100644
--- a/frontend/src/index.html
+++ b/frontend/src/index.html
@@ -6,7 +6,15 @@
   <base href="/">
 
   <meta name="viewport" content="width=device-width, initial-scale=1">
+
   <link rel="icon" type="image/x-icon" href="favicon.ico">
+
+    <link rel="stylesheet" href="assets/app.css">
+    <link rel="stylesheet" href="https://angular-academy.s3.amazonaws.com/bundles/bundle.20160714172956.min.css">
+    <link rel="stylesheet"
+          href="https://angular-academy.s3-us-west-1.amazonaws.com/styles/angular-academy-lessons-theme-v1.css">
+    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
+
 </head>
 <body>
   <app-root>Loading...</app-root>

From f8b76d80aac6dd0ef0011ea9b35e897ff1165678 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 17:24:50 +0200
Subject: [PATCH 45/49] ongoing REST API

---
 frontend/src/app/app.module.ts                |  3 ++-
 frontend/src/app/course/course.component.html | 21 ++++++++++++++++---
 frontend/src/app/course/course.component.ts   | 10 ++++++++-
 .../shared/services/course.service.spec.ts    | 16 ++++++++++++++
 .../src/app/shared/services/course.service.ts | 19 +++++++++++++++++
 5 files changed, 64 insertions(+), 5 deletions(-)
 create mode 100644 frontend/src/app/shared/services/course.service.spec.ts
 create mode 100644 frontend/src/app/shared/services/course.service.ts

diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts
index be95cad..a1573a4 100644
--- a/frontend/src/app/app.module.ts
+++ b/frontend/src/app/app.module.ts
@@ -5,6 +5,7 @@ import { HttpModule } from '@angular/http';
 
 import { AppComponent } from './app.component';
 import { CourseComponent } from './course/course.component';
+import {CourseService} from "./shared/services/course.service";
 
 @NgModule({
   declarations: [
@@ -16,7 +17,7 @@ import { CourseComponent } from './course/course.component';
     FormsModule,
     HttpModule
   ],
-  providers: [],
+  providers: [CourseService],
   bootstrap: [AppComponent]
 })
 export class AppModule { }
diff --git a/frontend/src/app/course/course.component.html b/frontend/src/app/course/course.component.html
index 16f10bf..130534a 100644
--- a/frontend/src/app/course/course.component.html
+++ b/frontend/src/app/course/course.component.html
@@ -1,3 +1,18 @@
-<p>
-  course works!
-</p>
+<h2>{{ course?.description }}</h2>
+
+
+<div class="lessons-list-container v-h-center-block-parent">
+
+    <table class="table lessons-list card card-strong">
+        <tbody>
+        <tr *ngFor="let lesson of course?.lessons">
+            <td class="lesson-title"> {{lesson.description}}</td>
+            <td class="duration">
+                <i class="md-icon duration-icon">access_time</i>
+                <span>{{lesson.duration}}</span>
+            </td>
+        </tr>
+        </tbody>
+    </table>
+
+</div>
\ No newline at end of file
diff --git a/frontend/src/app/course/course.component.ts b/frontend/src/app/course/course.component.ts
index 6ab4489..1f8b22d 100644
--- a/frontend/src/app/course/course.component.ts
+++ b/frontend/src/app/course/course.component.ts
@@ -1,4 +1,9 @@
-import { Component, OnInit } from '@angular/core';
+import { Component, OnInit, Input } from '@angular/core';
+import {Course} from "../../../../shared/model/course";
+
+
+
+
 
 @Component({
   selector: 'course',
@@ -7,6 +12,9 @@ import { Component, OnInit } from '@angular/core';
 })
 export class CourseComponent implements OnInit {
 
+  @Input()
+  course: Course;
+
   constructor() { }
 
   ngOnInit() {
diff --git a/frontend/src/app/shared/services/course.service.spec.ts b/frontend/src/app/shared/services/course.service.spec.ts
new file mode 100644
index 0000000..f29100c
--- /dev/null
+++ b/frontend/src/app/shared/services/course.service.spec.ts
@@ -0,0 +1,16 @@
+/* tslint:disable:no-unused-variable */
+
+import { TestBed, async, inject } from '@angular/core/testing';
+import { CourseService } from './course.service';
+
+describe('Service: Course', () => {
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      providers: [CourseService]
+    });
+  });
+
+  it('should ...', inject([CourseService], (service: CourseService) => {
+    expect(service).toBeTruthy();
+  }));
+});
diff --git a/frontend/src/app/shared/services/course.service.ts b/frontend/src/app/shared/services/course.service.ts
new file mode 100644
index 0000000..54c12ae
--- /dev/null
+++ b/frontend/src/app/shared/services/course.service.ts
@@ -0,0 +1,19 @@
+import { Injectable } from '@angular/core';
+import {Http} from "@angular/http";
+
+
+
+
+@Injectable()
+export class CourseService {
+
+
+  constructor(private http: Http) {
+
+  }
+
+
+
+
+
+}

From deb6c65f61f26e7d0872326299f8da067dbd8a87 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 17:54:34 +0200
Subject: [PATCH 46/49] ongoing REST API

---
 frontend/src/app/app.component.html           |  2 +-
 frontend/src/app/app.component.ts             | 25 ++++++++++++++++---
 frontend/src/app/course/course.component.ts   |  1 +
 .../src/app/shared/services/course.service.ts |  6 ++++-
 4 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html
index 7f75e7b..25bf08a 100644
--- a/frontend/src/app/app.component.html
+++ b/frontend/src/app/app.component.html
@@ -1,2 +1,2 @@
 
-<course></course>
\ No newline at end of file
+<course [course]="course$ | async"></course>
\ No newline at end of file
diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts
index ff63e05..d4409e2 100644
--- a/frontend/src/app/app.component.ts
+++ b/frontend/src/app/app.component.ts
@@ -1,10 +1,29 @@
-import { Component } from '@angular/core';
+import { Component,OnInit } from '@angular/core';
+import {CourseService} from "./shared/services/course.service";
+import {Observable} from "rxjs/Rx";
+import {Course} from "../../../shared/model/course";
+
+import 'rxjs/add/operator/map';
 
 @Component({
   selector: 'app-root',
   templateUrl: './app.component.html',
   styleUrls: ['./app.component.css']
 })
-export class AppComponent {
-  title = 'app works!';
+export class AppComponent implements OnInit {
+
+    course$: Observable<Course>;
+
+
+    constructor(private courseService: CourseService) {
+
+    }
+
+    ngOnInit():void {
+
+        this.course$ = this.courseService.findCourseById(1);
+
+    }
+
+
 }
diff --git a/frontend/src/app/course/course.component.ts b/frontend/src/app/course/course.component.ts
index 1f8b22d..2eddc43 100644
--- a/frontend/src/app/course/course.component.ts
+++ b/frontend/src/app/course/course.component.ts
@@ -5,6 +5,7 @@ import {Course} from "../../../../shared/model/course";
 
 
 
+
 @Component({
   selector: 'course',
   templateUrl: './course.component.html',
diff --git a/frontend/src/app/shared/services/course.service.ts b/frontend/src/app/shared/services/course.service.ts
index 54c12ae..fc780f2 100644
--- a/frontend/src/app/shared/services/course.service.ts
+++ b/frontend/src/app/shared/services/course.service.ts
@@ -1,5 +1,7 @@
 import { Injectable } from '@angular/core';
 import {Http} from "@angular/http";
+import {Observable} from "rxjs/Rx";
+import {Course} from "../../../../../shared/model/course";
 
 
 
@@ -13,7 +15,9 @@ export class CourseService {
   }
 
 
-
+    findCourseById(id:number): Observable<Course> {
+        return this.http.get(`/courses/${id}`).map(res => res.json());
+    }
 
 
 }

From b1b441c511b9324d72b822060417a103288914a5 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 18:23:00 +0200
Subject: [PATCH 47/49] ongoing REST API

---
 {frontend => app}/.editorconfig                     |   0
 {frontend => app}/.gitignore                        |   0
 {frontend => app}/angular-cli.json                  |   0
 {frontend => app}/e2e/app.e2e-spec.ts               |   0
 {frontend => app}/e2e/app.po.ts                     |   0
 {frontend => app}/e2e/tsconfig.json                 |   0
 {frontend => app}/package.json                      |   0
 {frontend => app}/proxy.conf.json                   |   0
 {frontend => app}/src/app/app-routing.module.ts     |   0
 {frontend => app}/src/app/app.component.css         |   0
 {frontend => app}/src/app/app.component.html        |   0
 {frontend => app}/src/app/app.component.spec.ts     |   0
 {frontend => app}/src/app/app.component.ts          |   4 +++-
 {frontend => app}/src/app/app.module.ts             |   0
 .../src/app/course/course.component.css             |   0
 .../src/app/course/course.component.html            |   0
 .../src/app/course/course.component.spec.ts         |   0
 .../src/app/course/course.component.ts              |   3 ++-
 {frontend => app}/src/app/index.ts                  |   0
 {frontend => app}/src/app/shared/index.ts           |   0
 .../src/app/shared/services/course.service.spec.ts  |   0
 .../src/app/shared/services/course.service.ts       |   3 ++-
 {frontend => app}/src/assets/.gitkeep               |   0
 {frontend => app}/src/assets/.npmignore             |   0
 {frontend => app}/src/assets/app.css                |   0
 .../src/environments/environment.prod.ts            |   0
 {frontend => app}/src/environments/environment.ts   |   0
 {frontend => app}/src/favicon.ico                   | Bin
 {frontend => app}/src/index.html                    |   0
 {frontend => app}/src/main.ts                       |   0
 {frontend => app}/src/polyfills.ts                  |   0
 {shared => app/src/shared}/model/course.ts          |   0
 {shared => app/src/shared}/model/lesson.ts          |   0
 {frontend => app}/src/styles.css                    |   0
 {frontend => app}/src/test.ts                       |   0
 {frontend => app}/src/tsconfig.json                 |   0
 {frontend => app}/src/typings.d.ts                  |   0
 {frontend => app}/tslint.json                       |   0
 38 files changed, 7 insertions(+), 3 deletions(-)
 rename {frontend => app}/.editorconfig (100%)
 rename {frontend => app}/.gitignore (100%)
 rename {frontend => app}/angular-cli.json (100%)
 rename {frontend => app}/e2e/app.e2e-spec.ts (100%)
 rename {frontend => app}/e2e/app.po.ts (100%)
 rename {frontend => app}/e2e/tsconfig.json (100%)
 rename {frontend => app}/package.json (100%)
 rename {frontend => app}/proxy.conf.json (100%)
 rename {frontend => app}/src/app/app-routing.module.ts (100%)
 rename {frontend => app}/src/app/app.component.css (100%)
 rename {frontend => app}/src/app/app.component.html (100%)
 rename {frontend => app}/src/app/app.component.spec.ts (100%)
 rename {frontend => app}/src/app/app.component.ts (91%)
 rename {frontend => app}/src/app/app.module.ts (100%)
 rename {frontend => app}/src/app/course/course.component.css (100%)
 rename {frontend => app}/src/app/course/course.component.html (100%)
 rename {frontend => app}/src/app/course/course.component.spec.ts (100%)
 rename {frontend => app}/src/app/course/course.component.ts (84%)
 rename {frontend => app}/src/app/index.ts (100%)
 rename {frontend => app}/src/app/shared/index.ts (100%)
 rename {frontend => app}/src/app/shared/services/course.service.spec.ts (100%)
 rename {frontend => app}/src/app/shared/services/course.service.ts (85%)
 rename {frontend => app}/src/assets/.gitkeep (100%)
 rename {frontend => app}/src/assets/.npmignore (100%)
 rename {frontend => app}/src/assets/app.css (100%)
 rename {frontend => app}/src/environments/environment.prod.ts (100%)
 rename {frontend => app}/src/environments/environment.ts (100%)
 rename {frontend => app}/src/favicon.ico (100%)
 rename {frontend => app}/src/index.html (100%)
 rename {frontend => app}/src/main.ts (100%)
 rename {frontend => app}/src/polyfills.ts (100%)
 rename {shared => app/src/shared}/model/course.ts (100%)
 rename {shared => app/src/shared}/model/lesson.ts (100%)
 rename {frontend => app}/src/styles.css (100%)
 rename {frontend => app}/src/test.ts (100%)
 rename {frontend => app}/src/tsconfig.json (100%)
 rename {frontend => app}/src/typings.d.ts (100%)
 rename {frontend => app}/tslint.json (100%)

diff --git a/frontend/.editorconfig b/app/.editorconfig
similarity index 100%
rename from frontend/.editorconfig
rename to app/.editorconfig
diff --git a/frontend/.gitignore b/app/.gitignore
similarity index 100%
rename from frontend/.gitignore
rename to app/.gitignore
diff --git a/frontend/angular-cli.json b/app/angular-cli.json
similarity index 100%
rename from frontend/angular-cli.json
rename to app/angular-cli.json
diff --git a/frontend/e2e/app.e2e-spec.ts b/app/e2e/app.e2e-spec.ts
similarity index 100%
rename from frontend/e2e/app.e2e-spec.ts
rename to app/e2e/app.e2e-spec.ts
diff --git a/frontend/e2e/app.po.ts b/app/e2e/app.po.ts
similarity index 100%
rename from frontend/e2e/app.po.ts
rename to app/e2e/app.po.ts
diff --git a/frontend/e2e/tsconfig.json b/app/e2e/tsconfig.json
similarity index 100%
rename from frontend/e2e/tsconfig.json
rename to app/e2e/tsconfig.json
diff --git a/frontend/package.json b/app/package.json
similarity index 100%
rename from frontend/package.json
rename to app/package.json
diff --git a/frontend/proxy.conf.json b/app/proxy.conf.json
similarity index 100%
rename from frontend/proxy.conf.json
rename to app/proxy.conf.json
diff --git a/frontend/src/app/app-routing.module.ts b/app/src/app/app-routing.module.ts
similarity index 100%
rename from frontend/src/app/app-routing.module.ts
rename to app/src/app/app-routing.module.ts
diff --git a/frontend/src/app/app.component.css b/app/src/app/app.component.css
similarity index 100%
rename from frontend/src/app/app.component.css
rename to app/src/app/app.component.css
diff --git a/frontend/src/app/app.component.html b/app/src/app/app.component.html
similarity index 100%
rename from frontend/src/app/app.component.html
rename to app/src/app/app.component.html
diff --git a/frontend/src/app/app.component.spec.ts b/app/src/app/app.component.spec.ts
similarity index 100%
rename from frontend/src/app/app.component.spec.ts
rename to app/src/app/app.component.spec.ts
diff --git a/frontend/src/app/app.component.ts b/app/src/app/app.component.ts
similarity index 91%
rename from frontend/src/app/app.component.ts
rename to app/src/app/app.component.ts
index d4409e2..c3ac388 100644
--- a/frontend/src/app/app.component.ts
+++ b/app/src/app/app.component.ts
@@ -1,9 +1,11 @@
 import { Component,OnInit } from '@angular/core';
 import {CourseService} from "./shared/services/course.service";
 import {Observable} from "rxjs/Rx";
-import {Course} from "../../../shared/model/course";
+
 
 import 'rxjs/add/operator/map';
+import {Course} from "../../shared/model/course";
+
 
 @Component({
   selector: 'app-root',
diff --git a/frontend/src/app/app.module.ts b/app/src/app/app.module.ts
similarity index 100%
rename from frontend/src/app/app.module.ts
rename to app/src/app/app.module.ts
diff --git a/frontend/src/app/course/course.component.css b/app/src/app/course/course.component.css
similarity index 100%
rename from frontend/src/app/course/course.component.css
rename to app/src/app/course/course.component.css
diff --git a/frontend/src/app/course/course.component.html b/app/src/app/course/course.component.html
similarity index 100%
rename from frontend/src/app/course/course.component.html
rename to app/src/app/course/course.component.html
diff --git a/frontend/src/app/course/course.component.spec.ts b/app/src/app/course/course.component.spec.ts
similarity index 100%
rename from frontend/src/app/course/course.component.spec.ts
rename to app/src/app/course/course.component.spec.ts
diff --git a/frontend/src/app/course/course.component.ts b/app/src/app/course/course.component.ts
similarity index 84%
rename from frontend/src/app/course/course.component.ts
rename to app/src/app/course/course.component.ts
index 2eddc43..e614256 100644
--- a/frontend/src/app/course/course.component.ts
+++ b/app/src/app/course/course.component.ts
@@ -1,5 +1,6 @@
 import { Component, OnInit, Input } from '@angular/core';
-import {Course} from "../../../../shared/model/course";
+import {Course} from "../../../shared/model/course";
+
 
 
 
diff --git a/frontend/src/app/index.ts b/app/src/app/index.ts
similarity index 100%
rename from frontend/src/app/index.ts
rename to app/src/app/index.ts
diff --git a/frontend/src/app/shared/index.ts b/app/src/app/shared/index.ts
similarity index 100%
rename from frontend/src/app/shared/index.ts
rename to app/src/app/shared/index.ts
diff --git a/frontend/src/app/shared/services/course.service.spec.ts b/app/src/app/shared/services/course.service.spec.ts
similarity index 100%
rename from frontend/src/app/shared/services/course.service.spec.ts
rename to app/src/app/shared/services/course.service.spec.ts
diff --git a/frontend/src/app/shared/services/course.service.ts b/app/src/app/shared/services/course.service.ts
similarity index 85%
rename from frontend/src/app/shared/services/course.service.ts
rename to app/src/app/shared/services/course.service.ts
index fc780f2..63f1ad9 100644
--- a/frontend/src/app/shared/services/course.service.ts
+++ b/app/src/app/shared/services/course.service.ts
@@ -1,7 +1,8 @@
 import { Injectable } from '@angular/core';
 import {Http} from "@angular/http";
+
 import {Observable} from "rxjs/Rx";
-import {Course} from "../../../../../shared/model/course";
+import {Course} from "../../../../shared/model/course";
 
 
 
diff --git a/frontend/src/assets/.gitkeep b/app/src/assets/.gitkeep
similarity index 100%
rename from frontend/src/assets/.gitkeep
rename to app/src/assets/.gitkeep
diff --git a/frontend/src/assets/.npmignore b/app/src/assets/.npmignore
similarity index 100%
rename from frontend/src/assets/.npmignore
rename to app/src/assets/.npmignore
diff --git a/frontend/src/assets/app.css b/app/src/assets/app.css
similarity index 100%
rename from frontend/src/assets/app.css
rename to app/src/assets/app.css
diff --git a/frontend/src/environments/environment.prod.ts b/app/src/environments/environment.prod.ts
similarity index 100%
rename from frontend/src/environments/environment.prod.ts
rename to app/src/environments/environment.prod.ts
diff --git a/frontend/src/environments/environment.ts b/app/src/environments/environment.ts
similarity index 100%
rename from frontend/src/environments/environment.ts
rename to app/src/environments/environment.ts
diff --git a/frontend/src/favicon.ico b/app/src/favicon.ico
similarity index 100%
rename from frontend/src/favicon.ico
rename to app/src/favicon.ico
diff --git a/frontend/src/index.html b/app/src/index.html
similarity index 100%
rename from frontend/src/index.html
rename to app/src/index.html
diff --git a/frontend/src/main.ts b/app/src/main.ts
similarity index 100%
rename from frontend/src/main.ts
rename to app/src/main.ts
diff --git a/frontend/src/polyfills.ts b/app/src/polyfills.ts
similarity index 100%
rename from frontend/src/polyfills.ts
rename to app/src/polyfills.ts
diff --git a/shared/model/course.ts b/app/src/shared/model/course.ts
similarity index 100%
rename from shared/model/course.ts
rename to app/src/shared/model/course.ts
diff --git a/shared/model/lesson.ts b/app/src/shared/model/lesson.ts
similarity index 100%
rename from shared/model/lesson.ts
rename to app/src/shared/model/lesson.ts
diff --git a/frontend/src/styles.css b/app/src/styles.css
similarity index 100%
rename from frontend/src/styles.css
rename to app/src/styles.css
diff --git a/frontend/src/test.ts b/app/src/test.ts
similarity index 100%
rename from frontend/src/test.ts
rename to app/src/test.ts
diff --git a/frontend/src/tsconfig.json b/app/src/tsconfig.json
similarity index 100%
rename from frontend/src/tsconfig.json
rename to app/src/tsconfig.json
diff --git a/frontend/src/typings.d.ts b/app/src/typings.d.ts
similarity index 100%
rename from frontend/src/typings.d.ts
rename to app/src/typings.d.ts
diff --git a/frontend/tslint.json b/app/tslint.json
similarity index 100%
rename from frontend/tslint.json
rename to app/tslint.json

From 5ac8ed10afa18f189d327e238462f21de24ac1c7 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 18:24:35 +0200
Subject: [PATCH 48/49] ongoing REST API

---
 {app/src/shared => shared}/model/course.ts | 0
 {app/src/shared => shared}/model/lesson.ts | 0
 2 files changed, 0 insertions(+), 0 deletions(-)
 rename {app/src/shared => shared}/model/course.ts (100%)
 rename {app/src/shared => shared}/model/lesson.ts (100%)

diff --git a/app/src/shared/model/course.ts b/shared/model/course.ts
similarity index 100%
rename from app/src/shared/model/course.ts
rename to shared/model/course.ts
diff --git a/app/src/shared/model/lesson.ts b/shared/model/lesson.ts
similarity index 100%
rename from app/src/shared/model/lesson.ts
rename to shared/model/lesson.ts

From f6dfcc92e2f67db6512640ee12836b859b7cade2 Mon Sep 17 00:00:00 2001
From: JHades <jhades.dev@gmail.com>
Date: Wed, 19 Oct 2016 20:58:57 +0200
Subject: [PATCH 49/49] ongoing REST API

---
 app/package.json                              |   3 +-
 app/src/app/app.component.html                |  15 +-
 app/src/app/app.component.ts                  |   3 +-
 app/src/app/course/course.component.ts        |   3 +-
 app/src/app/shared/services/course.service.ts |   6 +-
 db-schema-create-and-populate.sql             | 357 +++++++++---------
 server/queries/findCourseDetail.ts            |   3 +-
 shared/model/course-utils.ts                  |  21 ++
 shared/model/course.ts                        |  22 +-
 shared/model/lesson-utils.ts                  |  16 +
 shared/model/lesson.ts                        |  18 +-
 shared/package.json                           |  11 +
 12 files changed, 250 insertions(+), 228 deletions(-)
 create mode 100644 shared/model/course-utils.ts
 create mode 100644 shared/model/lesson-utils.ts
 create mode 100644 shared/package.json

diff --git a/app/package.json b/app/package.json
index afa369f..9f80622 100644
--- a/app/package.json
+++ b/app/package.json
@@ -23,7 +23,8 @@
     "core-js": "^2.4.1",
     "rxjs": "5.0.0-beta.12",
     "ts-helpers": "^1.1.1",
-    "zone.js": "^0.6.23"
+    "zone.js": "^0.6.23",
+    "ctc-shared": "^1.0.0"
   },
   "devDependencies": {
     "@types/jasmine": "^2.2.30",
diff --git a/app/src/app/app.component.html b/app/src/app/app.component.html
index 25bf08a..90441ff 100644
--- a/app/src/app/app.component.html
+++ b/app/src/app/app.component.html
@@ -1,2 +1,15 @@
 
-<course [course]="course$ | async"></course>
\ No newline at end of file
+<main class="l-main l-sample-app">
+
+    <div>
+
+        <div class="main-container">
+            <div class="list">
+                <course [course]="course$ | async"></course>
+            </div>
+        </div>
+
+    </div>
+
+</main>
+
diff --git a/app/src/app/app.component.ts b/app/src/app/app.component.ts
index c3ac388..1213590 100644
--- a/app/src/app/app.component.ts
+++ b/app/src/app/app.component.ts
@@ -1,10 +1,9 @@
 import { Component,OnInit } from '@angular/core';
 import {CourseService} from "./shared/services/course.service";
 import {Observable} from "rxjs/Rx";
-
+import {Course} from "ctc-shared/model/course";
 
 import 'rxjs/add/operator/map';
-import {Course} from "../../shared/model/course";
 
 
 @Component({
diff --git a/app/src/app/course/course.component.ts b/app/src/app/course/course.component.ts
index e614256..7a39bc1 100644
--- a/app/src/app/course/course.component.ts
+++ b/app/src/app/course/course.component.ts
@@ -1,6 +1,5 @@
 import { Component, OnInit, Input } from '@angular/core';
-import {Course} from "../../../shared/model/course";
-
+import {Course} from "ctc-shared/model/course";
 
 
 
diff --git a/app/src/app/shared/services/course.service.ts b/app/src/app/shared/services/course.service.ts
index 63f1ad9..98b09ac 100644
--- a/app/src/app/shared/services/course.service.ts
+++ b/app/src/app/shared/services/course.service.ts
@@ -1,9 +1,7 @@
 import { Injectable } from '@angular/core';
 import {Http} from "@angular/http";
-
 import {Observable} from "rxjs/Rx";
-import {Course} from "../../../../shared/model/course";
-
+import {Course} from "ctc-shared/model/course";
 
 
 
@@ -17,7 +15,7 @@ export class CourseService {
 
 
     findCourseById(id:number): Observable<Course> {
-        return this.http.get(`/courses/${id}`).map(res => res.json());
+        return this.http.get(`/api/courses/${id}`).map(res => res.json());
     }
 
 
diff --git a/db-schema-create-and-populate.sql b/db-schema-create-and-populate.sql
index 975e0f6..dbea32c 100644
--- a/db-schema-create-and-populate.sql
+++ b/db-schema-create-and-populate.sql
@@ -54,186 +54,181 @@ CREATE UNIQUE INDEX "sortByUrl"
   (url COLLATE pg_catalog."default");
 
 
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (3, 'angular2-pipes', 'Angular 2 Pipes', 'Learn how to leverage Pipes in Angular 2, both stateless and stateful.', 3, 'https://angular-academy.s3.amazonaws.com/course-logos/pipes.jpg', true, false, true, '2100-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-06-10 21:54:55.142+02', NULL);
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (2, 'angular2-components-and-directives', 'Angular 2 Components and Directives', 'Learn Components and maybe the most useful feature of Angular 2: Directives.', 2, 'https://angular-academy.s3.amazonaws.com/course-logos/components-and-directives.svg', true, false, true, '2100-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-06-10 21:54:55.16+02', NULL);
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (5, 'build-an-application-with-angular2', 'Build a Web App with Angular 2 and Firebase', 'Put all the concepts together to build a fully running Angular 2 application using Firebase as the database.', 4, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular_app-firebase-small.jpg', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.671+02', 'https://angular-academy.s3.amazonaws.com/thumbnails/firebase-logo.jpg');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (10, 'angular2-rxjs-observable-data-services', 'RxJs Observable Data Services', 'Use RxJs to build service layers using the Observable Data Service Pattern.', 8, 'https://angular-academy.s3.amazonaws.com/thumbnails/observable-data-services.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.697+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (7, 'angular2-routing', 'Angular 2 Router', 'Build Single Page Applications with Angular 2 and its powerful Router.', 3, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-routing-small.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.698+02', '/src/images/router-icon.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (8, 'module-loaders-and-systemjs', 'Module Loaders and Webpack 2', 'Learn how Module Loaders Work - Learn Webpack 2 and its Plugin Ecosystem.', 7, 'https://angular-academy.s3.amazonaws.com/thumbnails/webpack-small.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.699+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (11, 'angular2-ngrx', 'NgRx Angular 2 Reactive Extensions', 'Learn some of the most useful libraries in the Angular 2 Ecosystem.', 9, 'https://angular-academy.s3.amazonaws.com/thumbnails/ngrx.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.715+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (12, 'angular2-universal', 'Angular 2 Universal', 'Learn maybe the biggest game changing technology in the Angular 2 Ecosystem.', 10, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular_universal.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.736+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (4, 'angular2-forms', 'Angular 2 Forms', 'Learn how to build validatable and user-friendly data Forms effectively.', 3, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular-forms-small.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.611+02', 'https://angular-academy.s3.amazonaws.com/course-logos/lesson-icons/forms.jpg');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (9, 'angular2-http', 'Angular 2 HTTP and Services', 'Build Services using Observables, learn to use the HTTP module effectively.', 1, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular-http.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.632+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (13, 'angular2-progressive-web-applications', 'Angular 2 Progressive Web Apps', 'Learn the Future of Mobile development: Progressive Web Applications.', 11, 'https://angular-academy.s3.amazonaws.com/thumbnails/pwa.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.75+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (6, 'angular2-advanced-components', 'Angular 2 Advanced Components', 'A deep dive on Components, focusing on commonly needed advanced use cases.', 5, 'https://angular-academy.s3.amazonaws.com/thumbnails/advanced-components.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.63+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (1, 'getting-started-with-angular2', 'Angular 2 Tutorial For Beginners', 'Establish a solid layer of fundamentals, learn what''s under the hood of Angular 2', 0, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-for-beginners-small.png', false, false, false, '1970-02-01 00:00:00+01', '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.606+02', 'https://angular-academy.s3.amazonaws.com/main-logo/main-page-logo-small-hat.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (14, 'angular2-architecture', 'Angular 2 Architecture', 'Learn how to build next-generation (Post-REST ?) user interfaces in Angular 2.', 12, 'https://angular-academy.s3.amazonaws.com/thumbnails/architecture.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-08-16 15:55:24.236181+02', '2016-10-07 21:16:20.75+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-INSERT INTO "Courses" ("id", "url", "description", "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "visibleFrom", "createdAt", "updatedAt", "courseListIcon") VALUES (15, 'angular2-security', 'Angular 2 Security', 'Learn how to build secure Angular 2 Applications Using JSON Web Tokens.', 13, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-security.jpg', true, false, true, '1970-02-01 00:00:00+01', '2016-08-16 15:59:06.727615+02', '2016-10-07 21:16:20.751+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
-
-
-
-
-
-
-
-
-
-
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (17, 'angular2-component-events', 'Angular 2 Event Handling', '4:44', 3, 1, false, 'cz2k4v9ru9', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:29.967+02', '2016-10-07 21:16:21.458+02', '184142889');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (74, 'angular2-template-driven-forms-ngmodel', 'Angular 2 Template Driven Forms   - NgModel is Not Only For Two-Way Data Binding', '4:59', 0, 4, false, 'qepcman198', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:17:36.888+02', '2016-10-07 21:16:24.725+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (182, 'angular2-firebase-logout', 'Setup the Logout Functionality', '1:42', 51, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.385+02', '2016-10-07 21:16:33.618+02', '185645254');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (92, 'angular2-router-initial-setup', 'Angular 2 Router Setup - Avoid A Pitfall Right From The Start, Setup Router Debugging', '5:33', 1, 7, false, '7yelea6od7', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:06.18+02', '2016-10-07 21:16:34.147+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (19, 'angular2-components-styling-component-isolation', 'Styling Angular 2 Components - Learn About Component Style Isolation', '3:27', 5, 1, true, 'k015b52000', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:30.014+02', '2016-10-07 21:16:21.463+02', '184142895');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (101, 'angular2-router-avoid-memory-leaks', 'Exiting an Angular 2 Route - How To Prevent Memory Leaks', '4:48', 9, 7, true, 'eq79s94k7e', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.305+02', '2016-10-07 21:16:35.13+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (105, 'angular2-router-auxiliary-route-parameters', 'Angular 2 Auxiliary Routes - How To Pass Router Parameters', '2:55', 13, 7, true, '2reddha2qe', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.858+02', '2016-10-07 21:16:35.504+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (168, 'angular2-firebase-choose-ide', 'Choosing an IDE', '1:50', -1, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:29.569+02', '2016-10-06 17:06:57.988+02', '185502826');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (108, 'angular2-router-exercise-build-a-dashboard', 'Exercise - Implement a Widget Dashboard With Multiple Auxiliary Routes', '2:50', 18, 7, true, 'lqmnh3aec3', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:08.387+02', '2016-10-07 21:16:36.018+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (20, 'angular2-components-component-interaction', 'Angular 2 Component Interaction - Extended Components Example', '9:22', 6, 1, true, '4vxtb8n8om', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:30.015+02', '2016-10-07 21:16:21.463+02', '184142892');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (116, 'angular2-firebase-cli-hello-world', 'Angular 2 Final Application Scaffolding using the Angular CLI', '2:58', 0, 5, true, 'kje3e5vy3m', 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:16:17.567+02', '2016-10-07 21:16:28.407+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (119, 'angular2-firebase-references-and-snapshots', 'Firebase Fundamentals  - References,  Snapshots and Keys', '3:24', 3, 5, false, 'sedl4g5c4b', 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:16:17.569+02', '2016-10-07 21:16:28.813+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (112, 'angular2-lazy-loading-shared-modules', 'Angular 2 Router Lazy Loading and Shared Modules - How to Lazy-Load a Module', '8:43', 16, 7, false, 'myy3p2x53f', 'https://github.com/angular-university/courses', '', 'ADVANCED', '2016-09-02 16:31:04.247+02', '2016-10-07 21:16:35.722+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (12, 'angular2-setting-up-a-project-using-typescript-systemjs', 'Angular 2 Development Environment - Start Development Using a Beginner Friendly Playground', '10:56', 23, 1, false, '1djl556fwl', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-07-25 20:55:31.536+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (13, 'introduction-to-angular2-running-the-lessons', 'Running the the Lessons Code', '3:00', -2, 1, false, '2mv2gtsbbz', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:20.889+02', '184970245');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (172, 'angular2-firebase-create-form-component', 'Creating the Lesson Form Component - Used both for Edit and for Creation', '6:37', 41, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.333+02', '2016-10-07 21:16:32.567+02', '185821061');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (177, 'angular2-firebase-edit-lesson-show-data-in-edit-form', 'Edit Lesson - Passing the Retrieved Data to the Lesson Form', '3:25', 46, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.856+02', '2016-10-07 21:16:33.09+02', '185629439');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (16, 'angular2-hello-world-write-first-application', 'Angular 2 Tutorial For Beginners - Build Your First App - Hello World Step By Step', '2:49', 0, 1, false, 'do2r7udndo', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:29.945+02', '2016-10-07 21:16:20.898+02', '184142896');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (15, 'angular2-build-your-first-component', 'Building Your First Angular 2 Component - Component Composition', '2:07', 1, 1, false, 'izvg348ckx', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:29.967+02', '2016-10-07 21:16:20.899+02', '184142897');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (18, 'angular2-component-templates-internal-vs-external', 'Angular 2 Component Templates - Inline Vs External', '2:55', 4, 1, true, '8fvvouohu8', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:29.988+02', '2016-10-07 21:16:21.464+02', '184142888');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (11, 'angular2-debugging-with-augury-or-console', 'How To Debug An Angular 2 Application - Debugging via Augury or the Console', '2:59', 22, 1, true, 'ehxvwqujir', 'https://github.com/angular-university/courses', 'http://www/google.com', 'INTERMEDIATE', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.112+02', '184142989');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (187, 'angular2-firebase-rounding-up', 'Rounding Up the Course', '01:01', 56, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.911+02', '2016-10-06 17:27:09.056+02', '185700728');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (50, 'angular2-introduction-to-typescript-the-arrow-operator', 'Introduction To Typescript - The Arrow (=>) Operator', '4:52', 34, 1, true, 'ukndfgobup', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:47:27.989+02', '2016-10-07 21:16:24.189+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (167, 'angular2-firebase-starter-kit', 'Installing the Starter Kit', '2:14', 1, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:29.571+02', '2016-10-07 21:16:28.427+02', '185793640');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (6, 'angular2-core-directives-ngfor', 'Angular 2 Core Directives  - ngFor', '3:46', 11, 1, true, '4plhp3lf3p', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.008+02', '184142919');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (76, 'angular2-ngmodel-bidirectional-binding', 'NgModel - Why Would You Want To Turn Off Two-Way Data Binding ?', '3:44', 1, 4, false, 'asyqh8c5oo', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:14.349+02', '2016-10-07 21:16:24.724+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (24, 'angular2-write-first-injectable-service', 'Angular 2 Services Tutorial - Writing Your First Service - Learn @Injectable', '3:46', 25, 1, true, '5t4wrxs4m0', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-01 22:25:57.621+02', '2016-10-07 21:16:23.632+02', '184142963');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (46, 'angular2-introduction-to-directives-write-a-custom-directive', 'Angular 2 Directives Tutorial - Write Your First Custom Directive', '4:31', 9, 1, true, 'wwzbuk564h', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:05:54.065+02', '2016-10-07 21:16:22.009+02', '184142924');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (48, 'angular2-directives-exercise-improve-collapsible-directive', 'Introduction to Angular 2 Directives - Exercise - Improve the Collapsible Directive', '1:30', 15, 1, true, 'k6rp4j98y3', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:05:55.14+02', '2016-10-07 21:16:22.553+02', '184142925');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (3, 'angular2-template-syntax-interpolation', 'Angular 2 Template Syntax - Interpolation', '2:41', 18, 1, true, 'dpfn1w9gd1', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.103+02', '184142935');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (42, 'angular2-http-error-handling', 'Angular 2 Services - HTTP Error Handling', '2:21', 28, 1, true, 'wz873e5qm0', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-03 10:25:37.253+02', '2016-10-07 21:16:23.653+02', '184142969');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (41, 'angular2-http-how-to-do-an-http-post-call', 'Angular 2 Services - Using the HTTP service to do an HTTP POST ', '5:32', 27, 1, true, '42andffp81', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-03 10:25:36.712+02', '2016-10-07 21:16:23.641+02', '184142963');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (75, 'angular2-form-state-classes', 'Angular 2 Form CSS State Classes with NgModel - How to Mark a Field As Mandatory ?', '4:02', 2, 4, true, 'y63g98brmp', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:14.362+02', '2016-10-07 21:16:24.724+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (81, 'angular2-ngmodelgroup', 'Control Groups with ngModelGroup - Validation And Binding', '3:03', 6, 4, true, 'sv0te31xaf', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.077+02', '2016-10-07 21:16:25.256+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (4, 'angular2-template-syntax-events', 'Template Syntax - Introduction To Zones - How does the Angular 2 event handling mechanism work?', '5:14', 19, 1, true, 'g5y4yahjkv', 'https://github.com/angular-university/courses', 'http://www/google.com', 'ADVANCED', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.103+02', '184142934');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (23, 'anhular-http-do-a-get-call-to-express-server', 'Angular 2 Services - Introduction to the HTTP Service - Do a GET HTTP Server Call', '3:43', 26, 1, true, '', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-01 22:25:57.642+02', '2016-10-07 21:16:23.642+02', '184142965');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (43, 'angular2-introduction-to-services-exercise', 'Angular 2 Services  - Exercise - Do an HTTP DELETE', '0:54', 31, 1, true, 'uonpjji210', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-03 10:25:37.254+02', '2016-10-07 21:16:24.183+02', '184142964');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (10, 'angular2-guided-tour-pipes', 'Angular 2 Pipes - Learn Why Standard Pipes Might Not Work, Create a Custom Pipe', '5:01', 21, 1, true, 'tbc7tut0xd', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.104+02', '184142990');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (87, 'angular2-formcontrol-directive', 'Angular 2 Model Driven Forms - The formControl Directive', '1:57', 12, 4, true, '0l3zswws9x', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.629+02', '2016-10-07 21:16:25.789+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (88, 'angular2-custom-validator-form-driven', 'Angular 2 Template Driven Form Custom Validator', '5:44', 14, 4, true, 'j0lv6idl3n', 'https://github.com/angular-university/courses', '', 'ADVANCED', '2016-07-14 10:56:15.634+02', '2016-10-07 21:16:26.228+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (173, 'angular2-firebase-save-new-lesson', 'Lessons Service - Add Save New Lesson Functionality', '12:58', 42, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.335+02', '2016-10-07 21:16:32.572+02', '185630740');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (178, 'angular2-firebase-edit-lesson-implement-lessons-service', 'Edit Lesson - Implement the Save Lesson Service', '3:02', 47, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.863+02', '2016-10-07 21:16:33.095+02', '185614367');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (183, 'angular2-firebase-redirect-to-login-router-guard', 'Redirect User To Login Page Using a Router Guard', '5:33', 52, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.391+02', '2016-10-07 21:16:33.621+02', '185655550');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (5, 'angular2-guided-tour-components', 'Guided Tour to Angular 2 Components', '5:57', 20, 1, true, 'bsvsucnvi1', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-07-25 20:55:31.53+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (100, 'angular2-router-child-routes', 'Child Routes - How To Setup a Master Detail Route - What Are Componentless Routes ?', '4:09', 5, 7, false, 'dz01hx4vk8', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.271+02', '2016-10-07 21:16:34.668+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (103, 'angular2-router-auxiliary-routes', 'Configure Auxiliary Routes in the Angular 2 Router - What is the Difference Towards a Primary Route?', '5:16', 12, 7, false, 'ni0s94foyl', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.838+02', '2016-10-07 21:16:35.194+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (77, 'angular2-standard-validators', 'Angular 2 Standard Form Validators How do Template Driven Forms Work Under The Hood ?', '3:32', 3, 4, false, '02wcuod8mq', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:14.379+02', '2016-10-07 21:16:24.729+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (80, 'angular2-model-driven-reactive-forms', 'Angular 2 Reactive or Model Driven Forms - formGroup and formControlName', '4:07', 7, 4, false, 't86f6p3iwg', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.068+02', '2016-10-07 21:16:25.257+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (169, 'angular2-firebase-router-navigate-detail-to-lesson', 'Navigating From Lesson To Lesson - Part 1', '5:17', 37, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:33.863+02', '2016-10-07 21:16:32.052+02', '185489289');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (85, 'angular2-model-driven-forms-errors', 'Angular 2 Model Driven Forms - Mark Fields in Error', '2:08', 11, 4, true, '5tx0g7gvir', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.62+02', '2016-10-07 21:16:25.79+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (58, 'angular2-what-is-an-observable', 'What is an Observable ? Introduction to Streams and RxJs Observables', '5:41', 0, 9, false, 'qkszh2b23j', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-16 17:25:37.294+02', '2016-10-07 21:16:26.747+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (7, 'angular2-core-directives-ngclass-ngstyle', 'Angular 2 Core Directives - ngClass and ngStyle', '3:15', 12, 1, true, 'lqf7s80in4', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.545+02', '184142920');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (69, 'angular2-how-to-setup-an-http-request-sequence-using-the-rxjs-switchmap-operator', 'How to setup an HTTP request sequence using the RxJs switchMap Operator', '4:33', 10, 9, true, '6bq8ok9kyu', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.787+02', '2016-10-07 21:16:27.783+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (60, 'angular2-observables-error-handling-and-completion-network-calls-as-observables', 'Observables Error Handling and Completion - How do Observables handle Errors?', '5:28', 1, 9, false, '57mzkztwna', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-17 11:22:44.281+02', '2016-10-07 21:16:26.846+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (70, 'angular2-retry-http-requests-in-error-using-the-retry-and-retrywhen-rxjs-operators', 'Retry HTTP requests in Error using the retry and retryWhen RxJs Operators', '3:42', 11, 9, true, '5tp98dm1z9', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.875+02', '2016-10-07 21:16:27.884+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (71, 'angular2-how-to-cancel-an-http-request-using-an-rxjs-subscription', 'How to Cancel an HTTP Request using an RxJs Subscription', '2:56', 12, 9, true, 'nmxsxewesw', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.878+02', '2016-10-07 21:16:27.893+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (49, 'angular2-directives-exercise-solution-improve-collapsible-directive', 'Introduction to Angular 2 Directives - Exercise Solution', '2:40', 16, 1, true, 'z0bhpmmjvg', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:05:55.146+02', '2016-10-07 21:16:22.553+02', '184142926');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (174, 'angular2-firebase-custom-url-validator', 'Add New Lesson - Add a Custom Url Field Validator', '3:05', 43, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.407+02', '2016-10-07 21:16:32.575+02', '185617264');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (179, 'angular2-firebase-authentication-login-page', 'Setup Firebase Authentication, Create a Login Page', '8:52', 48, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.929+02', '2016-10-07 21:16:33.094+02', '185637428');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (184, 'angular2-firebase-rest', 'REST and Firebase - Using the Firebase REST API', '8:25', 53, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.452+02', '2016-10-07 21:16:33.621+02', '185672097');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (68, 'angular2-how-to-do-two-http-requests-in-parallel-using-the-rxjs-combinelatest-operator', 'How to do two HTTP Requests in Parallel using the RxJs combineLatest Operator', '3:58', 9, 9, true, '5hje9r3scu', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.362+02', '2016-10-07 21:16:27.393+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (99, 'angular2-router-optional-route-parameters', 'Optional Route Query Parameters - The queryParams Directive and the Query Parameters Observable', '2:38', 8, 7, true, 'truncmdgqd', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.27+02', '2016-10-07 21:16:34.99+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (72, 'angular2-exercise-improve-a-search-service-and-build-a-typeahead', 'Exercise - Improve a Search Service and Build a Typeahead', '3:15', 13, 9, true, '4zghhkugte', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.878+02', '2016-10-07 21:16:27.908+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (106, 'angular2-router-redirects-path-matching', 'Angular 2 Router Redirects and Path Matching - Avoid Common Routing Pitfall', '2:59', 14, 7, true, '5c64ijq3jp', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.866+02', '2016-10-07 21:16:35.643+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (59, 'angular2-', 'When To Use Template Driven Vs Model Driven Forms ? It Might Surprise You', '6:10', 15, 9, false, 'gk8rvjtlcs', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', '', 'BEGINNER', '2016-06-17 11:02:05.708+02', '2016-07-14 10:51:02.929+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (45, 'angular2-introduction-to-services-exercise-solution', 'Angular 2 Services - Exercise Solution - Do an HTTP DELETE', '3:55', 32, 1, true, 'xzmcddzprl', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-03 10:25:37.259+02', '2016-10-07 21:16:24.188+02', '184142961');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (51, 'angular2-introduction-to-typescript-high-level-overview', 'Introduction to Typescript - High-level Overview', '7:00', 32, 1, true, '5liaw3xqcl', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', '', 'BEGINNER', '2016-06-10 14:47:27.988+02', '2016-07-25 20:55:32.629+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (93, 'angular2-router-styling-active-routes', 'Styling Active Routes With The routerLinkActive And routerLinkActiveOptions Directives', '2:00', 4, 7, true, 'cmvn3agj0r', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:06.205+02', '2016-10-07 21:16:34.611+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (90, 'angular2-signup-form', 'Angular 2 Forms Section Exercise - Build a Signup Form', '1:34', 17, 4, true, 'ln7apm0k55', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:16.158+02', '2016-10-07 21:16:26.334+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (175, 'angular2-firebase-edit-lesson-initial-setup', 'Edit Lesson - Initial Screen Setup', '2:35', 44, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.567+02', '2016-10-07 21:16:32.937+02', '185619063');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (1, 'angular2-mvc-hello-world-controllers-and-templates', 'Angular 2 Hello World from an MVC point of View - Controllers and Templates', '3:56', 16, 1, true, '34uq56rny5', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-07-25 20:55:30.976+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (91, 'angular2-signup-form-example', 'Exercise - Build an Angular 2 Signup Form - Lets do a little Functional Programming', '6:10', 18, 4, true, 't3biv0e0b1', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:16.172+02', '2016-10-07 21:16:26.335+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (62, 'angular2-observable-map-operator-how-to-create-an-observable-from-another', 'The RxJs Map Operator - How to create an Observable from another Observable', '3:04', 5, 9, true, 'teu8cvuxpk', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-17 12:32:57.146+02', '2016-10-07 21:16:27.267+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (83, 'angular2-formbuilder', 'Building Reactive or Model Driven Forms using the FormBuilder', '2:13', 9, 4, true, 'hwqdlbed1s', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.076+02', '2016-10-07 21:16:25.718+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (22, 'angular2-components-exercise-solution', 'Angular 2 Components Tutorial For Beginners - Components Exercise Solution Inside', '2:08', 8, 1, true, '0dn1er1mhl', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:30.033+02', '2016-10-07 21:16:22.002+02', '184142886');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (180, 'angular2-firebase-authentication-observable-data-service', 'Building an Authentication Observable Data Service', '7:06', 49, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.094+02', '2016-10-07 21:16:33.45+02', '185651290');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (118, 'angular2-firebase-typescript', 'Use Firebase SDK with Typescript - Preparing to Run a Firebase Database Population Script', '3:18', 4, 5, true, '07krcugyia', 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:16:17.593+02', '2016-10-07 21:16:28.922+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (185, 'angular2-firebase-security-rules', 'Protect Write Access Using Security Rules', '1:34', 54, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.63+02', '2016-10-07 21:16:33.964+02', '185697988');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (157, 'angular2-firebase-join-3', 'Joins in Firebase - Performance Considerations', '7:39', 28, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:19.844+02', '2016-10-07 21:16:31.393+02', '184967346');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (154, 'angular2-setup-dev-environment-1', 'Setting Up an Angular 2 Development Environment', '8:47', -3, 1, false, NULL, 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-09-30 10:32:13.193+02', '2016-10-07 21:16:20.888+02', '184970793');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (144, 'angular2-firebase-home-screen', 'Starting the Application From the Beginning - Build the Home Screen', '3:33', 16, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.926+02', '2016-10-07 21:16:29.98+02', '184666053');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (47, 'angular2-directives-inputs-outputs-event-emitters', 'Angular 2 Directives - Inputs, Output Event Emitters and How To Export Template References', '4:01', 10, 1, true, 'ewor3ytohi', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:05:54.592+02', '2016-10-07 21:16:22.009+02', '184142922');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (137, 'angular2-angular-cli', 'Getting Started with Angular 2 - Off the Ground Running with the Angular CLI', '8:47', -1, 1, false, NULL, 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-09-25 20:47:01.476+02', '2016-10-07 21:16:20.898+02', '184146937');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (162, 'angular2-firebase-pagination-3', 'Firebase Pagination Concluded - Loading the Previous Page', '2:11', 33, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:20.364+02', '2016-10-07 21:16:31.905+02', '184967551');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (96, 'angular2-router-home-route-fallback-route', 'Configuring a Home Route and Fallback Route - Learn An Essential Routing Concept', '2:55', 3, 7, false, '4n4vg3xnw2', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:06.199+02', '2016-10-07 21:16:34.477+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (86, 'angular2-custom-validator-model-driven', 'Angular 2 Model Driven Form Custom Validator', '3:05', 13, 4, true, '3mv64gc7ox', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.629+02', '2016-10-07 21:16:25.789+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (170, 'angular2-firebase-detail-navigation-route-params-observable', 'Navigating From Lesson To Lesson - The Route Params Observable', '4:48', 39, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.031+02', '2016-10-07 21:16:32.423+02', '185493478');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (102, 'angular2-router-can-activate-guard', 'CanActivate Route Guard - An Example of An Asynchronous Route Guard', '3:31', 11, 7, true, 'fpfcigk7f4', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.838+02', '2016-10-07 21:16:35.195+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (67, 'angular2-how-to-do-multiple-http-requests-using-the-rxjs-concat-operator', 'How to do multiple HTTP requests using the RxJs Concat Operator', '4:19', 8, 9, true, 'nolo492foa', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.319+02', '2016-10-07 21:16:27.391+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (133, 'angular2-firebase-arrays', 'Firebase Arrays - Does Firebase Support Arrays ? ', '5:34', 9, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:22:37.174+02', '2016-10-07 21:16:29.445+02', '184016880');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (150, 'angular2-firebase-router-config', 'Setting Up the Router Configuration of our Application', '4:47', 21, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:15.458+02', '2016-10-07 21:16:30.498+02', '184682667');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (107, 'angular2-router-hash-location-strategy', 'Angular 2 Router Hash Location Strategy vs HTML5 Location Strategy', '3:04', 15, 7, true, 'kh88uahdfi', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:08.384+02', '2016-10-07 21:16:35.719+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (97, 'angular2-router-manual-navigation', 'Programmatic Router Navigation via the Router API - Relative And Absolute Router Navigation', '3:59', 6, 7, true, '4h570iufj2', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.269+02', '2016-10-07 21:16:34.671+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (53, 'angular2-introduction-to-typescript-array-spread-operator-object-destructuring', 'Introduction To Typescript - The Array Spread Operator, Object Destructuring and more', '4:54', 35, 1, true, '1hxfcykcqb', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:47:27.99+02', '2016-10-07 21:16:24.196+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (54, 'angular2-introduction-to-typescript-imports-and-exports', 'Introduction To Typescript - Imports and Exports - One of the main missing features of ES5 ?', '4:32', 36, 1, true, 'hhostv2mm3', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-10 14:47:28.017+02', '2016-10-07 21:16:24.691+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (113, 'angular2-shared-modules-service-configuration', 'Shared Modules And Lazy Loading - How to Setup Shared Services', '6:39', 17, 7, true, 'eyqw5spxpt', 'https://github.com/angular-university/courses', '', 'ADVANCED', '2016-09-02 16:31:04.607+02', '2016-10-07 21:16:35.721+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (8, 'angular2-core-directives-ngIf', 'Angular 2 Core Directives - ngIf', '3:56', 13, 1, true, 'pxzihsuyyl', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.547+02', '184142921');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (84, 'angular2-reactive-forms-rxjs', 'Reactive Forms with RxJs - Learn Why They Are more Powerful than Template Driven', '6:23', 10, 4, true, 'lwp06a352f', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.417+02', '2016-10-07 21:16:25.784+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (61, 'angular2-observable-composition-combine-latests', 'Observable Composition - combine multiple Observables Using combineLatest', '5:59', 6, 9, true, 'dvjz3ljjis', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-17 12:32:57.158+02', '2016-10-07 21:16:27.363+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (110, 'angular2-ngmodule', 'Angular 2 Modularity - @NgModule and Feature Modules - Learn why a Component Might Not Be Visible', '4:48', 30, 1, false, 'vpir75f1ts', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-09-02 15:52:42.033+02', '2016-10-07 21:16:24.162+02', '184142991');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (171, 'angular2-firebase-create-new-lesson', 'The Create New Lesson Form', '5:21', 40, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.035+02', '2016-10-07 21:16:32.552+02', '185498124');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (186, 'angular2-firebase-node-queue', 'Build a Custom Node Backend Using Firebase Queue', '11:46', 55, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.635+02', '2016-10-07 21:16:34.09+02', '185696987');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (176, 'angular2-firebase-edit-lesson-router-resolve', 'Edit Lesson - Retrieve Lesson using the Router Resolve Functionality', '7:54', 45, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:34.569+02', '2016-10-07 21:16:33.065+02', '185627971');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (79, 'angular2-form-field-errors', 'How to display Form Field Validation Error Messages with NgModel', '3:28', 5, 4, true, '10h56dk1oh', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:14.895+02', '2016-10-07 21:16:25.252+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (145, 'angular2-firebase-service-layer-example', 'Building our First Firebase Service - The Lessons Service', '7:24', 17, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.93+02', '2016-10-07 21:16:29.984+02', '184669713');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (2, 'angular2-template-syntax-properties', 'Angular 2 Template Syntax - Properties', '5:12', 17, 1, true, 'sir1uv5mc2', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.094+02', '184142936');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (146, 'angular2-firebase-smart-vs-presentation-components', 'Angular 2 Smart Components vs Presentation Components: What''s the Difference and When to Use Each ?', '4:36', 18, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.969+02', '2016-10-07 21:16:30.364+02', '184671952');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (52, 'angular2-introduction-to-typescript-classes-and-interfaces', 'Introduction To Typescript - Classes and Interfaces', '3:47', 33, 1, true, 'nrsfl3an8z', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', '', 'BEGINNER', '2016-06-10 14:47:27.989+02', '2016-09-25 21:35:33.363+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (66, 'angular2-how-to--aAvoid-duplicate-http-requests-rxjs-cache-operator', 'Avoid the Biggest Pitfall of Angular 2 HTTP - Learn the RxJs Cache Operator', '5:10', 7, 9, true, 'oiizaw0h1s', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.312+02', '2016-10-07 21:16:27.378+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (73, 'angular2-exercise-solution-learn-how-to-build-a-typeahead-that-cancels-obsolete-search-requests', 'Exercise Solution - Learn How to build a Typeahead that cancels obsolete search requests', '5:07', 14, 9, true, 'tc2l6vx42h', 'https://github.com/angular-university/courses', '', 'INTERMEDIATE', '2016-06-17 12:46:13.903+02', '2016-10-07 21:16:27.911+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (114, 'what-is-a-single-page-application', 'What is a Single Page Application ? Learn Why They Might Become More Frequent In The Future', '4:00', 0, 7, false, 'lhmqnc3l2j', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-09-20 13:16:05.526+02', '2016-10-07 21:16:34.144+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (89, 'angular2-template-driven-vs-model-driven-forms', 'When To Use Angular 2 Template Driven Vs Model Driven Forms, and Why ? ', '5:04', 16, 4, false, 'gk8rvjtlcs', 'https://github.com/angular-university/courses', '', 'ADVANCED', '2016-07-14 10:56:15.937+02', '2016-10-07 21:16:26.331+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (98, 'angular2-router-navigation-parameters', 'Master Detail Navigation And Route Parameters  - The Route Parameters Observable', '6:03', 7, 7, true, '3lmeqar4p2', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.27+02', '2016-10-07 21:16:34.674+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (104, 'angular2-router-can-deactivate-guard', 'CanDeactivate Route Guard - How To Confirm If The User Wants To Exit A Route', '4:42', 10, 7, true, 'sdelhsbl7r', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:07.839+02', '2016-10-07 21:16:35.191+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (44, 'angular2-rest-api-http-server-development', 'How to Setup a Development REST API HTTP Server with Express and ts-node', '2:46', 29, 1, true, 'jiyxgjgzbr', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-03 10:25:37.254+02', '2016-10-07 21:16:23.653+02', '184142966');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (109, 'angular2-router-exercise-solution-build-a-dashboard', 'Exercise Solution - Implement a Widget Dashboard With Multiple Auxiliary Routes', '4:41', 19, 7, true, 'ik1079l3pc', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:08.387+02', '2016-10-07 21:16:36.157+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (147, 'angular2-firebase-typescript-pitfall', 'Pitfall of Using Typescript Classes when Querying Data From a Backend', '6:21', 19, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.972+02', '2016-10-07 21:16:30.477+02', '184675938');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (149, 'angular2-firebase-navigation-menu', 'Building a Navigation Menu Using The Angular 2 Router', '5:53', 22, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:15.456+02', '2016-10-07 21:16:30.501+02', '184686519');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (181, 'angular2-firebase-user-registration-page', 'Build a User Registration Page', '3:50', 50, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-10-06 17:01:35.106+02', '2016-10-07 21:16:33.579+02', '185643819');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (151, 'angular2-firebase-master-detail', 'Setting Up the Master Screen of the Master Detail Pattern', '6:46', 23, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:15.486+02', '2016-10-07 21:16:30.879+02', '184690497');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (94, 'angular2-router-navigation', 'Navigate Between Angular 2 Routes - Several Ways Of Using the routerLink Directive', '3:18', 2, 7, false, 'dmlwjcbloz', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-22 13:11:06.198+02', '2016-10-07 21:16:34.15+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (134, 'angular2-firebase-data-modelling', 'Firebase Data Modeling 101 - How To Model Data In Firebase ?', '4:11', 7, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:22:37.173+02', '2016-10-07 21:16:28.946+02', '184016867');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (140, 'angular2-firebase-list-push', 'How to Write Data to the Database using AngularFire 2 ? Adding Elements to a List', '3:52', 12, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 16:44:44.433+02', '2016-10-07 21:16:29.468+02', '184659309');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (142, 'angular2-firebase-list-remove', 'How To Remove an Element from a List using AngularFire 2 ?', '3:08', 13, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.406+02', '2016-10-07 21:16:29.847+02', '184661218');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (95, 'angular2-router-introduction', 'Angular 2 Router Demo - Why Build Single Applications ?', '4:00', 0, 7, false, '7yelea6od7', 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', '', 'BEGINNER', '2016-07-22 13:11:06.17+02', '2016-07-22 19:39:03.616+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (148, 'angular2-firebase-client-side-search', 'How To Implement Client-Side Search in Angular 2 ?', '4:00', 20, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:15.348+02', '2016-10-07 21:16:30.485+02', '184680629');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (141, 'angular2-firebase-list-update', 'How To Update an Element in a Firebase List using AngularFire 2 ?', '1:11', 14, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.406+02', '2016-10-07 21:16:29.961+02', '184662832');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (166, 'angular2-firebase-install-node-and-demo-app', 'Installing Node and the Angular 2 and Firebase Demo Application', '4:45', -2, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:50:35.241+02', '2016-10-07 21:16:28.403+02', '184967332');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (115, 'angular2-firebase-sdk-hello-world', 'Firebase Real-Time Database Hello World - First Query - Debug Websockets !', '8:15', 2, 5, false, '2d4z8awdln', 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:16:17.568+02', '2016-10-07 21:16:28.43+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (123, 'angular2-populate-firebase-db-ts-node', 'Populate a Firebase Database with a Node Program - Use Typescript with Node using ts-node', '4:24', 5, 5, true, 'wypbcta6wu', 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:16:18.338+02', '2016-10-07 21:16:28.927+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (136, 'angular2-firebase-db-script-explained', 'Populate a Firebase Database -Initialization Script Explained Step By Step', '3:53', 6, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:22:37.165+02', '2016-10-07 21:16:28.943+02', '184016862');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (152, 'angular2-firebase-master-detail-navigation', 'Configuring the Angular 2 Router for Master To Detail Navigation', '3:23', 24, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:15.499+02', '2016-10-07 21:16:30.993+02', '184691854');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (135, 'angular2-firebase-database-ekeys', 'Firebase Key Generation - How to use the Firebase Push Keys, Should We Use Them and Why ?', '3:09', 8, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:22:37.174+02', '2016-10-07 21:16:29.327+02', '184016876');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (82, 'angular2-model-driven-forms-validation', 'Angular 2 Form  Validation in Model Driven Forms - Configuring a Form Validator', '2:29', 8, 4, true, 'wj3sc15qom', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:15.077+02', '2016-10-07 21:16:25.256+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (111, 'angular2-set-form-value-reset-form', 'Angular 2 Model Driven Forms - How to Set a Form Value and Reset a Form', '4:48', 15, 4, false, '4nje3w2hw4', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-09-02 16:24:08.915+02', '2016-10-07 21:16:26.32+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (14, 'angular2-passing-data-to-component-using-input', 'Component @Input - How To Pass Input Data To an Angular 2 Component', '2:33', 2, 1, false, '827hgtrr29', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:29.966+02', '2016-10-07 21:16:21.457+02', '184142891');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (63, 'how-does-angular2-use-observables-http-response-object', 'How does Angular 2 HTTP use Observables ? The HTTP Response object', '4:32', 2, 9, false, 'd7vtjvt8dt', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-17 12:46:12.757+02', '2016-10-07 21:16:26.858+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (64, 'angular2-how-to-use-observables-and-http-to-build-a-servicelayer', 'How to use Observables and HTTP to build a Service Layer', '4:32', 3, 9, false, 'g2hhysapd4', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-17 12:46:13.26+02', '2016-10-07 21:16:26.87+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (21, 'angular2-components-exercise', 'Angular 2 Components Tutorial For Beginners - Components Exercise !', '1:26', 7, 1, true, 'ipfegcf8bp', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-05-30 17:19:30.024+02', '2016-10-07 21:16:22.001+02', '184142887');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (65, 'angular2-how-to-use-the-async-pipe-to-pass-observables-into-a-template', 'Introduction to Functional Reactive Programming - Using the Async Pipe - Pitfalls to Avoid', '4:36', 4, 9, true, 'k6htip99ui', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-06-17 12:46:13.311+02', '2016-10-07 21:16:26.872+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (9, 'angular2-guided-tour-directives', 'Directives Guided Tour - Learn Why Directives Might be a Better Choice Than Components', '7:58', 14, 1, true, 'ne47xhs228', 'https://github.com/angular-university/courses', 'http://www/google.com', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.545+02', '184142927');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (117, 'angular2-firebase-demo-course-intro', 'Build an Application with Angular 2 and Firebase - Application Demo and Course Objectives', '6:51', -3, 5, false, '9c48aolpe7', 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-23 20:16:17.566+02', '2016-10-07 21:16:28.297+02', '184967711');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (153, 'angular2-firebase-master-detail-detail-screen', 'Setting Up the Detail Screen of a Master Detail Setup', '5:03', 25, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:15.866+02', '2016-10-07 21:16:31.001+02', '184696927');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (143, 'angular2-firebase-object-set-update', 'How to Modify an Object in Firebase using AngularFire 2, what is the Difference Between Set and Update?', '3:31', 15, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 17:53:14.83+02', '2016-10-07 21:16:29.97+02', '184664186');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (78, 'angular2-form-exports', 'Understanding Angular 2 Form Exports -  Disable a Form Button Until the Form is Valid', '3:15', 4, 4, true, 't0shk04mov', 'https://github.com/angular-university/courses', '', 'BEGINNER', '2016-07-14 10:56:14.379+02', '2016-10-07 21:16:25.202+02', NULL);
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (138, 'angular2-firebase-list-observable', 'AngularFire 2 Hello World - How To Write your First Query using AngularFire 2 List Observables ?', '7:43', 10, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 16:44:44.347+02', '2016-10-07 21:16:29.457+02', '184654417');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (139, 'angular2-firebase-object-observable', 'AngularFire 2 Object Observables - How to Read Objects from a Firebase Database?', '2:19', 11, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-28 16:44:44.429+02', '2016-10-07 21:16:29.466+02', '184656039');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (156, 'angular2-firebase-join-1', 'How To Make a Join in Firebase Using AngularFire 2 ? Reading a Course based on its url', '9:30', 26, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:19.502+02', '2016-10-07 21:16:31.014+02', '184967342');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (155, 'angular2-firebase-join-2', 'Joins in Firebase Continued - Querying the List Of Lesson Keys Of Lessons that Belong to a Course', '2:51', 27, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:19.504+02', '2016-10-07 21:16:31.016+02', '184818312');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (158, 'angular2-rxjs-clean-code', 'How to Write Maintainable RxJs Code ? Some Tips and Tricks on How to Write Clean Reactive Code', '4:53', 29, 5, false, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:19.898+02', '2016-10-07 21:16:31.512+02', '184967546');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (159, 'angular2-firebase-pagination-display-course-lessons', 'Displaying the Lessons Per Course in the Course Detail Page', '3:50', 30, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:19.934+02', '2016-10-07 21:16:31.514+02', '184967349');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (160, 'angular2-firebase-pagination', 'How To Do Pagination in Firebase ? Loading the First Page of a Paginated Table', '7:52', 31, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:20.063+02', '2016-10-07 21:16:31.53+02', '184967342');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (161, 'angular2-firebase-pagination-2', 'Firebase Pagination Continued - Loading the Next Page', '4:12', 32, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:20.08+02', '2016-10-07 21:16:31.533+02', '184978774');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (163, 'angular2-firebase-navigate-from-course-to-lesson', 'Navigate From Course Detail to Lesson', '5:17', 34, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:20.435+02', '2016-10-07 21:16:32.036+02', '184967348');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (164, 'angular2-firebase-lesson-detail', 'Building a Lesson Detail Component', '4:17', 35, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:20.476+02', '2016-10-07 21:16:32.046+02', '184967345');
-INSERT INTO "Lessons" ("id", "url", "description", "duration", "seqNo", "courseId", "pro", "videoId", "gitHubUrl", "downloadUrl", "tags", "createdAt", "updatedAt", "vimeoid") VALUES (165, 'angular2-firebase-security-iframe', 'Angular 2 Security - Adding an iframe to an Angular 2 Template', '4:14', 36, 5, true, NULL, 'https://github.com/angular-university/angular-firebase-app', '', 'BEGINNER', '2016-09-30 10:32:20.585+02', '2016-10-07 21:16:32.053+02', '184967547');
 
 
+
+
+
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (3, 'angular2-pipes', 'Angular 2 Pipes', '<p class=''course-description''>Learn how to leverage Pipes in Angular 2, both stateless and stateful.</p>', 3, 'https://angular-academy.s3.amazonaws.com/course-logos/pipes.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-06-10 21:54:55.142+02', NULL);
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (2, 'angular2-components-and-directives', 'Angular 2 Components and Directives', '<p class=''course-description''>Learn Components and maybe the most useful feature of Angular 2: Directives.</p>', 2, 'https://angular-academy.s3.amazonaws.com/course-logos/components-and-directives.svg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-06-10 21:54:55.16+02', NULL);
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (5, 'build-an-application-with-angular2', 'Build a Web App with Angular 2 and Firebase', '<p class=''course-description''>Put all the concepts together to build a fully running Angular 2 application using Firebase as the database.</p>', 4, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular_app-firebase-small.jpg', false, false, false, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.671+02', 'https://angular-academy.s3.amazonaws.com/thumbnails/firebase-logo.jpg');
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (10, 'angular2-rxjs-observable-data-services', 'RxJs Observable Data Services', '<p class=''course-description''>Use RxJs to build service layers using the Observable Data Service Pattern.</p>', 8, 'https://angular-academy.s3.amazonaws.com/thumbnails/observable-data-services.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.697+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (7, 'angular2-routing', 'Angular 2 Router', '<p class=''course-description''>Build Single Page Applications with Angular 2 and its powerful Router.</p>', 3, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-routing-small.png', false, false, false, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.698+02', '/src/images/router-icon.png');
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (8, 'module-loaders-and-systemjs', 'Module Loaders and Webpack 2', '<p class=''course-description''>Learn how Module Loaders Work - Learn Webpack 2 and its Plugin Ecosystem.</p>', 7, 'https://angular-academy.s3.amazonaws.com/thumbnails/webpack-small.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.699+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (11, 'angular2-ngrx', 'NgRx Angular 2 Reactive Extensions', '<p class=''course-description''>Learn some of the most useful libraries in the Angular 2 Ecosystem.</p>', 9, 'https://angular-academy.s3.amazonaws.com/thumbnails/ngrx.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.715+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (12, 'angular2-universal', 'Angular 2 Universal', '<p class=''course-description''>Learn maybe the biggest game changing technology in the Angular 2 Ecosystem.</p>', 10, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular_universal.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.736+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (4, 'angular2-forms', 'Angular 2 Forms', '<p class=''course-description''>Learn how to build validatable and user-friendly data Forms effectively.</p>', 3, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular-forms-small.png', false, false, false, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.611+02', 'https://angular-academy.s3.amazonaws.com/course-logos/lesson-icons/forms.jpg');
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (9, 'angular2-http', 'Angular 2 HTTP and Services', '<p class=''course-description''>Build Services using Observables, learn to use the HTTP module effectively.</p>', 1, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular-http.png', false, false, false, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.632+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (13, 'angular2-progressive-web-applications', 'Angular 2 Progressive Web Apps', '<p class=''course-description''>Learn the Future of Mobile development: Progressive Web Applications.</p>', 11, 'https://angular-academy.s3.amazonaws.com/thumbnails/pwa.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.75+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (6, 'angular2-advanced-components', 'Angular 2 Advanced Components', '<p class=''course-description''>A deep dive on Components, focusing on commonly needed advanced use cases.</p>', 5, 'https://angular-academy.s3.amazonaws.com/thumbnails/advanced-components.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.63+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (1, 'getting-started-with-angular2', 'Angular 2 Tutorial For Beginners', '<p class=''course-description''>Establish a solid layer of fundamentals, learn what''s under the hood of Angular 2</p>', 0, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-for-beginners-small.png', false, false, false, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.606+02', 'https://angular-academy.s3.amazonaws.com/main-logo/main-page-logo-small-hat.png');
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (14, 'angular2-architecture', 'Angular 2 Architecture', '<p class=''course-description''>Learn how to build next-generation (Post-REST ?) user interfaces in Angular 2.</p>', 12, 'https://angular-academy.s3.amazonaws.com/thumbnails/architecture.jpg', true, false, true, '2016-08-16 15:55:24.236181+02', '2016-10-07 21:16:20.75+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (15, 'angular2-security', 'Angular 2 Security', '<p class=''course-description''>Learn how to build secure Angular 2 Applications Using JSON Web Tokens.</p>', 13, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-security.jpg', true, false, true, '2016-08-16 15:59:06.727615+02', '2016-10-07 21:16:20.751+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png');
+
+
+
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (17, 'angular2-component-events', 'Angular 2 Event Handling', '4:44', 3, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:29.967+02', '2016-10-07 21:16:21.458+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (74, 'angular2-template-driven-forms-ngmodel', 'Angular 2 Template Driven Forms   - NgModel is Not Only For Two-Way Data Binding', '4:59', 0, 4, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:17:36.888+02', '2016-10-07 21:16:24.725+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (182, 'angular2-firebase-logout', 'Setup the Logout Functionality', '1:42', 51, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.385+02', '2016-10-07 21:16:33.618+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (92, 'angular2-router-initial-setup', 'Angular 2 Router Setup - Avoid A Pitfall Right From The Start, Setup Router Debugging', '5:33', 1, 7, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:06.18+02', '2016-10-07 21:16:34.147+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (19, 'angular2-components-styling-component-isolation', 'Styling Angular 2 Components - Learn About Component Style Isolation', '3:27', 5, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:30.014+02', '2016-10-07 21:16:21.463+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (101, 'angular2-router-avoid-memory-leaks', 'Exiting an Angular 2 Route - How To Prevent Memory Leaks', '4:48', 9, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.305+02', '2016-10-07 21:16:35.13+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (105, 'angular2-router-auxiliary-route-parameters', 'Angular 2 Auxiliary Routes - How To Pass Router Parameters', '2:55', 13, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.858+02', '2016-10-07 21:16:35.504+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (168, 'angular2-firebase-choose-ide', 'Choosing an IDE', '1:50', -1, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:29.569+02', '2016-10-06 17:06:57.988+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (108, 'angular2-router-exercise-build-a-dashboard', 'Exercise - Implement a Widget Dashboard With Multiple Auxiliary Routes', '2:50', 18, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:08.387+02', '2016-10-07 21:16:36.018+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (20, 'angular2-components-component-interaction', 'Angular 2 Component Interaction - Extended Components Example', '9:22', 6, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:30.015+02', '2016-10-07 21:16:21.463+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (116, 'angular2-firebase-cli-hello-world', 'Angular 2 Final Application Scaffolding using the Angular CLI', '2:58', 0, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:16:17.567+02', '2016-10-07 21:16:28.407+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (119, 'angular2-firebase-references-and-snapshots', 'Firebase Fundamentals  - References,  Snapshots and Keys', '3:24', 3, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:16:17.569+02', '2016-10-07 21:16:28.813+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (112, 'angular2-lazy-loading-shared-modules', 'Angular 2 Router Lazy Loading and Shared Modules - How to Lazy-Load a Module', '8:43', 16, 7, false, 'https://github.com/angular-university/courses', 'ADVANCED', '2016-09-02 16:31:04.247+02', '2016-10-07 21:16:35.722+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (12, 'angular2-setting-up-a-project-using-typescript-systemjs', 'Angular 2 Development Environment - Start Development Using a Beginner Friendly Playground', '10:56', 23, 1, false, 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-07-25 20:55:31.536+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (13, 'introduction-to-angular2-running-the-lessons', 'Running the the Lessons Code', '3:00', -2, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:20.889+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (172, 'angular2-firebase-create-form-component', 'Creating the Lesson Form Component - Used both for Edit and for Creation', '6:37', 41, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.333+02', '2016-10-07 21:16:32.567+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (177, 'angular2-firebase-edit-lesson-show-data-in-edit-form', 'Edit Lesson - Passing the Retrieved Data to the Lesson Form', '3:25', 46, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.856+02', '2016-10-07 21:16:33.09+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (16, 'angular2-hello-world-write-first-application', 'Angular 2 Tutorial For Beginners - Build Your First App - Hello World Step By Step', '2:49', 0, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:29.945+02', '2016-10-07 21:16:20.898+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (15, 'angular2-build-your-first-component', 'Building Your First Angular 2 Component - Component Composition', '2:07', 1, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:29.967+02', '2016-10-07 21:16:20.899+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (18, 'angular2-component-templates-internal-vs-external', 'Angular 2 Component Templates - Inline Vs External', '2:55', 4, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:29.988+02', '2016-10-07 21:16:21.464+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (11, 'angular2-debugging-with-augury-or-console', 'How To Debug An Angular 2 Application - Debugging via Augury or the Console', '2:59', 22, 1, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.112+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (187, 'angular2-firebase-rounding-up', 'Rounding Up the Course', '01:01', 56, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.911+02', '2016-10-06 17:27:09.056+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (50, 'angular2-introduction-to-typescript-the-arrow-operator', 'Introduction To Typescript - The Arrow (=>) Operator', '4:52', 34, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:47:27.989+02', '2016-10-07 21:16:24.189+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (167, 'angular2-firebase-starter-kit', 'Installing the Starter Kit', '2:14', 1, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:29.571+02', '2016-10-07 21:16:28.427+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (6, 'angular2-core-directives-ngfor', 'Angular 2 Core Directives  - ngFor', '3:46', 11, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.008+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (76, 'angular2-ngmodel-bidirectional-binding', 'NgModel - Why Would You Want To Turn Off Two-Way Data Binding ?', '3:44', 1, 4, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:14.349+02', '2016-10-07 21:16:24.724+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (24, 'angular2-write-first-injectable-service', 'Angular 2 Services Tutorial - Writing Your First Service - Learn @Injectable', '3:46', 25, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-01 22:25:57.621+02', '2016-10-07 21:16:23.632+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (46, 'angular2-introduction-to-directives-write-a-custom-directive', 'Angular 2 Directives Tutorial - Write Your First Custom Directive', '4:31', 9, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:05:54.065+02', '2016-10-07 21:16:22.009+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (48, 'angular2-directives-exercise-improve-collapsible-directive', 'Introduction to Angular 2 Directives - Exercise - Improve the Collapsible Directive', '1:30', 15, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:05:55.14+02', '2016-10-07 21:16:22.553+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (3, 'angular2-template-syntax-interpolation', 'Angular 2 Template Syntax - Interpolation', '2:41', 18, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.103+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (42, 'angular2-http-error-handling', 'Angular 2 Services - HTTP Error Handling', '2:21', 28, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-03 10:25:37.253+02', '2016-10-07 21:16:23.653+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (41, 'angular2-http-how-to-do-an-http-post-call', 'Angular 2 Services - Using the HTTP service to do an HTTP POST ', '5:32', 27, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-03 10:25:36.712+02', '2016-10-07 21:16:23.641+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (75, 'angular2-form-state-classes', 'Angular 2 Form CSS State Classes with NgModel - How to Mark a Field As Mandatory ?', '4:02', 2, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:14.362+02', '2016-10-07 21:16:24.724+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (81, 'angular2-ngmodelgroup', 'Control Groups with ngModelGroup - Validation And Binding', '3:03', 6, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.077+02', '2016-10-07 21:16:25.256+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (4, 'angular2-template-syntax-events', 'Template Syntax - Introduction To Zones - How does the Angular 2 event handling mechanism work?', '5:14', 19, 1, true, 'https://github.com/angular-university/courses', 'ADVANCED', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.103+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (23, 'anhular-http-do-a-get-call-to-express-server', 'Angular 2 Services - Introduction to the HTTP Service - Do a GET HTTP Server Call', '3:43', 26, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-01 22:25:57.642+02', '2016-10-07 21:16:23.642+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (43, 'angular2-introduction-to-services-exercise', 'Angular 2 Services  - Exercise - Do an HTTP DELETE', '0:54', 31, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-03 10:25:37.254+02', '2016-10-07 21:16:24.183+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (10, 'angular2-guided-tour-pipes', 'Angular 2 Pipes - Learn Why Standard Pipes Might Not Work, Create a Custom Pipe', '5:01', 21, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.104+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (87, 'angular2-formcontrol-directive', 'Angular 2 Model Driven Forms - The formControl Directive', '1:57', 12, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.629+02', '2016-10-07 21:16:25.789+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (88, 'angular2-custom-validator-form-driven', 'Angular 2 Template Driven Form Custom Validator', '5:44', 14, 4, true, 'https://github.com/angular-university/courses', 'ADVANCED', '2016-07-14 10:56:15.634+02', '2016-10-07 21:16:26.228+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (173, 'angular2-firebase-save-new-lesson', 'Lessons Service - Add Save New Lesson Functionality', '12:58', 42, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.335+02', '2016-10-07 21:16:32.572+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (178, 'angular2-firebase-edit-lesson-implement-lessons-service', 'Edit Lesson - Implement the Save Lesson Service', '3:02', 47, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.863+02', '2016-10-07 21:16:33.095+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (183, 'angular2-firebase-redirect-to-login-router-guard', 'Redirect User To Login Page Using a Router Guard', '5:33', 52, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.391+02', '2016-10-07 21:16:33.621+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (5, 'angular2-guided-tour-components', 'Guided Tour to Angular 2 Components', '5:57', 20, 1, true, 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-07-25 20:55:31.53+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (100, 'angular2-router-child-routes', 'Child Routes - How To Setup a Master Detail Route - What Are Componentless Routes ?', '4:09', 5, 7, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.271+02', '2016-10-07 21:16:34.668+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (103, 'angular2-router-auxiliary-routes', 'Configure Auxiliary Routes in the Angular 2 Router - What is the Difference Towards a Primary Route?', '5:16', 12, 7, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.838+02', '2016-10-07 21:16:35.194+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (77, 'angular2-standard-validators', 'Angular 2 Standard Form Validators How do Template Driven Forms Work Under The Hood ?', '3:32', 3, 4, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:14.379+02', '2016-10-07 21:16:24.729+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (80, 'angular2-model-driven-reactive-forms', 'Angular 2 Reactive or Model Driven Forms - formGroup and formControlName', '4:07', 7, 4, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.068+02', '2016-10-07 21:16:25.257+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (169, 'angular2-firebase-router-navigate-detail-to-lesson', 'Navigating From Lesson To Lesson - Part 1', '5:17', 37, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:33.863+02', '2016-10-07 21:16:32.052+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (85, 'angular2-model-driven-forms-errors', 'Angular 2 Model Driven Forms - Mark Fields in Error', '2:08', 11, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.62+02', '2016-10-07 21:16:25.79+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (58, 'angular2-what-is-an-observable', 'What is an Observable ? Introduction to Streams and RxJs Observables', '5:41', 0, 9, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-16 17:25:37.294+02', '2016-10-07 21:16:26.747+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (7, 'angular2-core-directives-ngclass-ngstyle', 'Angular 2 Core Directives - ngClass and ngStyle', '3:15', 12, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.545+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (69, 'angular2-how-to-setup-an-http-request-sequence-using-the-rxjs-switchmap-operator', 'How to setup an HTTP request sequence using the RxJs switchMap Operator', '4:33', 10, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.787+02', '2016-10-07 21:16:27.783+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (60, 'angular2-observables-error-handling-and-completion-network-calls-as-observables', 'Observables Error Handling and Completion - How do Observables handle Errors?', '5:28', 1, 9, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-17 11:22:44.281+02', '2016-10-07 21:16:26.846+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (70, 'angular2-retry-http-requests-in-error-using-the-retry-and-retrywhen-rxjs-operators', 'Retry HTTP requests in Error using the retry and retryWhen RxJs Operators', '3:42', 11, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.875+02', '2016-10-07 21:16:27.884+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (71, 'angular2-how-to-cancel-an-http-request-using-an-rxjs-subscription', 'How to Cancel an HTTP Request using an RxJs Subscription', '2:56', 12, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.878+02', '2016-10-07 21:16:27.893+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (49, 'angular2-directives-exercise-solution-improve-collapsible-directive', 'Introduction to Angular 2 Directives - Exercise Solution', '2:40', 16, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:05:55.146+02', '2016-10-07 21:16:22.553+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (174, 'angular2-firebase-custom-url-validator', 'Add New Lesson - Add a Custom Url Field Validator', '3:05', 43, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.407+02', '2016-10-07 21:16:32.575+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (179, 'angular2-firebase-authentication-login-page', 'Setup Firebase Authentication, Create a Login Page', '8:52', 48, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.929+02', '2016-10-07 21:16:33.094+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (184, 'angular2-firebase-rest', 'REST and Firebase - Using the Firebase REST API', '8:25', 53, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.452+02', '2016-10-07 21:16:33.621+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (68, 'angular2-how-to-do-two-http-requests-in-parallel-using-the-rxjs-combinelatest-operator', 'How to do two HTTP Requests in Parallel using the RxJs combineLatest Operator', '3:58', 9, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.362+02', '2016-10-07 21:16:27.393+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (99, 'angular2-router-optional-route-parameters', 'Optional Route Query Parameters - The queryParams Directive and the Query Parameters Observable', '2:38', 8, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.27+02', '2016-10-07 21:16:34.99+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (72, 'angular2-exercise-improve-a-search-service-and-build-a-typeahead', 'Exercise - Improve a Search Service and Build a Typeahead', '3:15', 13, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.878+02', '2016-10-07 21:16:27.908+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (106, 'angular2-router-redirects-path-matching', 'Angular 2 Router Redirects and Path Matching - Avoid Common Routing Pitfall', '2:59', 14, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.866+02', '2016-10-07 21:16:35.643+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (59, 'angular2-', 'When To Use Template Driven Vs Model Driven Forms ? It Might Surprise You', '6:10', 15, 9, false, 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'BEGINNER', '2016-06-17 11:02:05.708+02', '2016-07-14 10:51:02.929+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (45, 'angular2-introduction-to-services-exercise-solution', 'Angular 2 Services - Exercise Solution - Do an HTTP DELETE', '3:55', 32, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-03 10:25:37.259+02', '2016-10-07 21:16:24.188+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (51, 'angular2-introduction-to-typescript-high-level-overview', 'Introduction to Typescript - High-level Overview', '7:00', 32, 1, true, 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'BEGINNER', '2016-06-10 14:47:27.988+02', '2016-07-25 20:55:32.629+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (93, 'angular2-router-styling-active-routes', 'Styling Active Routes With The routerLinkActive And routerLinkActiveOptions Directives', '2:00', 4, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:06.205+02', '2016-10-07 21:16:34.611+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (90, 'angular2-signup-form', 'Angular 2 Forms Section Exercise - Build a Signup Form', '1:34', 17, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:16.158+02', '2016-10-07 21:16:26.334+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (175, 'angular2-firebase-edit-lesson-initial-setup', 'Edit Lesson - Initial Screen Setup', '2:35', 44, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.567+02', '2016-10-07 21:16:32.937+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (91, 'angular2-signup-form-example', 'Exercise - Build an Angular 2 Signup Form - Lets do a little Functional Programming', '6:10', 18, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:16.172+02', '2016-10-07 21:16:26.335+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (62, 'angular2-observable-map-operator-how-to-create-an-observable-from-another', 'The RxJs Map Operator - How to create an Observable from another Observable', '3:04', 5, 9, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-17 12:32:57.146+02', '2016-10-07 21:16:27.267+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (83, 'angular2-formbuilder', 'Building Reactive or Model Driven Forms using the FormBuilder', '2:13', 9, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.076+02', '2016-10-07 21:16:25.718+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (22, 'angular2-components-exercise-solution', 'Angular 2 Components Tutorial For Beginners - Components Exercise Solution Inside', '2:08', 8, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:30.033+02', '2016-10-07 21:16:22.002+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (180, 'angular2-firebase-authentication-observable-data-service', 'Building an Authentication Observable Data Service', '7:06', 49, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.094+02', '2016-10-07 21:16:33.45+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (118, 'angular2-firebase-typescript', 'Use Firebase SDK with Typescript - Preparing to Run a Firebase Database Population Script', '3:18', 4, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:16:17.593+02', '2016-10-07 21:16:28.922+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (185, 'angular2-firebase-security-rules', 'Protect Write Access Using Security Rules', '1:34', 54, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.63+02', '2016-10-07 21:16:33.964+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (157, 'angular2-firebase-join-3', 'Joins in Firebase - Performance Considerations', '7:39', 28, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:19.844+02', '2016-10-07 21:16:31.393+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (154, 'angular2-setup-dev-environment-1', 'Setting Up an Angular 2 Development Environment', '8:47', -3, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-09-30 10:32:13.193+02', '2016-10-07 21:16:20.888+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (144, 'angular2-firebase-home-screen', 'Starting the Application From the Beginning - Build the Home Screen', '3:33', 16, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.926+02', '2016-10-07 21:16:29.98+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (47, 'angular2-directives-inputs-outputs-event-emitters', 'Angular 2 Directives - Inputs, Output Event Emitters and How To Export Template References', '4:01', 10, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:05:54.592+02', '2016-10-07 21:16:22.009+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (137, 'angular2-angular-cli', 'Getting Started with Angular 2 - Off the Ground Running with the Angular CLI', '8:47', -1, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-09-25 20:47:01.476+02', '2016-10-07 21:16:20.898+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (162, 'angular2-firebase-pagination-3', 'Firebase Pagination Concluded - Loading the Previous Page', '2:11', 33, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:20.364+02', '2016-10-07 21:16:31.905+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (96, 'angular2-router-home-route-fallback-route', 'Configuring a Home Route and Fallback Route - Learn An Essential Routing Concept', '2:55', 3, 7, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:06.199+02', '2016-10-07 21:16:34.477+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (86, 'angular2-custom-validator-model-driven', 'Angular 2 Model Driven Form Custom Validator', '3:05', 13, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.629+02', '2016-10-07 21:16:25.789+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (170, 'angular2-firebase-detail-navigation-route-params-observable', 'Navigating From Lesson To Lesson - The Route Params Observable', '4:48', 39, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.031+02', '2016-10-07 21:16:32.423+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (102, 'angular2-router-can-activate-guard', 'CanActivate Route Guard - An Example of An Asynchronous Route Guard', '3:31', 11, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.838+02', '2016-10-07 21:16:35.195+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (67, 'angular2-how-to-do-multiple-http-requests-using-the-rxjs-concat-operator', 'How to do multiple HTTP requests using the RxJs Concat Operator', '4:19', 8, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.319+02', '2016-10-07 21:16:27.391+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (133, 'angular2-firebase-arrays', 'Firebase Arrays - Does Firebase Support Arrays ? ', '5:34', 9, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:22:37.174+02', '2016-10-07 21:16:29.445+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (150, 'angular2-firebase-router-config', 'Setting Up the Router Configuration of our Application', '4:47', 21, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:15.458+02', '2016-10-07 21:16:30.498+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (107, 'angular2-router-hash-location-strategy', 'Angular 2 Router Hash Location Strategy vs HTML5 Location Strategy', '3:04', 15, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:08.384+02', '2016-10-07 21:16:35.719+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (97, 'angular2-router-manual-navigation', 'Programmatic Router Navigation via the Router API - Relative And Absolute Router Navigation', '3:59', 6, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.269+02', '2016-10-07 21:16:34.671+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (53, 'angular2-introduction-to-typescript-array-spread-operator-object-destructuring', 'Introduction To Typescript - The Array Spread Operator, Object Destructuring and more', '4:54', 35, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:47:27.99+02', '2016-10-07 21:16:24.196+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (54, 'angular2-introduction-to-typescript-imports-and-exports', 'Introduction To Typescript - Imports and Exports - One of the main missing features of ES5 ?', '4:32', 36, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:47:28.017+02', '2016-10-07 21:16:24.691+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (113, 'angular2-shared-modules-service-configuration', 'Shared Modules And Lazy Loading - How to Setup Shared Services', '6:39', 17, 7, true, 'https://github.com/angular-university/courses', 'ADVANCED', '2016-09-02 16:31:04.607+02', '2016-10-07 21:16:35.721+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (8, 'angular2-core-directives-ngIf', 'Angular 2 Core Directives - ngIf', '3:56', 13, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.547+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (84, 'angular2-reactive-forms-rxjs', 'Reactive Forms with RxJs - Learn Why They Are more Powerful than Template Driven', '6:23', 10, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.417+02', '2016-10-07 21:16:25.784+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (61, 'angular2-observable-composition-combine-latests', 'Observable Composition - combine multiple Observables Using combineLatest', '5:59', 6, 9, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-17 12:32:57.158+02', '2016-10-07 21:16:27.363+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (110, 'angular2-ngmodule', 'Angular 2 Modularity - @NgModule and Feature Modules - Learn why a Component Might Not Be Visible', '4:48', 30, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-09-02 15:52:42.033+02', '2016-10-07 21:16:24.162+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (171, 'angular2-firebase-create-new-lesson', 'The Create New Lesson Form', '5:21', 40, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.035+02', '2016-10-07 21:16:32.552+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (186, 'angular2-firebase-node-queue', 'Build a Custom Node Backend Using Firebase Queue', '11:46', 55, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.635+02', '2016-10-07 21:16:34.09+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (176, 'angular2-firebase-edit-lesson-router-resolve', 'Edit Lesson - Retrieve Lesson using the Router Resolve Functionality', '7:54', 45, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.569+02', '2016-10-07 21:16:33.065+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (79, 'angular2-form-field-errors', 'How to display Form Field Validation Error Messages with NgModel', '3:28', 5, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:14.895+02', '2016-10-07 21:16:25.252+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (145, 'angular2-firebase-service-layer-example', 'Building our First Firebase Service - The Lessons Service', '7:24', 17, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.93+02', '2016-10-07 21:16:29.984+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (2, 'angular2-template-syntax-properties', 'Angular 2 Template Syntax - Properties', '5:12', 17, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.094+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (146, 'angular2-firebase-smart-vs-presentation-components', 'Angular 2 Smart Components vs Presentation Components: What''s the Difference and When to Use Each ?', '4:36', 18, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.969+02', '2016-10-07 21:16:30.364+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (52, 'angular2-introduction-to-typescript-classes-and-interfaces', 'Introduction To Typescript - Classes and Interfaces', '3:47', 33, 1, true, 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'BEGINNER', '2016-06-10 14:47:27.989+02', '2016-09-25 21:35:33.363+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (66, 'angular2-how-to--aAvoid-duplicate-http-requests-rxjs-cache-operator', 'Avoid the Biggest Pitfall of Angular 2 HTTP - Learn the RxJs Cache Operator', '5:10', 7, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.312+02', '2016-10-07 21:16:27.378+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (73, 'angular2-exercise-solution-learn-how-to-build-a-typeahead-that-cancels-obsolete-search-requests', 'Exercise Solution - Learn How to build a Typeahead that cancels obsolete search requests', '5:07', 14, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.903+02', '2016-10-07 21:16:27.911+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (114, 'what-is-a-single-page-application', 'What is a Single Page Application ? Learn Why They Might Become More Frequent In The Future', '4:00', 0, 7, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-09-20 13:16:05.526+02', '2016-10-07 21:16:34.144+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (89, 'angular2-template-driven-vs-model-driven-forms', 'When To Use Angular 2 Template Driven Vs Model Driven Forms, and Why ? ', '5:04', 16, 4, false, 'https://github.com/angular-university/courses', 'ADVANCED', '2016-07-14 10:56:15.937+02', '2016-10-07 21:16:26.331+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (98, 'angular2-router-navigation-parameters', 'Master Detail Navigation And Route Parameters  - The Route Parameters Observable', '6:03', 7, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.27+02', '2016-10-07 21:16:34.674+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (104, 'angular2-router-can-deactivate-guard', 'CanDeactivate Route Guard - How To Confirm If The User Wants To Exit A Route', '4:42', 10, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.839+02', '2016-10-07 21:16:35.191+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (44, 'angular2-rest-api-http-server-development', 'How to Setup a Development REST API HTTP Server with Express and ts-node', '2:46', 29, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-03 10:25:37.254+02', '2016-10-07 21:16:23.653+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (109, 'angular2-router-exercise-solution-build-a-dashboard', 'Exercise Solution - Implement a Widget Dashboard With Multiple Auxiliary Routes', '4:41', 19, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:08.387+02', '2016-10-07 21:16:36.157+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (147, 'angular2-firebase-typescript-pitfall', 'Pitfall of Using Typescript Classes when Querying Data From a Backend', '6:21', 19, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.972+02', '2016-10-07 21:16:30.477+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (149, 'angular2-firebase-navigation-menu', 'Building a Navigation Menu Using The Angular 2 Router', '5:53', 22, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:15.456+02', '2016-10-07 21:16:30.501+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (181, 'angular2-firebase-user-registration-page', 'Build a User Registration Page', '3:50', 50, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.106+02', '2016-10-07 21:16:33.579+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (151, 'angular2-firebase-master-detail', 'Setting Up the Master Screen of the Master Detail Pattern', '6:46', 23, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:15.486+02', '2016-10-07 21:16:30.879+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (94, 'angular2-router-navigation', 'Navigate Between Angular 2 Routes - Several Ways Of Using the routerLink Directive', '3:18', 2, 7, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:06.198+02', '2016-10-07 21:16:34.15+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (134, 'angular2-firebase-data-modelling', 'Firebase Data Modeling 101 - How To Model Data In Firebase ?', '4:11', 7, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:22:37.173+02', '2016-10-07 21:16:28.946+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (140, 'angular2-firebase-list-push', 'How to Write Data to the Database using AngularFire 2 ? Adding Elements to a List', '3:52', 12, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 16:44:44.433+02', '2016-10-07 21:16:29.468+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (142, 'angular2-firebase-list-remove', 'How To Remove an Element from a List using AngularFire 2 ?', '3:08', 13, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.406+02', '2016-10-07 21:16:29.847+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (95, 'angular2-router-introduction', 'Angular 2 Router Demo - Why Build Single Applications ?', '4:00', 0, 7, false, 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'BEGINNER', '2016-07-22 13:11:06.17+02', '2016-07-22 19:39:03.616+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (148, 'angular2-firebase-client-side-search', 'How To Implement Client-Side Search in Angular 2 ?', '4:00', 20, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:15.348+02', '2016-10-07 21:16:30.485+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (141, 'angular2-firebase-list-update', 'How To Update an Element in a Firebase List using AngularFire 2 ?', '1:11', 14, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.406+02', '2016-10-07 21:16:29.961+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (166, 'angular2-firebase-install-node-and-demo-app', 'Installing Node and the Angular 2 and Firebase Demo Application', '4:45', -2, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:50:35.241+02', '2016-10-07 21:16:28.403+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (115, 'angular2-firebase-sdk-hello-world', 'Firebase Real-Time Database Hello World - First Query - Debug Websockets !', '8:15', 2, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:16:17.568+02', '2016-10-07 21:16:28.43+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (123, 'angular2-populate-firebase-db-ts-node', 'Populate a Firebase Database with a Node Program - Use Typescript with Node using ts-node', '4:24', 5, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:16:18.338+02', '2016-10-07 21:16:28.927+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (136, 'angular2-firebase-db-script-explained', 'Populate a Firebase Database -Initialization Script Explained Step By Step', '3:53', 6, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:22:37.165+02', '2016-10-07 21:16:28.943+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (152, 'angular2-firebase-master-detail-navigation', 'Configuring the Angular 2 Router for Master To Detail Navigation', '3:23', 24, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:15.499+02', '2016-10-07 21:16:30.993+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (135, 'angular2-firebase-database-ekeys', 'Firebase Key Generation - How to use the Firebase Push Keys, Should We Use Them and Why ?', '3:09', 8, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:22:37.174+02', '2016-10-07 21:16:29.327+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (82, 'angular2-model-driven-forms-validation', 'Angular 2 Form  Validation in Model Driven Forms - Configuring a Form Validator', '2:29', 8, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.077+02', '2016-10-07 21:16:25.256+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (111, 'angular2-set-form-value-reset-form', 'Angular 2 Model Driven Forms - How to Set a Form Value and Reset a Form', '4:48', 15, 4, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-09-02 16:24:08.915+02', '2016-10-07 21:16:26.32+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (14, 'angular2-passing-data-to-component-using-input', 'Component @Input - How To Pass Input Data To an Angular 2 Component', '2:33', 2, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:29.966+02', '2016-10-07 21:16:21.457+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (63, 'how-does-angular2-use-observables-http-response-object', 'How does Angular 2 HTTP use Observables ? The HTTP Response object', '4:32', 2, 9, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-17 12:46:12.757+02', '2016-10-07 21:16:26.858+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (64, 'angular2-how-to-use-observables-and-http-to-build-a-servicelayer', 'How to use Observables and HTTP to build a Service Layer', '4:32', 3, 9, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-17 12:46:13.26+02', '2016-10-07 21:16:26.87+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (21, 'angular2-components-exercise', 'Angular 2 Components Tutorial For Beginners - Components Exercise !', '1:26', 7, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:30.024+02', '2016-10-07 21:16:22.001+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (65, 'angular2-how-to-use-the-async-pipe-to-pass-observables-into-a-template', 'Introduction to Functional Reactive Programming - Using the Async Pipe - Pitfalls to Avoid', '4:36', 4, 9, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-17 12:46:13.311+02', '2016-10-07 21:16:26.872+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (9, 'angular2-guided-tour-directives', 'Directives Guided Tour - Learn Why Directives Might be a Better Choice Than Components', '7:58', 14, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.545+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (117, 'angular2-firebase-demo-course-intro', 'Build an Application with Angular 2 and Firebase - Application Demo and Course Objectives', '6:51', -3, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:16:17.566+02', '2016-10-07 21:16:28.297+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (153, 'angular2-firebase-master-detail-detail-screen', 'Setting Up the Detail Screen of a Master Detail Setup', '5:03', 25, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:15.866+02', '2016-10-07 21:16:31.001+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (143, 'angular2-firebase-object-set-update', 'How to Modify an Object in Firebase using AngularFire 2, what is the Difference Between Set and Update?', '3:31', 15, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.83+02', '2016-10-07 21:16:29.97+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (78, 'angular2-form-exports', 'Understanding Angular 2 Form Exports -  Disable a Form Button Until the Form is Valid', '3:15', 4, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:14.379+02', '2016-10-07 21:16:25.202+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (138, 'angular2-firebase-list-observable', 'AngularFire 2 Hello World - How To Write your First Query using AngularFire 2 List Observables ?', '7:43', 10, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 16:44:44.347+02', '2016-10-07 21:16:29.457+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (139, 'angular2-firebase-object-observable', 'AngularFire 2 Object Observables - How to Read Objects from a Firebase Database?', '2:19', 11, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 16:44:44.429+02', '2016-10-07 21:16:29.466+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (156, 'angular2-firebase-join-1', 'How To Make a Join in Firebase Using AngularFire 2 ? Reading a Course based on its url', '9:30', 26, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:19.502+02', '2016-10-07 21:16:31.014+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (155, 'angular2-firebase-join-2', 'Joins in Firebase Continued - Querying the List Of Lesson Keys Of Lessons that Belong to a Course', '2:51', 27, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:19.504+02', '2016-10-07 21:16:31.016+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (158, 'angular2-rxjs-clean-code', 'How to Write Maintainable RxJs Code ? Some Tips and Tricks on How to Write Clean Reactive Code', '4:53', 29, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:19.898+02', '2016-10-07 21:16:31.512+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (159, 'angular2-firebase-pagination-display-course-lessons', 'Displaying the Lessons Per Course in the Course Detail Page', '3:50', 30, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:19.934+02', '2016-10-07 21:16:31.514+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (160, 'angular2-firebase-pagination', 'How To Do Pagination in Firebase ? Loading the First Page of a Paginated Table', '7:52', 31, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:20.063+02', '2016-10-07 21:16:31.53+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (161, 'angular2-firebase-pagination-2', 'Firebase Pagination Continued - Loading the Next Page', '4:12', 32, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:20.08+02', '2016-10-07 21:16:31.533+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (163, 'angular2-firebase-navigate-from-course-to-lesson', 'Navigate From Course Detail to Lesson', '5:17', 34, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:20.435+02', '2016-10-07 21:16:32.036+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (164, 'angular2-firebase-lesson-detail', 'Building a Lesson Detail Component', '4:17', 35, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:20.476+02', '2016-10-07 21:16:32.046+02');
+INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (165, 'angular2-firebase-security-iframe', 'Angular 2 Security - Adding an iframe to an Angular 2 Template', '4:14', 36, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:20.585+02', '2016-10-07 21:16:32.053+02');
diff --git a/server/queries/findCourseDetail.ts b/server/queries/findCourseDetail.ts
index ef01ece..e72062f 100644
--- a/server/queries/findCourseDetail.ts
+++ b/server/queries/findCourseDetail.ts
@@ -3,7 +3,8 @@
 import {CourseModel, LessonModel} from "../model";
 import Bluebird = require("bluebird");
 import * as _ from 'lodash';
-import {Course, mapCourseAndLessons} from "../../shared/model/course";
+import {mapCourseAndLessons} from "../../shared/model/course-utils";
+
 
 
 
diff --git a/shared/model/course-utils.ts b/shared/model/course-utils.ts
new file mode 100644
index 0000000..ed470b8
--- /dev/null
+++ b/shared/model/course-utils.ts
@@ -0,0 +1,21 @@
+
+import {mapLesson} from "./lesson-utils";
+import {Course} from "./course";
+
+export function mapCourseAndLessons({description, url, longDescription, iconUrl, courseListIcon, seqNo, comingSoon, isNew, isOngoing, Lessons}:any): Course {
+    return {
+        description,
+        url,
+        longDescription,
+        iconUrl,
+        courseListIcon,
+        seqNo,
+        comingSoon,
+        isNew,
+        isOngoing,
+        lessons: Lessons.map((lesson:any) => mapLesson(lesson) )
+    };
+}
+
+
+
diff --git a/shared/model/course.ts b/shared/model/course.ts
index b9255b3..8a0b692 100644
--- a/shared/model/course.ts
+++ b/shared/model/course.ts
@@ -1,9 +1,7 @@
 
+import {Lesson} from "./lesson";
 
-import {mapLesson, Lesson} from "./lesson";
-
-
-export type Course = {
+export interface Course {
 
     readonly description: string,
     readonly url:  string,
@@ -15,20 +13,4 @@ export type Course = {
     readonly isNew: boolean,
     readonly isOngoing: boolean,
     readonly lessons: Lesson[];
-
-}
-
-export function mapCourseAndLessons({description, url, longDescription, iconUrl, courseListIcon, seqNo, comingSoon, isNew, isOngoing, Lessons}:any): Course {
-    return {
-        description,
-        url,
-        longDescription,
-        iconUrl,
-        courseListIcon,
-        seqNo,
-        comingSoon,
-        isNew,
-        isOngoing,
-        lessons: Lessons.map((lesson:any) => mapLesson(lesson) )
-    };
 }
\ No newline at end of file
diff --git a/shared/model/lesson-utils.ts b/shared/model/lesson-utils.ts
new file mode 100644
index 0000000..06d6ce2
--- /dev/null
+++ b/shared/model/lesson-utils.ts
@@ -0,0 +1,16 @@
+
+
+export function mapLesson({url, description, duration, seqNo,courseId, pro, tags}:any): Lesson {
+    return {
+        url,
+        description,
+        duration,
+        seqNo,
+        courseId,
+        pro,
+        tags
+    }
+}
+
+
+
diff --git a/shared/model/lesson.ts b/shared/model/lesson.ts
index 757505f..2897faf 100644
--- a/shared/model/lesson.ts
+++ b/shared/model/lesson.ts
@@ -1,6 +1,7 @@
 
 
-export type Lesson = {
+
+export interface Lesson  {
 
     readonly url:string;
     readonly description: string;
@@ -13,18 +14,3 @@ export type Lesson = {
 }
 
 
-
-export function mapLesson({url, description, duration, seqNo,courseId, pro, tags}:any): Lesson {
-    return {
-        url,
-        description,
-        duration,
-        seqNo,
-        courseId,
-        pro,
-        tags
-    }
-}
-
-
-
diff --git a/shared/package.json b/shared/package.json
new file mode 100644
index 0000000..209398c
--- /dev/null
+++ b/shared/package.json
@@ -0,0 +1,11 @@
+{
+  "name": "ctc-shared",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "JhadesDev <jhades.dev@gmail.com> (http://blog.jhades.org/)",
+  "license": "MIT"
+}
