diff --git a/CHANGELOG.md b/CHANGELOG.md index cc805b0..7f453a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 0.0.6 + +### Patch Changes + +- Add readme + ## 0.0.5 ### Patch Changes diff --git a/README.md b/README.md index 1048831..7afde00 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,203 @@ # medusa-plugin-blog -Working on it +Provides a basic blog backend for Medusa. + +- Posts can be tagged with products, collections, and/or custom tag values. +- Posts can be queried by tag, category, product, or collection. + +**This plugin is under development and should be considered expirimental.** + +## Installation + +```bash +yarn add medusa-plugin-blog +``` + +## Configuration + +```json +{ + "plugins": [ + "medusa-plugin-blog" + ] +} +``` + +## API Endpoints + +### `GET /store/blog/posts` +return jsons object containing an array of all blog post objects + +### `GET /store/blog/posts/:handle` +return json object containing a single blog post object + +### `GET /store/blog/categories` +return json object containing an array of all blog category objects + +### `GET /store/blog/categories/:handle` +return json object containing a single blog category object + +### `GET /store/blog/categories/:handle/posts` +return json object containing an array of all blog post objects for a given category + +### `GET /store/blog/tags` +return json object containing an array of all blog tag objects + +### `GET /store/blog/tags/posts` +return json object containing an array of all blog post objects for a given tag or array of tags +Example: `/store/blog/tags/posts?tag=tag1&tag=tag2&tag=tag3` etc + +### `GET /store/blog/products/:id` +return json object containing an array of all blog post objects for a product with given id + +### `GET /store/blog/collections/:id` +return json object containing an array of all blog post objects for a collection with given id + +### `POST /admin/blog/categories` +create a new blog category object +Expects body with: +```js +{ + handle: string!, + title: string!, + description: string, + keywords: string[], + metadata: jsonb +} +``` + +### `POST /admin/blog/categories/:id` +update an existing blog category object with given id +Expects body with: +```js +{ + handle: string!, + title: string!, + description: string, + keywords: string[], + metadata: jsonb +} +``` + +### `DELETE /admin/blog/categories/:id` +delete an existing blog category object with given id + +### `POST /admin/blog/posts` +create a new blog post object +Expects body with: +```js +{ + handle: string!, + title: string!, + author: string, + published: boolean, + content: string, + description: string, + keywords: string[], + category_id: string, + tag_ids: string[], + product_ids: string[], + collection_ids: string[], + metadata: jsonb +} +``` + +### `POST /admin/blog/posts/:id` +update an existing blog post object with given id +Expects body with: +```js +{ + handle: string!, + title: string!, + author: string, + published: boolean, + content: string, + description: string, + keywords: string[], + category_id: string, + tag_ids: string[], + product_ids: string[], + collection_ids: string[], + metadata: jsonb +} +``` + +### `DELETE /admin/blog/posts/:id` +delete an existing blog post object with given id + +### `POST /admin/blog/tags` +create a new blog tag object +Expects body with: +```js +{ + value: string! +} +``` + +### `POST /admin/blog/tags/:id` +update an existing blog tag object with given id +Expects body with: +```js +{ + value: string! +} +``` + +### `DELETE /admin/blog/tags/:id` +delete an existing blog tag object with given id + +## Objects + +### BlogPost + +```js +{ + id: string!, + handle: string!, + title: string!, + author: string, + published: string!, + content: string, + description: string, + keywords: string[], + category_id: string, + category: Category, + tags: BlogTag[], + products: Product[], + collections: Collection[], + metadata: jsonb, + created_at: DateTime!, + updated_at: DateTime! +} +``` + +### BlogTag + +```js +{ + id: string!, + value: string! +} +``` + +### BlogCategory + +```js +{ + id: string!, + handle: string!, + title: string!, + description: string, + keywords: string[], + metadata: jsonb, + posts: BlogPost[] +} +``` + +### Product + +Default Medusa Product object + +### Collection + +Default Medusa Collection object diff --git a/package.json b/package.json index 82a1b8e..ba862a1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "medusa-plugin-blog", - "version": "0.0.5", + "version": "0.0.6", "description": "Basic blog for Medusa", "repository": { "type": "git", diff --git a/src/api/index.ts b/src/api/index.ts index 48b0cac..e4072ea 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -22,7 +22,7 @@ export default (rootDirectory: string): Router | Router[] => { }) // GET ALL BLOG POSTS BY CATEGORY - router.get("/store/blog/category/:handle/posts", cors(storeCorsOptions), async (req, res) => { + router.get("/store/blog/categories/:handle/posts", cors(storeCorsOptions), async (req, res) => { const blogService = req.scope.resolve("blogService") blogService.getBlogPostsByCategoryHandle(req.params.handle).then((blog_posts) => { return res.json(blog_posts) @@ -92,7 +92,7 @@ export default (rootDirectory: string): Router | Router[] => { router.use("/admin/blog/categories", bodyParser.json()) router.post("/admin/blog/categories", cors(adminCorsOptions), async (req, res) => { const schema = z.object({ - handle: z.string().optional(), + handle: z.string().min(1), title: z.string().min(1), description: z.string().optional(), keywords: z.string().array().optional(), @@ -113,7 +113,7 @@ export default (rootDirectory: string): Router | Router[] => { router.use("/admin/blog/categories/:id", bodyParser.json()) router.post("/admin/blog/categories/:id", cors(adminCorsOptions), async (req, res) => { const schema = z.object({ - handle: z.string().optional(), + handle: z.string().min(1), title: z.string().min(1), description: z.string().optional(), keywords: z.string().array().optional(),