From 03409db4c01fc279e56ed3db55d38e0e6f8b3db2 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 09:01:04 +0000 Subject: [PATCH 01/42] update ex01 for cds-dk --- exercises/01/readme.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/exercises/01/readme.md b/exercises/01/readme.md index 7a0ae1f..0f3e928 100644 --- a/exercises/01/readme.md +++ b/exercises/01/readme.md @@ -6,7 +6,7 @@ Successfully completing this exercise relies on the hardware and software [prere ## Steps -After completing these steps you'll have a working local environment for development of CAP based projects with Node.js. +After completing these steps you'll have a working local environment for development of CAP based projects with Node.js, using the CAP "development kit" package `@sap/cds-dk`. ### 1. Install the CDS command line tool @@ -43,7 +43,7 @@ user-agent = "npm/6.4.1 node/v10.15.3 linux x64" ; "npm config ls -l" to show all defaults. ``` -:point_right: Next, explore the information about the `@sap/cds-dk` (the dk stands for development kit)package, including its dependencies, with: +:point_right: Next, explore the information about the `@sap/cds-dk` package, including its dependencies, with: ```sh user@host:~ @@ -59,15 +59,14 @@ user@host:~ => npm install --global @sap/cds-dk ``` -This should eventually produce output similar to this: +This produces a fair amount of output as it works, but should eventually end with a couple of lines similar to this: ```sh -/Users/d056949/.nvm/versions/node/v10.15.3/bin/cds -> /Users/d056949/.nvm/versions/node/v10.15.3/lib/node_modules/@sap/cds-dk/bin/cds.js -+ @sap/cds-dk@1.1.4 -updated 1 package in 27.076s ++ @sap/cds-dk@1.4.2 +added 471 packages from 381 contributors in 33.398s ``` -Here you can see that the version of the `@sap/cds-dk` package installed is 3.18.4. It may be that the version of `@sap/cds-dk` that is installed when you do this exercise will be different (newer). +Here you can see that the version of the `@sap/cds-dk` package just installed is 1.4.2. It may be that the version of `@sap/cds-dk` that is installed when you do this exercise will be different (newer). ### 2. Install the CDS extension for VS Code @@ -77,7 +76,7 @@ Extensions can be installed directly in VS Code from the extension marketplace, :point_right: Go to the [Cloud section of the SAP Development Tools website](https://tools.hana.ondemand.com/#cloud) and find the "CDS Language Support for Visual Studio Code" section. Follow the instructions there to download and subsequently install the extension. -To install the downloaded extension in VS Code have a look at the screenshot below: +To install the downloaded extension in VS Code have a look at the screenshot below: ![CDS Extension installation in VS Code](vscode-extension-import.png) @@ -85,17 +84,17 @@ When successfully installed, you should see the extension thus (again, the versi ![CDS Language Support extension installed in VS Code](vscode-extension.png) -> **For macOS users only:** To be able to open VS Code from the command line (which you will be doing in a subsequent exercise) you need to add the installation path of VS Code to the environment variable PATH. There's an option to do this via the `Command Palette` in VS Code. +> **For macOS users only:** To be able to open VS Code from the command line (which you will be doing in a subsequent exercise) you need to add the installation path of VS Code to the environment variable PATH. There's an option to do this via the `Command Palette` in VS Code. > Open the `Command Palette` with ⇧⌘P. You can also open it via the menu bar: View -> Command Palette. > ![Command Palette navigation in the menu bar](command-palette.png) -> Search for `code` and press Enter. +> Search for `code` and press Enter. > ![search for code in the command palette](install-code-path.png) -> A success message for the process should then appear at the bottom right of the screen. +> A success message for the process should then appear at the bottom right of the screen. > ![message that the 'code' command was successfully installed](sucessfully-installed.png) From 219ffa68da575788c11786e793749ac954d67ed7 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 10:54:04 +0000 Subject: [PATCH 02/42] adjust ex02 for cds-dk and new init process --- .../02/initialized-project-in-vscode.png | Bin 77154 -> 49545 bytes exercises/02/readme.md | 108 +++++++++++------- 2 files changed, 68 insertions(+), 40 deletions(-) diff --git a/exercises/02/initialized-project-in-vscode.png b/exercises/02/initialized-project-in-vscode.png index e43c69444afe96c9405503278fd9a90be5041b3d..f22e32af3e4a585fb656776423037974cf54af69 100644 GIT binary patch literal 49545 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�psuEdK#1*um^F=l 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 QxD0f<+J;)in)VU@2Q+#KMF0Q* literal 77154 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¬-V-gRyPV!9N*Uc$ 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�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%0AA=gOEh_B0RcJFnSZK7!=*!?SG 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 diff --git a/exercises/02/readme.md b/exercises/02/readme.md index 1200a52..36e2505 100644 --- a/exercises/02/readme.md +++ b/exercises/02/readme.md @@ -18,9 +18,7 @@ After completing these steps you'll be familiar with how you can use the `cds` c For any new CAP based project you start by indirectly creating a directory containing various basic files. This can be achieved with the CDS command line tool `cds` which you installed in [exercise 01](../01/). -The `cds` tool should be available in your executable path, having been installed globally as part of the Node.js `@sap/cds` package. - -:point_right: First, explore the `cds` command line tool by executing it with no parameters; you will see what options are available: +The `cds` tool should be available in your executable path, having been installed globally as part of the Node.js `@sap/cds-dk` package. ```sh user@host:~ @@ -36,12 +34,13 @@ COMMANDS i | init jump-start cds-based projects c | compile process models selectively - m | import add models from external sources + d | deploy e.g. to databases or cloud s | serve run servers locally + w | watch restart server on file changes + m | import add models from external sources r | repl read-eval-event loop e | env get/set cds configuration b | build prepare for deployment - d | deploy e.g. to databases or cloud v | version get detailed version information ? | help get detailed usage information @@ -59,34 +58,25 @@ user@host:~ => cds init --help ``` -Amongst other things, you should see a `--modules` option to specify a list of modules to be created when the project is initialized, and also a `--verbose` option. The options `--mta`, `--db-technology` and `--insecure` are related to deployment to Cloud Foundry and access management in that context. `--skip-sample-models` avoids the creation of sample CDS source files which you will build step by step in this CodeJam yourself. - -:point_right: Use all of these options to initialize a new project directory called `bookshop` thus: +:point_right: Use some of these options to initialize a new project directory called `bookshop` thus: ```sh user@host:~ -=> cds init --modules db,srv --mta --insecure --db-technology hana --verbose --skip-sample-models bookshop +=> cds init bookshop --add hana,mta ``` You should see output that looks similar to this: ``` -Initializing project in folder bookshop. -Copying templates for type db to db ... -Creating mta file /private/tmp/bookshop/mta.yaml ... -Copying templates for type srv to srv ... -Creating mta file /private/tmp/bookshop/mta.yaml ... -Updating npm dependencies in /private/tmp/bookshop/package.json ... -Running npm install... -npm notice created a lockfile as package-lock.json. You should commit this file. -added 120 packages from 178 contributors and audited 220 packages in 6.978s -found 0 vulnerabilities +[cds] - creating new project in current folder +> applying template 'hana'... +> applying template 'mta'... +done. -Done. -Learn about first steps at https://cap.cloud.sap/docs/get-started/in-a-nutshell +Find samples on https://github.com/SAP-samples/cloud-cap-samples +Learn about next steps at https://cap.cloud.sap/docs/get-started ``` - ### 2. Open the project in VS Code Now that the project has been initialized, it's time to explore it. The VS Code IDE is a comfortable environment in which to do so, so at this point you will open up the newly created `bookshop` directory in it. @@ -111,19 +101,22 @@ The skeleton project that has been initialized is visible in VS Code. This is wh Briefly, the directories and contents can be described thus: -| Directory | Contents | +| Directory or File | Description | | -------------- | -------- | -| `.vscode` | VS Code specific files for launch configurations (useful for debugging, which we will cover in [exercise 08](../08/)) | -| `db` | Where the data models (in CDS) are specified. | -| `node_modules` | This is the place where NPM packages (modules) are to be found in a Node.js based project | -| `srv` | Where the service definitions (in CDS) are specified. | -| `mta.yaml` | This is the central descriptor file for the project. It defines all modules (microservices) and backing services (like databases). This information will be used to build the .mtar archive during design time and to deploy & provision the apps and services during deploy time. | +| `.vscode/` | VS Code specific files for launch configurations (useful for debugging, which we will cover in [exercise 08](../08/)). This directory may or may not be visible in VS Code, depending on version and settings. | +| `app/` | Where any UI components live, in case you're building and serving a full stack app. | +| `db/` | Where the data models (in CDS) are specified. | +| `srv/` | Where the service definitions (in CDS) are specified. | +| `.eslintrc` | Configuration for linting of the JavaScript with [ESLint](https://eslint.org/). | +| `.gitignore` | Specification of what content should be ignored when using `git` for source code control, specifically for CAP-based projects. | +| `mta.yaml` | This is the central descriptor file for the project. It defines all modules (microservices) and backing services (like databases). This information will be used to build the .mtar archive during design time and to deploy & provision the apps and services during deploy time. | +| `package.json` | The standard package descriptor file for Node.js based (NPM) packages and projects. | +| README.md | A small 'Getting Started' guide for this project. | -Besides the directories there are also a number of files, including the project's `package.json` (present in any Node.js based project). ### 4. Create a simple data model and service definition -:point_right: Create a new file called `data-model.cds` in the `db/` directory of the recently created project, copy the following lines to the file and save it: +:point_right: Create a new file called `schema.cds` in the `db/` directory of the recently created project, copy the following lines to the file and save it: ```cds: namespace my.bookshop; @@ -137,10 +130,10 @@ entity Books { > You **may** wish to use VS Code's "auto save" feature, then again you may not. Just in case you do, you can turn it on via the **File -> Auto Save** menu option. -:point_right: Create a new file called `cat-service.cds` in the `srv/` directory of the recently created project, copy the following lines to the file and save it: +:point_right: Create a new file called `service.cds` in the `srv/` directory of the recently created project, copy the following lines to the file and save it: ```cds: -using my.bookshop as my from '../db/data-model'; +using my.bookshop as my from '../db/schema'; service CatalogService { entity Books as projection on my.Books; @@ -151,14 +144,16 @@ You have now created a simple data model as well as a service definition for you ### 5. Examine the data model and service definition -The key files in this project as far as the business domain is concerned are the `db/data-model.cds` and the `srv/cat-service.cds` files that you just added. +The key files in this project as far as the business domain is concerned are the `db/schema.cds` and the `srv/service.cds` files that you just added. :point_right: Have a brief look at the content of each of these files to get a basic understanding of what's there. Note the use of the `namespace` and how it is defined in the data model and referenced in the service definition. Note also the how the different parts of each file are syntax highlighted. -### 6. Start up the service +### 6. Install the dependencies + +The `package.json` file that was created when you initialized the project directory contains a list of NPM packages upon which the project is dependent. Before we can start the service up, these dependencies must be installed. Now is a good time to do that. -Now you're going to start up the service in the skeleton project. **VS Code has an integrated terminal which you can and should use for this and subsequent command line activities**. +**VS Code has an integrated terminal which you can and should use for this and subsequent command line activities**. :point_right: Open the integrated terminal in VS Code. Do this by opening the Command Palette and searching for 'integrated terminal'. You may wish to use the keyboard shortcut for this - note there is a keyboard shortcut for toggling the integrated terminal in and out of view as well. @@ -171,6 +166,33 @@ This should open up the terminal at the bottom of VS Code like this: > **Windows users:** Please make sure to select `cmd` as your default shell before you continue: ![default shell](default-shell-windows.png) +:point_right: In the integrated terminal, making sure first that you're in the project directory itself (where `package.json` is to be found), install the dependencies like this: + +```sh +user@host:~/bookshop +=> npm install +``` + +You should see output that ends something like this: + +```sh +npm notice created a lockfile as package-lock.json. You should commit this file. +added 129 packages from 181 contributors and audited 258 packages in 4.762s +found 0 vulnerabilities +``` + +Great. Now your fledgling service can already be started up! + +### 7. Start up the service + +:point_right: In the same integrated terminal, use the following command to start up the service: + + +```sh +user@host:~/bookshop +=> npm start +``` + :point_right: In the integrated terminal, use the `cds` command line tool with the `serve` command to start serving. Specify `all`, like this, so that `cds` will look for appropriate configuration to serve: ```sh @@ -181,14 +203,17 @@ user@host:~/bookshop You should see output similar to this: ``` -[cds] - connect to datasource - hana:db,srv +> bookshop@1.0.0 start /tmp/codejam/bookshop +> npx cds run + +[cds] - connect to datasource - hana:undefined [cds] - serving CatalogService at /catalog [cds] - service definitions loaded from: - srv/cat-service.cds - db/data-model.cds + srv/service.cds + db/schema.cds -[cds] - launched in: 533.555ms +[cds] - launched in: 583.297ms [cds] - server listening on http://localhost:4004 ... [ terminate with ^C ] ``` @@ -228,4 +253,7 @@ With a single command, you've initialized a basic OData service project and with 4. What happened to the `cds` process when you accessed the entityset? Can you think of reasons why this happened? - \ No newline at end of file + + +5. What actually happens when you run `npm start`, and why? + From a6457ac9f7b333cd044889620c052f9901631eaa Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 11:02:01 +0000 Subject: [PATCH 03/42] update step number and change note --- exercises/02/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/02/readme.md b/exercises/02/readme.md index 36e2505..6cb5550 100644 --- a/exercises/02/readme.md +++ b/exercises/02/readme.md @@ -153,7 +153,7 @@ The key files in this project as far as the business domain is concerned are the The `package.json` file that was created when you initialized the project directory contains a list of NPM packages upon which the project is dependent. Before we can start the service up, these dependencies must be installed. Now is a good time to do that. -**VS Code has an integrated terminal which you can and should use for this and subsequent command line activities**. +> VS Code has an integrated terminal which you can and should use for this and subsequent command line activities. :point_right: Open the integrated terminal in VS Code. Do this by opening the Command Palette and searching for 'integrated terminal'. You may wish to use the keyboard shortcut for this - note there is a keyboard shortcut for toggling the integrated terminal in and out of view as well. @@ -221,7 +221,7 @@ You should see output similar to this: The OData service is now running, and available via [http://localhost:4004](http://localhost:4004). -### 7. Explore the OData service +### 8. Explore the OData service While we have no data in the OData service (we don't even have a persistence layer yet!) we can ask the OData service for the two well-known documents: the service document and the metadata document. From 8e80bfbb07edeec881ac96e68befbfdafa015dea Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 11:06:11 +0000 Subject: [PATCH 04/42] remove cds serve all --- exercises/02/readme.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/exercises/02/readme.md b/exercises/02/readme.md index 6cb5550..0573752 100644 --- a/exercises/02/readme.md +++ b/exercises/02/readme.md @@ -193,13 +193,6 @@ user@host:~/bookshop => npm start ``` -:point_right: In the integrated terminal, use the `cds` command line tool with the `serve` command to start serving. Specify `all`, like this, so that `cds` will look for appropriate configuration to serve: - -```sh -user@host:~/bookshop -=> cds serve all -``` - You should see output similar to this: ``` From 76f3809e40f4b5b77909b6ebf38cde8c4eb962ce Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 12:12:48 +0000 Subject: [PATCH 05/42] mods to ex03 for cds-dk and new approach --- exercises/03/readme.md | 133 ++++++++++++++++++----------------------- 1 file changed, 58 insertions(+), 75 deletions(-) diff --git a/exercises/03/readme.md b/exercises/03/readme.md index ba82d96..8f1081a 100644 --- a/exercises/03/readme.md +++ b/exercises/03/readme.md @@ -7,12 +7,38 @@ In this exercise you'll enhance your basic bookshop project by adding to the dat After completing these steps you'll have a slightly more complex OData service, with a second entity that is related to the first. It will also be backed by an actual persistence layer, provided by SQLite. +### 1. Use `cds watch` to have the service restart on changes -### 1. Add a new Authors entity to the model +During the course of this CodeJam you'll be making many changes and additions to CDS and JavaScript sources. Rather than restart the service manually each time, you can use the `watch` command with the `cds` command line tool, that will restart the server on file changes. + +:point_right: Do this now, by entering `cds watch` in the integrated terminal (if you still have the service running, terminate it first with Ctrl-C): + +```sh +user@host:~/bookshop +=> cds watch +``` + +The `watch` command uses the NPM [nodemon](https://www.npmjs.com/package/nodemon) package, which you can see from the output that it produces, which should look something like this: + +``` +[cds] - running nodemon... +--exec cds run --with-mocks --in-memory? +--ext cds,csn,csv,ts,mjs,cjs,js,json,properties,edmx,xml + +[cds] - connect to datasource - hana:undefined +[cds] - serving CatalogService at /catalog +[cds] - launched in: 555.266ms +[cds] - server listening on http://localhost:4004 ... +[ terminate with ^C ] +``` + +You can now proceed with saving changes to your project and have the service automatically restarted. Nice! + +### 2. Add a new Authors entity to the model Currently the data model is extremely simple. In this step you'll add a second entity `Authors`. -:point_right: Open the `db/data-model.cds` file in VS Code and add a new entity definition, after the `Books` entity, thus: +:point_right: Open the `db/schema.cds` file in VS Code and add a new entity definition, after the `Books` entity, thus: ```cds entity Authors { @@ -21,30 +47,23 @@ entity Authors { } ``` -This is deliberately very simple at this point. Don't forget to save the file. - -:point_right: In the integrated terminal, start (or restart) the service like this: - -```sh -user@host:~/bookshop -=> cds serve all -``` +This is deliberately very simple at this point. Don't forget to save the file ... at which point your service should restart automatically thanks to `cds watch`. :point_right: Open up (or refresh) the [service metadata document](http://localhost:4004/catalog/$metadata) and check for the entity definition you've just added. You're right. It's not there. -### 2. Expose the Authors entity in the service +### 3. Expose the Authors entity in the service While there is now a second entity definition in the data model, it is not exposed in the existing service. In this step, you'll remedy that. -:point_right: Open up the `srv/cat-service.cds` file and add a second entity to the `CatalogService` definition. +:point_right: Open up the `srv/service.cds` file and add a second entity to the `CatalogService` definition. -This is what the contents of `srv/cat-service.cds` should look like after you've added the new entity and removed the annotation: +This is what the contents of `srv/service.cds` should look like after you've added the new entity and removed the annotation: ```cds -using my.bookshop as my from '../db/data-model'; +using my.bookshop as my from '../db/schema'; service CatalogService { entity Books as projection on my.Books; @@ -52,18 +71,18 @@ service CatalogService { } ``` -:point_right: Restart the service and check the metadata document once again. The definition of the Authors entity should now be present in the metadata, and will look something like this: +:point_right: After the service restarts, check the metadata document once again. The definition of the Authors entity should now be present in the metadata, and will look something like this: ![Books and Authors entities in the metadata document](books-authors-metadata-document.png) This is nice, but there's something fundamental that's missing and preventing this data model from being useful. -### 3. Add a relationship between the Books and Authors entities +### 4. Add a relationship between the Books and Authors entities -The `Books` and `Authors` entities are standalone and currently are not related to each other. This is not ideal, so in this step you'll fix that by adding a relationship in the form of an [association](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/9ead8e4701d04848a6fdc84356723a52.html). +The `Books` and `Authors` entities are standalone and currently are not related to each other. This is not ideal, so in this step you'll fix that by adding a relationship in the form of an [association](https://cap.cloud.sap/docs/cds/cdl#associations). -:point_right: Return to the `db/data-model.cds` file and add an association from the `Books` entity to the `Authors` entity, bearing in mind the simplified assumption that a book has a single author. The association should describe a new `author` property in the `Books` entity like this: +:point_right: Return to the `db/schema.cds` file and add an association from the `Books` entity to the `Authors` entity, bearing in mind the simplified assumption that a book has a single author. The association should describe a new `author` property in the `Books` entity like this: ```cds entity Books { @@ -94,63 +113,18 @@ Note that this is a 'to-many' relationship. Don't forget to save the file. -:point_right: Restart the service and check the [metadata document](http://localhost:4004/catalog/$metadata) again. There should now be OData navigation properties defined between the two entities, like this: +:point_right: After the service has restarted, check the [metadata document](http://localhost:4004/catalog/$metadata) again. There should now be OData navigation properties defined between the two entities, like this: ![navigation properties](navigation-properties.png) -### 4. Deploy the service to a persistence layer +### 5. Deploy the service to a persistence layer -As it stands, the OData service has no storage. We can actually simulate storage with [service provider](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/b9c34890348b4f2184e07a6731bce50b.html) logic in JavaScript but that's not a path we want to explore right now (we'll look at it in [exercise 08](../08/)). Instead, we'll use a real database in the form of [SQLite](https://sqlite.org) and deploy the data model and service definition to it. +As it stands, the OData service has no storage. We can actually simulate storage with [service provider](https://cap.cloud.sap/docs/guides/service-impl) logic in JavaScript but that's not a path we want to explore right now (we'll look at it in [exercise 08](../08/)). Instead, we'll use a real database in the form of [SQLite](https://sqlite.org) and deploy the data model and service definition to it. -:point_right: Update the database definition in the project's top-level `package.json` file to include a SQLite DB for local testing. This will fix the issue you encountered before when the Node.js `cds` process crashed. Currently, you'll see a section that describes the persistence layer configuration: - -```json -"cds": { - "requires": { - "db": { - "kind": "hana", - "model": [ - "db", - "srv" - ] - } - }, - "odata": { - "version": "v4" - } -} +As we want to use a local SQLite database (SQLite was defined in the [prerequisites](../../prerequisites.md) for this CodeJam), we need to install a client library to allow the CAP engine to communicate with this DB. -``` - -> Ensure you select the top level `package.json` file - there's also one in the `db/` directory but that's not the one you want. - -To prepare the app for a multiple databases, change the content of the "cds" section to this (not forgetting the comma at the end): - -```json -"cds": { - "requires": { - "db": { - "kind": "sqlite", - "model": [ - "db", - "srv" - ], - "credentials": { - "database": "bookshop.db" - }, - "[production]": { - "kind": "hana" - } - } - }, - "odata": { - "version": "v4" - } -}, -``` - -:point_right: As we want to use a local SQLite database, we need to install a client library to allow the CAP engine to communicate with this DB. Install the `sqlite3` package for this purpose: +:point_right: Do that now, i.e. install the `sqlite3` package for this purpose: ``` user@host:~/bookshop => npm install -D sqlite3 @@ -158,6 +132,8 @@ user@host:~/bookshop > The use of the `-D` (or `--save-dev`) parameter signifies that the `sqlite3` package is a dependency for development purposes only. Have a look at what gets added to `package.json` at this point to see the two different types of package dependencies. +Now it's time to make that deployment to the persistence layer. + :point_right: Explore the `cds deploy` command like this: ```sh @@ -172,6 +148,8 @@ SYNOPSIS according configuration from package.json or .cdsrc.json in key cds.requires.db. Same for the database. + Supported databases: sqlite, hana + [...] ``` @@ -181,12 +159,17 @@ Use this command to deploy the data model and service definition to a new SQLite ``` user@host:~/bookshop -=> cds deploy +=> cds deploy --to sqlite:bookshop ``` -This should complete fairly quietly. +This should complete fairly quietly, something like this: + +``` +/> successfully deployed to ./bookshop.db + > updated ./package.json +``` -### 5. Explore the new database +### 6. Explore the new database At this point you should have a new file `bookshop.db` in the project folder. @@ -204,10 +187,10 @@ sqlite> .quit user@host:~/bookshop ``` -> The `sqlite3` command line utility is not directly related to the `sqlite3` NPM package you just installed; it came from the installation of SQLite itself as described in the [prerequisites](../../prerequisites.md). +> The `sqlite3` command line utility is not directly related to the `sqlite3` NPM package you just installed; it came from the installation of SQLite itself. -### 6. Dig into the link between the CDS definitions and the artefacts in the database +### 7. Dig into the link between the CDS definitions and the artefacts in the database Looking at the tables in the `bookshop.db` database we see that there are two pairs of names; one pair prefixed with `CatalogService` and the other pair prefixed with `my_bookshop`. If you guessed that the `CatalogService`-prefixed artefacts relate to the service definition and the `my_bookshop`-prefixed artefacts relate to the data model, you are correct. @@ -279,7 +262,7 @@ CREATE VIEW CatalogService_Books AS SELECT FROM my_bookshop_Books AS "BOOKS_$0"; ``` -Observe that compiling the service definition will automatically produce DDL for the entities in the data model, as the service refers to them. Observe also that the service artefacts are views, whereas the data model artefacts are tables. +Observe that compiling the service definition will automatically produce DDL for the entities in the data model too, as the service refers to them. Observe also that the service artefacts are views, whereas the data model artefacts are tables. ## Summary @@ -296,4 +279,4 @@ You now have a fully functional, albeit simple, OData service backed by a persis 3. Why might you use the `cds compile` command at all? - \ No newline at end of file + From 924f202c59c2b3fbf2d7b7f7f32a9fa964426a94 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 12:15:54 +0000 Subject: [PATCH 06/42] be more explicit about the entity --- exercises/03/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/03/readme.md b/exercises/03/readme.md index 8f1081a..6941919 100644 --- a/exercises/03/readme.md +++ b/exercises/03/readme.md @@ -49,7 +49,7 @@ entity Authors { This is deliberately very simple at this point. Don't forget to save the file ... at which point your service should restart automatically thanks to `cds watch`. -:point_right: Open up (or refresh) the [service metadata document](http://localhost:4004/catalog/$metadata) and check for the entity definition you've just added. +:point_right: Open up (or refresh) the [service metadata document](http://localhost:4004/catalog/$metadata) and check for the Authors entity definition you've just added. You're right. It's not there. From 0dfbd2a0d6ae0cf2362a937d8ba3123e882c12a3 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 12:17:55 +0000 Subject: [PATCH 07/42] folder -> directory aargh --- exercises/03/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/03/readme.md b/exercises/03/readme.md index 6941919..4c71321 100644 --- a/exercises/03/readme.md +++ b/exercises/03/readme.md @@ -171,7 +171,7 @@ This should complete fairly quietly, something like this: ### 6. Explore the new database -At this point you should have a new file `bookshop.db` in the project folder. +At this point you should have a new file `bookshop.db` in the project directory. :point_right: Have a look inside it with the `sqlite3` command line utility; use the `.tables` command to see what has been created: From ba933b18a251a69b0e09793359f75180e7130dd7 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 12:38:41 +0000 Subject: [PATCH 08/42] mods to ex04 for cds-dk --- exercises/04/readme.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/exercises/04/readme.md b/exercises/04/readme.md index 7353b90..d6be294 100644 --- a/exercises/04/readme.md +++ b/exercises/04/readme.md @@ -25,7 +25,10 @@ Your directory structure should then look something like this (the screenshot al ### 2. Redeploy to the persistence layer -:point_right: The CSV files are discovered and used during a `cds deploy`, so deploy again thus: +The CSV files are discovered and used during a `cds deploy`, so a new deployment is required. While the `cds watch` will restart the service, it won't do a deploy for us, so we'll do that manually now. + +:point_right: Deploy again, this time noting that you don't have to specify the `--to` option: + ```sh user@host:~/bookshop @@ -35,18 +38,18 @@ user@host:~/bookshop During deployment this time you should see extra messages: ``` - > filling my.bookshop.Books from db/csv/my.bookshop-Books.csv > filling my.bookshop.Authors from db/csv/my.bookshop-Authors.csv + > filling my.bookshop.Books from db/csv/my.bookshop-Books.csv /> successfully deployed to ./bookshop.db ``` ### 3. Restart the service -:point_right: Restart the service thus: +:point_right: Now the data's been loaded, you should fire up `cds watch` again: ```sh user@host:~/bookshop -=> cds serve all +=> cds watch ``` Now the [Books](http://localhost:4004/catalog/Books) and [Authors](http://localhost:4004/catalog/Authors) entitysets in the OData service will show data in response to OData Query and Read operations. @@ -80,3 +83,5 @@ Your OData service now has sample data that you can access via OData operations. 2. Where do you think the format of the CSV file names has come from? + +3. How come we didn't have to specify the details (in `--to`) during the deployment in this exercise? From a3afee6dc350dec8c8f1b076528cdd63344371bb Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 13:36:15 +0000 Subject: [PATCH 09/42] initial mods to ex05 for cds-dk --- exercises/05/readme.md | 44 ++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/exercises/05/readme.md b/exercises/05/readme.md index e4c97a2..6581611 100644 --- a/exercises/05/readme.md +++ b/exercises/05/readme.md @@ -1,6 +1,6 @@ # Exercise 05 - Adding a further entity, using generic features -In this exercise you'll add a further entity to the data model and expose it through the service. In defining this entity you'll make use of some [generic features](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/454731d38a1e49c3aa5b182e5209bd20.html) available for all CAP projects. +In this exercise you'll add a further entity to the data model and expose it through the service. In defining this entity you'll make use of some [generic features](https://cap.cloud.sap/docs/cds/common) available for all CAP projects. ## Steps @@ -12,7 +12,7 @@ At the end of these steps you'll have a third entity `Orders`, and will have per If this is a bookshop service, we need to be able to place orders. So you should now add a third entity to the data model, for those orders. -:point_right: Open the `db/data-model.cds` file and first of all add this third entity (not forgetting to save the file when you're done): +:point_right: Open the `db/schema.cds` file and first of all add this third entity (not forgetting to save the file when you're done): ```cds entity Orders { @@ -22,9 +22,9 @@ entity Orders { } ``` -We're not quite done with this entity, but for now, have a look at the fruits of your labor by adding a new entry to the service definition for this entity, redeploying and then restarting the service. +We're not quite done with this entity, but for now, you're about to have a first look at the fruits of your labor by adding a new entry to the service definition for this entity. -:point_right: Add the entry to the `CatalogService` service definition in the `srv/cat-service.cds` file: +:point_right: Add the entry to the `CatalogService` service definition in the `srv/service.cds` file: ``` service CatalogService { @@ -34,9 +34,19 @@ service CatalogService { } ``` -Observe that the CDS Language Service extension picks up the new `Orders` entity straight away (as long as you've saved the `db/data-model.cds` file) and offers it as a suggestion in the code completion feature. +Observe that the CDS Language Service extension picks up the new `Orders` entity straight away (as long as you've saved the `db/schema.cds` file) and offers it as a suggestion in the code completion feature. -:point_right: Now redeploy to have the data model and service definition changes reflected in the persistence layer (note that the CSV data will be used again to seed the tables): +:point_right: Noting that your service has been automatically restarted (by `cds watch`) already, take a look at the new `Orders` entity: . + +You should see an error both in the response returned, and in the service log output, that looks something like this: + +``` +SQLITE_ERROR: no such table: CatalogService_Orders +``` + +That's because we still need to deploy the changes to the persistence layer, to have a new table and view created there for the `Orders` entity. + +:point_right: Do this now (note that the CSV data will be used again to seed the tables): ```sh user@host:~/bookshop @@ -48,21 +58,13 @@ user@host:~/bookshop => ``` -:point_right: Once you've redeployed, restart the service: +> If you want to make sure that the new table and view are there now, you can check with `sqlite3 bookshop.db .tables`. + +:point_right: Once you've redeployed, restart `cds watch`: ```sh user@host:~/bookshop -=> cds serve all - -[cds] - connect to datasource - sqlite:bookshop.db -[cds] - serving CatalogService at /catalog -[cds] - service definitions loaded from: - - srv/cat-service.cds - db/data-model.cds - -[cds] - server listens at http://localhost:4004 ... (terminate with ^C) -[cds] - launched in: 821.718ms +=> cds watch ``` The `Orders` entity is now available in the service (but there is [no data](http://localhost:4004/catalog/Orders) as yet). @@ -87,7 +89,7 @@ You will now enhance the `Orders` entity using some of the common features made - adding creation and modification information - adding a country property referring to the `Country` type -:point_right: First, import the common features to the data model file by adding the following line to `db/data-model.cds`, on the line below the `namespace` declaration: +:point_right: First, import the common features to the data model file by adding the following line to `db/schema.cds`, on the line below the `namespace` declaration: ```cds using { cuid, managed, Country } from '@sap/cds/common'; @@ -147,8 +149,8 @@ user@host:~/bookshop [cds] - serving CatalogService at /catalog [cds] - service definitions loaded from: - srv/cat-service.cds - db/data-model.cds + srv/service.cds + db/schema.cds node_modules/@sap/cds/common.cds [cds] - server listening on http://localhost:4004 ... (terminate with ^C) From 878f24f2cb2f5ccb53f675c97b666bbc8c879684 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 14:17:41 +0000 Subject: [PATCH 10/42] complete draft updates for ex05 --- exercises/05/readme.md | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/exercises/05/readme.md b/exercises/05/readme.md index 6581611..ec9205e 100644 --- a/exercises/05/readme.md +++ b/exercises/05/readme.md @@ -74,9 +74,9 @@ The `Orders` entity is now available in the service (but there is [no data](http When a new order comes in we want to capture the date and time. If we were running in an authenticated environment (in this CodeJam we're not, but CAP supports it) we also want to capture the user associated with the creation. Similarly we want to capture modification information. -We can use some [common CDS definitions](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/454731d38a1e49c3aa5b182e5209bd20.html) that are available to us, built into `@sap/cds` itself. These definitions can be found in the file `@sap/cds/common.cds` in the `node_modules/` directory. +We can use some [common CDS definitions](https://cap.cloud.sap/docs/guides/domain-models#use-common-reuse-types) that are available to us, built into `@sap/cds` itself. These definitions can be found in the file `@sap/cds/common.cds` in the `node_modules/` directory. -:point_right: Use the Explorer view in VS Code to open up the directories under `node_modules/` in the project, to find the `common.cds` file and open it up. In particular, find and examine the `managed` [aspect](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/40582e7bbeca4311b0b165c8b9745094.html), as well as the abstract entity `cuid`. +:point_right: Use the Explorer view in VS Code to open up the directories under `node_modules/` in the project, to find the `common.cds` file and open it up. In particular, find and examine the `managed` [aspect](https://cap.cloud.sap/docs/cds/common#aspect-managed), as well as the abstract entity `cuid`. ![looking at common.cds](common-cds.png) @@ -132,20 +132,23 @@ entity Orders : cuid, managed { Note the difference in capitalization here. The property name is `country` which is described by the type `Country`. -### 4. Redeploy and restart the service +### 4. Restart the service manually and check the output -In the same way as you've done previously, it's now time to redeploy and then restart the service. +While the `cds watch` is useful, it supresses various messages to keep the noise down. But there's something in those suppressed messages that you should pay attention to. -:point_right: This time, try it all in a single line, like this: +:point_right: Terminate any running `cds watch` process, and run `cds deploy && npm start` manually: ```sh user@host:~/bookshop -=> cds deploy && cds serve all - > filling my.bookshop.Books from db/csv/my.bookshop-Books.csv +=> cds deploy && npm start > filling my.bookshop.Authors from db/csv/my.bookshop-Authors.csv -/> successfully deployed database to bookshop.db + > filling my.bookshop.Books from db/csv/my.bookshop-Books.csv +/> successfully deployed to ./bookshop + +> bookshop@1.0.0 start /tmp/codejam/bookshop +> npx cds run -[cds] - connect to datasource - sqlite:bookshop.db +[cds] - connect to datasource - sqlite:bookshop [cds] - serving CatalogService at /catalog [cds] - service definitions loaded from: @@ -153,10 +156,16 @@ user@host:~/bookshop db/schema.cds node_modules/@sap/cds/common.cds -[cds] - server listening on http://localhost:4004 ... (terminate with ^C) -[cds] - launched in: 722.087ms +[cds] - launched in: 875.646ms +[cds] - server listening on http://localhost:4004 ... +[ terminate with ^C ] ``` +> If your operating system command line doesn't support `&&` then just run the two commands one after the other. + +Notice the extra line in the output of the "service definitions loaded from" message. It shows us that not only are definitions being loaded from what we've defined explicitly (i.e. our `srv/service.cds` and `db/schema.cds` files) but also, implicitly, from `node_modules/@sap/cds/common.cds` because of our reference to it in `db/schema.cds` in the `using` statement. + + ### 5. Examine what the Orders entity looks like now From 36416b40d4229ac9dd825b76c55e5b53b6169705 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 14:27:28 +0000 Subject: [PATCH 11/42] npm start -> cds watch --- exercises/05/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/05/readme.md b/exercises/05/readme.md index ec9205e..3c51aa2 100644 --- a/exercises/05/readme.md +++ b/exercises/05/readme.md @@ -136,11 +136,11 @@ Note the difference in capitalization here. The property name is `country` which While the `cds watch` is useful, it supresses various messages to keep the noise down. But there's something in those suppressed messages that you should pay attention to. -:point_right: Terminate any running `cds watch` process, and run `cds deploy && npm start` manually: +:point_right: Terminate any running `cds watch` process, and run `cds deploy && cds watch` manually: ```sh user@host:~/bookshop -=> cds deploy && npm start +=> cds deploy && cds watch > filling my.bookshop.Authors from db/csv/my.bookshop-Authors.csv > filling my.bookshop.Books from db/csv/my.bookshop-Books.csv /> successfully deployed to ./bookshop From c7cbd2b0ad5a84f4bf4dc7ba1cdc6c20b703e937 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 14:36:10 +0000 Subject: [PATCH 12/42] mods for ex06 for cds-dk --- exercises/06/readme.md | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/exercises/06/readme.md b/exercises/06/readme.md index d2034cd..8c31627 100644 --- a/exercises/06/readme.md +++ b/exercises/06/readme.md @@ -80,14 +80,7 @@ service CatalogService { What does this do, precisely? Let's find out. -:point_right: First save the file then redeploy & restart the service, like you did in [exercise 05](../05/): - -```sh -user@host:~/bookshop -=> cds deploy && cds serve all -``` - -:point_right: Now examine the OData service's [metadata](http://localhost:4004/catalog/$metadata), and you should find annotations that look like this: +:point_right: After saving the file and waiting for `cds watch` to restart the service, examine the OData service's [metadata](http://localhost:4004/catalog/$metadata). You should find annotations that look like this: ![readonly annotations](readonly-annotations.png) @@ -158,7 +151,7 @@ In a similar way to how we restricted access to the `Books` and `Authors` entity As you might have guessed, this is achieved via the `@insertonly` annotation shortcut. -:point_right: In the `CatalogService` service definition in `srv/cat-service.cds`, annotate the `Orders` entity with `@insertonly` so it looks like this: +:point_right: In the `CatalogService` service definition in `srv/service.cds`, annotate the `Orders` entity with `@insertonly` so it looks like this: ```cds service CatalogService { @@ -168,8 +161,6 @@ service CatalogService { } ``` -:point_right: Redeploy and restart the service (run `cds deploy && cds serve all` in the terminal). - :point_right: Now create a couple of orders using the Postman collection from [exercise 05](../05/) - there should be a couple of POST requests against the `Orders` entityset (refer to the step in exercise 05 for the command line invocations if you wish). ![Postman request collection](../05/postman-collection.png) From b03701a9ad894a5a834862ae06eaaced82281eb0 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 15:02:20 +0000 Subject: [PATCH 13/42] mods for ex07 for cds-dk --- exercises/07/readme.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/exercises/07/readme.md b/exercises/07/readme.md index 8e7eb62..48a8690 100644 --- a/exercises/07/readme.md +++ b/exercises/07/readme.md @@ -14,7 +14,7 @@ At the end of these steps, you'll have two OData services both exposing differen Service definitions can live alongside each other in the same CDS file. -:point_right: In `srv/cat-service.cds`, add a second service definition thus: +:point_right: In `srv/service.cds`, add a second service definition thus: ```cds service Stats { @@ -31,7 +31,15 @@ service Stats { Here the `Stats` service exposes the Orders entity in a read-only fashion as in the `CatalogService`, but uses the `excluding` clause to omit specific properties. These properties are not of interest to the analysis UI so are explicitly left out. Note that it also exposes the information as an entity called `OrderInfo`. -:point_right: Now redeploy and start serving the services (`cds deploy && cds serve all`) and check the root document at [http://localhost:4004/](http://localhost:4004/). You should see something like this: +:point_right: Effect a deployment to the persistence layer so that the relevant artefact will be created (specifically the view `Stats_OrderInfo`): + +```sh +user@host:~/bookshop +=> cds deploy +``` + + +:point_right: Start the service up again via `cds watch` and check the root document at [http://localhost:4004/](http://localhost:4004/). You should see something like this: ![two services](two-services.png) @@ -129,4 +137,4 @@ It's easy to explore building different views on the same underlying data model, 2. What did the order creation HTTP requests look like - which service was used, and why? - \ No newline at end of file + From d7b6fc6372a415708045220231639470ceb7819f Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 15:02:36 +0000 Subject: [PATCH 14/42] clean up sh sample --- exercises/03/readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/exercises/03/readme.md b/exercises/03/readme.md index 4c71321..b7f8152 100644 --- a/exercises/03/readme.md +++ b/exercises/03/readme.md @@ -125,7 +125,8 @@ As it stands, the OData service has no storage. We can actually simulate storage As we want to use a local SQLite database (SQLite was defined in the [prerequisites](../../prerequisites.md) for this CodeJam), we need to install a client library to allow the CAP engine to communicate with this DB. :point_right: Do that now, i.e. install the `sqlite3` package for this purpose: -``` + +```sh user@host:~/bookshop => npm install -D sqlite3 ``` From 5b94d38f695086fc6db26ede1478cded7ba62240 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 15:04:56 +0000 Subject: [PATCH 15/42] move info on new artefact to question --- exercises/07/readme.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/exercises/07/readme.md b/exercises/07/readme.md index 48a8690..82dcaa1 100644 --- a/exercises/07/readme.md +++ b/exercises/07/readme.md @@ -31,7 +31,7 @@ service Stats { Here the `Stats` service exposes the Orders entity in a read-only fashion as in the `CatalogService`, but uses the `excluding` clause to omit specific properties. These properties are not of interest to the analysis UI so are explicitly left out. Note that it also exposes the information as an entity called `OrderInfo`. -:point_right: Effect a deployment to the persistence layer so that the relevant artefact will be created (specifically the view `Stats_OrderInfo`): +:point_right: Effect a deployment to the persistence layer so that the relevant artefact will be created: ```sh user@host:~/bookshop @@ -138,3 +138,6 @@ It's easy to explore building different views on the same underlying data model, 2. What did the order creation HTTP requests look like - which service was used, and why? + +3. What was the artefact created in the persistence layer in Step 1? + From 20c284a794e48096df8a483cb7458c8b64dc3a1c Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 14 Jan 2020 15:17:58 +0000 Subject: [PATCH 16/42] mods for cds-dk for ex08 --- exercises/08/readme.md | 54 +++++++++++++----------------------------- 1 file changed, 17 insertions(+), 37 deletions(-) diff --git a/exercises/08/readme.md b/exercises/08/readme.md index 3d04ecb..ff7b942 100644 --- a/exercises/08/readme.md +++ b/exercises/08/readme.md @@ -1,6 +1,6 @@ # Exercise 08 - Adding custom logic, and debugging -In this exercise you'll learn how to add custom processing of specific OData operations on your services. It's done by adding [custom implementation logic](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/68af515a26d944c38d81fd92ad33681e.html) (in JavaScript) via well-defined hooks into the service API. +In this exercise you'll learn how to add custom processing of specific OData operations on your services. It's done by adding [custom implementation logic](https://cap.cloud.sap/docs/guides/service-impl) (in JavaScript) via well-defined hooks into the service API. Along the way you'll also learn how to use debugging features in VS Code, with the [launch configuration](https://code.visualstudio.com/docs/editor/debugging#_launch-configurations) provided by the `cds init` command that you used in an earlier exercise. @@ -18,14 +18,14 @@ Custom logic for a given service definition is provided in a JavaScript file tha This custom logic file is normally placed in the same directory as the service definition file (i.e. side-by-side with it). -:point_right: Create a new file `cat-service.js` in the `srv/` directory. You should end up with something like this: +:point_right: Create a new file `service.js` in the `srv/` directory. You should end up with something like this: ![handlers directory](handlers-dir.png) ### 2. Add some basic custom logic code -:point_right: In the new file `cat-service.js`, add the following code: +:point_right: In the new file `service.js`, add the following code: ```javascript module.exports = srv => { @@ -40,39 +40,22 @@ You can see that this custom logic handler file is in the form of a module, whic ### 3. Run the service -:point_right: In the same way you've started the service in previous exercises, simply start the service now: +Following the automatic service restart, you should see a few interesting new lines in the output: -```sh -user@host:~/bookshop -=> cds serve all ``` - -You should see a few interesting lines in the output, highlighted here: - -``` -user@host:~/bookshop -=> cds serve all - -[cds] - connect to datasource - sqlite:bookshop.db +[cds] - connect to datasource - sqlite:bookshop +[cds] - serving CatalogService at /catalog - with impl: srv/service.js +[cds] - serving Stats at /stats - with impl: srv/service.js Service name: CatalogService Service name: Stats -[cds] - serving CatalogService at /catalog - impl: cat-service.js -[cds] - serving Stats at /stats - impl: cat-service.js -[cds] - service definitions loaded from: - - srv/cat-service.cds - db/data-model.cds - node_modules/@sap/cds/common.cds - -[cds] - server listens at http://localhost:4004 ... (terminate with ^C) -[cds] - launched in: 1125.468ms +[cds] - launched in: 928.482ms +[cds] - server listening on http://localhost:4004 ... +[ terminate with ^C ] ``` -The first two ("serving \ at \ ...") that we've seen before now have extra information showing that there's a JavaScript implementation that complements the service definition. +The two lines containing "serving \ at \ ..." that we've seen before now have extra information showing that there's a JavaScript implementation that complements the service definition. -Note that as the relationship between the service definition and the handler is at file level, the new `cat-service.js` file is deemed a handler for both services (`CatalogService` and `Stats`) in that service definition file. - -In fact, we can see that two lines from the call to `console.log` confirm that - the function defined in the module is called twice - once for each service (the first time `srv.name` is "CatalogService", and the second time it's "Stats"). +Note that as the relationship between the service definition and the handler is at file level, the new `service.js` file is deemed a handler for both services (`CatalogService` and `Stats`) in that service definition file. In fact, we can see that two lines from the call to `console.log` confirm that - the function defined in the module is called twice - once for each service (the first time `srv.name` is "CatalogService", and the second time it's "Stats"). ### 4. Set a breakpoint and launch in debug mode @@ -114,14 +97,14 @@ srv.path ![debug control buttons](debug-buttons.png) -:point_right: When you've finished exploring, switch back to the integrated terminal and terminate the service. +:point_right: When you've finished exploring, use the "Stop" debug control button to terminate the service. ### 5. Add custom logic -At this point we're confident enough to start adding custom logic, by [registering custom handlers](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/94c7b69cc4584a1a9dfd9cb2da295d5e.html). The custom logic should cause a discount message ("5% off!") to appear with the titles of books that are highly stocked (and therefore are those which we want to discount in order to get rid of). +At this point we're confident enough to start adding custom logic, by registering custom handlers. The custom logic should cause a discount message ("5% off!") to appear with the titles of books that are highly stocked (and therefore are those which we want to discount in order to get rid of). -:point_right: Add the following code directly after the call to `console.log` in the `cat-service.js` file. As you do, notice in the code the comments that the custom logic is implemented in two different ways, using two different programming styles - you only need one of them. Comment out (or delete) one of them, leaving the one you prefer: +:point_right: Add the following code directly after the call to `console.log` in the `service.js` file. As you do, notice in the code the comments that the custom logic is implemented in two different ways, using two different programming styles - you only need one of them. Comment out (or delete) one of them, leaving the one you prefer: ```js if (srv.name === 'CatalogService') { @@ -159,7 +142,7 @@ At this point we're confident enough to start adding custom logic, by [registeri ## Summary -You have added custom logic and learned how to debug a service in VS Code. The options available for adding custom logic are rich and plentiful - we recommend you look further into the [documentation](https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/94c7b69cc4584a1a9dfd9cb2da295d5e.html) for more information. +You have added custom logic and learned how to debug a service in VS Code. The options available for adding custom logic are rich and plentiful - we recommend you look further into the [documentation](https://cap.cloud.sap/docs/guides/service-impl) for more information. ## Questions @@ -167,8 +150,5 @@ You have added custom logic and learned how to debug a service in VS Code. The o 1. What other hooks do you think might be useful in customizing a service? -2. What is the command used in the launch configuration for starting the service in debug mode - is it `cds serve all`? - - -3. How many times is the function (that is supplied to the `after` hook) called? +2. How many times is the function (that is supplied to the `after` hook) called? From 5540095236194be4746272023089325ca5ab38de Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Wed, 15 Jan 2020 10:05:27 +0000 Subject: [PATCH 17/42] mods for cds-dk (incl pin fix for Fiori elements) --- exercises/09/readme.md | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/exercises/09/readme.md b/exercises/09/readme.md index 58e5ac9..4842ff9 100644 --- a/exercises/09/readme.md +++ b/exercises/09/readme.md @@ -10,16 +10,13 @@ Following these steps, you'll build a simple Fiori app that sits in a local Fior ### 1. Introduce a basic HTML page to be served for the UI -Following the "convention over configuation" theme, the Node.js flavored CAP model will also automatically serve static resources (such as UI artefacts) from a directory called `app/`. +Following the "convention over configuation" theme, the Node.js flavored CAP model will also automatically serve static resources (such as UI artefacts) from a directory called `app/`. If there isn't anything that can be sensibly served in the `app/` directory it will serve the "Welcome to cds.services" landing page we've seen already: ![the "Welcome to cds.services" landing page](../07/two-services.png) -:point_right: Create an `app/` directory, at the same level as the `db/` and `srv/` directories. This directory that will contain the app files. - - -:point_right: Create the `webapp/` directory as a child of the `app/` and create an `index.html` file within it, containing the following. +:point_right: Create the `webapp/` directory as a child of the existing `app/` directory, and create an `index.html` file within it, containing the following: ```html @@ -36,14 +33,14 @@ If there isn't anything that can be sensibly served in the `app/` directory it w ``` -:point_right: Restart the service (with `cds serve all`) and go to the URL [http://localhost:4004/webapp](http://localhost:4004/webapp). Here, while the the page itself looks empty, there is the page title "Bookshop" in the browser tab, that shows us that the HTML we entered has been loaded: +:point_right: If it's not still running, restart `cds watch` and go to the URL [http://localhost:4004/webapp](http://localhost:4004/webapp). Here, while the the page itself looks empty, there is the page title "Bookshop" in the browser tab, that shows us that the HTML we entered has been loaded: ![title in browser tab](title-in-browser-tab.png) ### 2. Add a new module to the project descriptor -This new `app/` directory contains all UI files and represents a new module in the context of what we're eventually going to deploy to the SAP Cloud Platform. +This new `app/` directory contains all UI files and represents a new module in the context of what we're eventually going to deploy to the SAP Cloud Platform. For this to work and be included in what we eventually deploy and run, we must add information to the main deployment descriptor file `mta.yaml` that holds information relating to this. @@ -82,7 +79,7 @@ modules: requires: - name: srv_api group: destinations - properties: + properties: forwardAuthToken: true strictSSL: true name: srv_api @@ -104,6 +101,8 @@ This snippet not only describes the runtime environment of the new module, it al Let's now get back to the HTML in the `index.html` file. To create a sandbox Fiori launchpad we'll need the UI5 runtime as well as artefacts from the `test-resources` area of the toolkit. +> While you have `cds watch` running, you may notice that it's not looking out for changes to HTML files, but that doesn't actually matter, as with HTML changes, the server doesn't need to be restarted. So you can make these following changes and simply switch over to the browser to refresh. + :point_right: Add these `script` elements between the `title` element and the end of the `head` element in `index.html`: ```html @@ -119,7 +118,7 @@ Let's now get back to the HTML in the `index.html` file. To create a sandbox Fio src="https://sapui5.hana.ondemand.com/test-resources/sap/ushell/bootstrap/sandbox.js">