Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/themost-framework/content-service-example
An example of managing files and users upload at @themost-framework
https://github.com/themost-framework/content-service-example
Last synced: about 7 hours ago
JSON representation
An example of managing files and users upload at @themost-framework
- Host: GitHub
- URL: https://github.com/themost-framework/content-service-example
- Owner: themost-framework
- Created: 2024-02-01T05:34:37.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2024-02-01T07:11:41.000Z (10 months ago)
- Last Synced: 2024-02-01T08:27:21.948Z (10 months ago)
- Language: JavaScript
- Homepage:
- Size: 167 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# File Management with @themost/data
This project is an example of how to use `Attachment` model and `PrivateContentService` for managing files and user uploads.
It extends api services provided by `@themost/test` package at https://github.com/themost-framework/test
## Installation
Clone this repository and install dependencies:
```bash
git clone https://github.com/themost-framework/content-service-example
cd content-service-example
npm install
```## Test
Start the application by running the following command:
```bash
npm start
```
Use postman collection at `test/themost-test.postman_collection.json` for testing application servicesIMPORTANT NOTE: `@themost/test` package recycles the database on each test run.
## Description
This example extends test api services and adds 3 new models:
### Attachment
This model represents a file attachment and it is used for storing file metadata. It has the following properties:
- `id` - the unique identifier of the attachment
- `name` - the name of the attachment
- `description` - the description of the attachment
- `contentType` - the mime type of the attachment
- `size` - the size of the attachment
- `url` - the url of the attachment
- `version` - the version of the attachment
- `thumbnail` - the url of the thumbnail of the attachment
- `dateCreated` - the date and time that the attachment was created
- `dateModified` - the date and time that the attachment was modified
- `datePublished` - the date and time that the attachment was published
- `published` - a boolean value which indicates whether the attachment is published or not
- `keywords` - a collection which contains keywords for the attachment
- `attachmentType` - the type of the attachment (e.g. `image`, `video`, `audio`, `document`, `archive`, `other`)
- `owner` - a user which is the owner of this attachment
- `createdBy` - a user which created this attachment
- `modifiedBy` - a user which modified this attachment### AttachmentType
This model represents a type of attachment. It has the following properties:
- `id` - the unique identifier of the attachment type
- `name` - the name of the attachment type
- `description` - the description of the attachment type
- `alternateName` - the alternate name of the attachment type which is also used as a key
- `description` - the description of the attachment type
- `dateCreated` - the date and time that the attachment type was created
- `dateModified` - the date and time that the attachment type was modified
- `createdBy` - a user which created this attachment
- `modifiedBy` - a user which modified this attachment### CustomerOrder
This model represents a customer order and inherits from `Order` model provided by `@themost/test` package. It has the following properties:
- `id` - the unique identifier of the order
- `customer` - the customer which placed this order
- `dateCreated` - the date and time that the order was created
- `dateModified` - the date and time that the order was modified
- `createdBy` - a user which created this order
- `modifiedBy` - a user which modified this order
- `orderedItem` - the ordered item e.g. a product
- `orderNumber` - the order number
- `orderStatus` - the status of the order
- `paymentMethod` - the payment method of the order
- `attachments` - a collection of attachments which are associated with this order### ExtraSchemaLoader
`ExtraSchemaLoader` is being for loading extra data models during startup.
```javascript
// now try to embed a new schema loader which adds a collection of models
// get application configuration
const configuration = app.getConfiguration();
/**
* Get the default schema loader strategy
* @type {import('@themost/data').DefaultSchemaLoaderStrategy}
*/
const schemaLoader = configuration.getStrategy(SchemaLoaderStrategy);
// extend DefaultSchemaLoaderStrategy.loaders collection and add our extra schema loader
// which loads models from config/models folder
schemaLoader.loaders.push(
new ExtraSchemaLoader(configuration)
);
```### PrivateContentService
`PrivateContentService` is being used for managing content uploaded by end users. This service inherits from `ApplicationService` and it's being registered also during startup.
```javascript
// register private content service
app.useService(PrivateContentService);```
It extends service router by adding a new route `/api/content/private/:file` for downloading files
## Customer Order Flow
1. Get access token
```bash
curl --location 'http://localhost:3000/auth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode '[email protected]' \
--data-urlencode 'password=secret' \
--data-urlencode 'client_id=9165351833584149' \
--data-urlencode 'client_secret=hTgqFBUhCfHs/quf/wnoB+UpDSfUusKA' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'scope=profile'
```2. Create new order
```bash
curl --location 'http://localhost:3000/api/CustomerOrders' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer ' \
--data-raw '{
"orderedItem": {
"name": "Apple MacBook Air (13.3-inch, 2013 Version)"
},
"customer": {
"email": "[email protected]"
}
}'
```3. Add attachment
```bash
curl --location 'http://localhost:3000/api/CustomerOrders/811/AddAttachment' \
--header 'Authorization: Bearer ' \
--form 'file=@"/tmp/lorem-ipsum.pdf"' \
--form 'attachmentType[alternateName]="Other"'
```4. Download attachment
```bash
curl --location 'http://localhost:3000/api/content/private/5JXFsvwnxNJf' \
--header 'Authorization: Bearer '
```