implement podcast show, post, and tag schemas

This commit is contained in:
Hossein Mehrabi 2024-01-12 16:38:17 +03:30
parent 7d54573974
commit 2fa17e52c8
No known key found for this signature in database
GPG Key ID: 45C04964191AFAA1
18 changed files with 1734 additions and 110 deletions

View File

@ -0,0 +1,19 @@
"use strict";
const webpack = require("webpack");
/* eslint-disable no-unused-vars */
module.exports = (config) => {
// Note: we provide webpack above so you should not `require` it
// Perform customizations to webpack config
// Important: return the modified config
config.plugins.push(
new webpack.NormalModuleReplacementPlugin(
/^tippy\.js$/,
"tippy.js/dist/tippy-bundle.umd.min.js"
)
);
return config;
};

View File

@ -0,0 +1,42 @@
{
"kind": "collectionType",
"collectionName": "podcast_shows",
"info": {
"singularName": "podcast-show",
"pluralName": "podcast-shows",
"displayName": "Podcast Show",
"description": ""
},
"options": {
"draftAndPublish": true
},
"pluginOptions": {},
"attributes": {
"Name": {
"type": "string",
"required": true
},
"hosts": {
"type": "relation",
"relation": "oneToMany",
"target": "plugin::users-permissions.user"
},
"description": {
"type": "blocks"
},
"logo": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [
"images"
]
},
"posts": {
"type": "relation",
"relation": "oneToMany",
"target": "api::post.post",
"mappedBy": "podcast_show"
}
}
}

View File

@ -0,0 +1,7 @@
/**
* podcast-show controller
*/
import { factories } from '@strapi/strapi'
export default factories.createCoreController('api::podcast-show.podcast-show');

View File

@ -0,0 +1,7 @@
/**
* podcast-show router
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreRouter('api::podcast-show.podcast-show');

View File

@ -0,0 +1,7 @@
/**
* podcast-show service
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreService('api::podcast-show.podcast-show');

View File

@ -0,0 +1,80 @@
{
"kind": "collectionType",
"collectionName": "posts",
"info": {
"singularName": "post",
"pluralName": "posts",
"displayName": "Post",
"description": ""
},
"options": {
"draftAndPublish": true
},
"pluginOptions": {},
"attributes": {
"title": {
"type": "string"
},
"subtitle": {
"type": "string"
},
"publish_date": {
"type": "date"
},
"slug": {
"type": "uid",
"targetField": "title"
},
"type": {
"type": "enumeration",
"enum": [
"Article",
"Episode"
],
"default": "Article"
},
"episode_number": {
"type": "integer"
},
"authors": {
"type": "relation",
"relation": "oneToMany",
"target": "plugin::users-permissions.user"
},
"podcast_show": {
"type": "relation",
"relation": "manyToOne",
"target": "api::podcast-show.podcast-show",
"inversedBy": "posts"
},
"cover_image": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [
"images"
]
},
"tags": {
"type": "relation",
"relation": "manyToMany",
"target": "api::tag.tag",
"inversedBy": "posts"
},
"channel": {
"displayName": "Channel",
"type": "component",
"repeatable": true,
"component": "cat.channel"
},
"summary": {
"type": "richtext"
},
"body": {
"type": "richtext"
},
"credits": {
"type": "richtext"
}
}
}

View File

@ -0,0 +1,7 @@
/**
* post controller
*/
import { factories } from '@strapi/strapi'
export default factories.createCoreController('api::post.post');

View File

@ -0,0 +1,7 @@
/**
* post router
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreRouter('api::post.post');

View File

@ -0,0 +1,7 @@
/**
* post service
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreService('api::post.post');

View File

@ -0,0 +1,26 @@
{
"kind": "collectionType",
"collectionName": "tags",
"info": {
"singularName": "tag",
"pluralName": "tags",
"displayName": "Tag",
"description": ""
},
"options": {
"draftAndPublish": false
},
"pluginOptions": {},
"attributes": {
"name": {
"type": "string",
"regex": "^([a-z0-9_\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253-\\u0254\\u0256-\\u0257\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb12-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u0750-\\u077f\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c-\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\ua960-\\ua97f\\uac00-\\ud7af\\ud7b0-\\ud7ff\\uffa1-\\uffdc\\u30a1-\\u30fa\\u30fc-\\u30fe\\uff66-\\uff9f\\uff10-\\uff19\\uff21-\\uff3a\\uff41-\\uff5a\\u3041-\\u3096\\u3099-\\u309e\\u3400-\\u4dbf\\u4e00-\\u9fff\\u20000-\\u2a6df\\u2a700-\\u2b73f\\u2b740-\\u2b81f\\u2f800-\\u2fa1f]*[a-z_\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253-\\u0254\\u0256-\\u0257\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb12-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u0750-\\u077f\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c-\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\ua960-\\ua97f\\uac00-\\ud7af\\ud7b0-\\ud7ff\\uffa1-\\uffdc\\u30a1-\\u30fa\\u30fc-\\u30fe\\uff66-\\uff9f\\uff10-\\uff19\\uff21-\\uff3a\\uff41-\\uff5a\\u3041-\\u3096\\u3099-\\u309e\\u3400-\\u4dbf\\u4e00-\\u9fff\\u20000-\\u2a6df\\u2a700-\\u2b73f\\u2b740-\\u2b81f\\u2f800-\\u2fa1f][a-z0-9_\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253-\\u0254\\u0256-\\u0257\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb12-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u0750-\\u077f\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c-\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\ua960-\\ua97f\\uac00-\\ud7af\\ud7b0-\\ud7ff\\uffa1-\\uffdc\\u30a1-\\u30fa\\u30fc-\\u30fe\\uff66-\\uff9f\\uff10-\\uff19\\uff21-\\uff3a\\uff41-\\uff5a\\u3041-\\u3096\\u3099-\\u309e\\u3400-\\u4dbf\\u4e00-\\u9fff\\u20000-\\u2a6df\\u2a700-\\u2b73f\\u2b740-\\u2b81f\\u2f800-\\u2fa1f]*)$"
},
"posts": {
"type": "relation",
"relation": "manyToMany",
"target": "api::post.post",
"mappedBy": "tags"
}
}
}

View File

@ -0,0 +1,7 @@
/**
* tag controller
*/
import { factories } from '@strapi/strapi'
export default factories.createCoreController('api::tag.tag');

View File

@ -0,0 +1,7 @@
/**
* tag router
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreRouter('api::tag.tag');

View File

@ -0,0 +1,7 @@
/**
* tag service
*/
import { factories } from '@strapi/strapi';
export default factories.createCoreService('api::tag.tag');

View File

@ -0,0 +1,25 @@
{
"collectionName": "components_cat_channels",
"info": {
"displayName": "Channel",
"icon": "television"
},
"options": {},
"attributes": {
"channel": {
"type": "enumeration",
"enum": [
"Spotify",
"Youtube",
"Simplecast",
"Google Podcasts",
"Apple Podcasts"
]
},
"link": {
"type": "text",
"regex": "(https?:\\/\\/(?:www\\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\\.[^\\s]{2,}|www\\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\\.[^\\s]{2,}|https?:\\/\\/(?:www\\.|(?!www))[a-zA-Z0-9]+\\.[^\\s]{2,}|www\\.[a-zA-Z0-9]+\\.[^\\s]{2,})",
"required": true
}
}
}

View File

@ -0,0 +1,72 @@
{
"kind": "collectionType",
"collectionName": "up_users",
"info": {
"name": "user",
"description": "",
"singularName": "user",
"pluralName": "users",
"displayName": "User"
},
"options": {
"draftAndPublish": false
},
"attributes": {
"username": {
"type": "string",
"minLength": 3,
"unique": true,
"configurable": false,
"required": true
},
"email": {
"type": "email",
"minLength": 6,
"configurable": false,
"required": true
},
"provider": {
"type": "string",
"configurable": false
},
"password": {
"type": "password",
"minLength": 6,
"configurable": false,
"private": true,
"searchable": false
},
"resetPasswordToken": {
"type": "string",
"configurable": false,
"private": true,
"searchable": false
},
"confirmationToken": {
"type": "string",
"configurable": false,
"private": true,
"searchable": false
},
"confirmed": {
"type": "boolean",
"default": false,
"configurable": false
},
"blocked": {
"type": "boolean",
"default": false,
"configurable": false
},
"role": {
"type": "relation",
"relation": "manyToOne",
"target": "plugin::users-permissions.role",
"inversedBy": "users",
"configurable": false
},
"name": {
"type": "string"
}
}
}

View File

@ -1,5 +1,23 @@
import type { Schema, Attribute } from '@strapi/strapi';
declare module '@strapi/types' {
export module Shared {}
export interface CatChannel extends Schema.Component {
collectionName: 'components_cat_channels';
info: {
displayName: 'Channel';
icon: 'television';
};
attributes: {
channel: Attribute.Enumeration<
['Spotify', 'Youtube', 'Simplecast', 'Google Podcasts', 'Apple Podcasts']
>;
link: Attribute.Text & Attribute.Required;
};
}
declare module '@strapi/types' {
export module Shared {
export interface Components {
'cat.channel': CatChannel;
}
}
}

View File

@ -362,6 +362,117 @@ export interface AdminTransferTokenPermission extends Schema.CollectionType {
};
}
export interface ApiPodcastShowPodcastShow extends Schema.CollectionType {
collectionName: 'podcast_shows';
info: {
singularName: 'podcast-show';
pluralName: 'podcast-shows';
displayName: 'Podcast Show';
description: '';
};
options: {
draftAndPublish: true;
};
attributes: {
Name: Attribute.String & Attribute.Required;
hosts: Attribute.Relation<
'api::podcast-show.podcast-show',
'oneToMany',
'plugin::users-permissions.user'
>;
description: Attribute.Blocks;
logo: Attribute.Media;
posts: Attribute.Relation<
'api::podcast-show.podcast-show',
'oneToMany',
'api::post.post'
>;
createdAt: Attribute.DateTime;
updatedAt: Attribute.DateTime;
publishedAt: Attribute.DateTime;
createdBy: Attribute.Relation<
'api::podcast-show.podcast-show',
'oneToOne',
'admin::user'
> &
Attribute.Private;
updatedBy: Attribute.Relation<
'api::podcast-show.podcast-show',
'oneToOne',
'admin::user'
> &
Attribute.Private;
};
}
export interface ApiPostPost extends Schema.CollectionType {
collectionName: 'posts';
info: {
singularName: 'post';
pluralName: 'posts';
displayName: 'Post';
description: '';
};
options: {
draftAndPublish: true;
};
attributes: {
title: Attribute.String;
subtitle: Attribute.String;
publish_date: Attribute.Date;
slug: Attribute.UID<'api::post.post', 'title'>;
type: Attribute.Enumeration<['Article', 'Episode']> &
Attribute.DefaultTo<'Article'>;
episode_number: Attribute.Integer;
authors: Attribute.Relation<
'api::post.post',
'oneToMany',
'plugin::users-permissions.user'
>;
podcast_show: Attribute.Relation<
'api::post.post',
'manyToOne',
'api::podcast-show.podcast-show'
>;
cover_image: Attribute.Media;
tags: Attribute.Relation<'api::post.post', 'manyToMany', 'api::tag.tag'>;
channel: Attribute.Component<'cat.channel', true>;
summary: Attribute.RichText;
body: Attribute.RichText;
credits: Attribute.RichText;
createdAt: Attribute.DateTime;
updatedAt: Attribute.DateTime;
publishedAt: Attribute.DateTime;
createdBy: Attribute.Relation<'api::post.post', 'oneToOne', 'admin::user'> &
Attribute.Private;
updatedBy: Attribute.Relation<'api::post.post', 'oneToOne', 'admin::user'> &
Attribute.Private;
};
}
export interface ApiTagTag extends Schema.CollectionType {
collectionName: 'tags';
info: {
singularName: 'tag';
pluralName: 'tags';
displayName: 'Tag';
description: '';
};
options: {
draftAndPublish: false;
};
attributes: {
name: Attribute.String;
posts: Attribute.Relation<'api::tag.tag', 'manyToMany', 'api::post.post'>;
createdAt: Attribute.DateTime;
updatedAt: Attribute.DateTime;
createdBy: Attribute.Relation<'api::tag.tag', 'oneToOne', 'admin::user'> &
Attribute.Private;
updatedBy: Attribute.Relation<'api::tag.tag', 'oneToOne', 'admin::user'> &
Attribute.Private;
};
}
export interface PluginUploadFile extends Schema.CollectionType {
collectionName: 'files';
info: {
@ -722,7 +833,6 @@ export interface PluginUsersPermissionsUser extends Schema.CollectionType {
};
options: {
draftAndPublish: false;
timestamps: true;
};
attributes: {
username: Attribute.String &
@ -751,6 +861,7 @@ export interface PluginUsersPermissionsUser extends Schema.CollectionType {
'manyToOne',
'plugin::users-permissions.role'
>;
name: Attribute.String;
createdAt: Attribute.DateTime;
updatedAt: Attribute.DateTime;
createdBy: Attribute.Relation<
@ -768,93 +879,6 @@ export interface PluginUsersPermissionsUser extends Schema.CollectionType {
};
}
export interface ApiArticleArticle extends Schema.CollectionType {
collectionName: 'articles';
info: {
singularName: 'article';
pluralName: 'articles';
displayName: 'Article';
};
options: {
draftAndPublish: true;
};
attributes: {
text: Attribute.String;
createdAt: Attribute.DateTime;
updatedAt: Attribute.DateTime;
publishedAt: Attribute.DateTime;
createdBy: Attribute.Relation<
'api::article.article',
'oneToOne',
'admin::user'
> &
Attribute.Private;
updatedBy: Attribute.Relation<
'api::article.article',
'oneToOne',
'admin::user'
> &
Attribute.Private;
};
}
export interface ApiEpisodeEpisode extends Schema.CollectionType {
collectionName: 'episodes';
info: {
singularName: 'episode';
pluralName: 'episodes';
displayName: 'Episode';
};
options: {
draftAndPublish: true;
};
attributes: {
episode_number: Attribute.Integer;
createdAt: Attribute.DateTime;
updatedAt: Attribute.DateTime;
publishedAt: Attribute.DateTime;
createdBy: Attribute.Relation<
'api::episode.episode',
'oneToOne',
'admin::user'
> &
Attribute.Private;
updatedBy: Attribute.Relation<
'api::episode.episode',
'oneToOne',
'admin::user'
> &
Attribute.Private;
};
}
export interface ApiPostPost extends Schema.CollectionType {
collectionName: 'posts';
info: {
singularName: 'post';
pluralName: 'posts';
displayName: 'post';
description: '';
};
options: {
draftAndPublish: true;
};
attributes: {
type: Attribute.Enumeration<['Article', 'Episode']> &
Attribute.Required &
Attribute.DefaultTo<'Article'>;
text: Attribute.RichText;
episode_number: Attribute.Integer;
createdAt: Attribute.DateTime;
updatedAt: Attribute.DateTime;
publishedAt: Attribute.DateTime;
createdBy: Attribute.Relation<'api::post.post', 'oneToOne', 'admin::user'> &
Attribute.Private;
updatedBy: Attribute.Relation<'api::post.post', 'oneToOne', 'admin::user'> &
Attribute.Private;
};
}
declare module '@strapi/types' {
export module Shared {
export interface ContentTypes {
@ -865,6 +889,9 @@ declare module '@strapi/types' {
'admin::api-token-permission': AdminApiTokenPermission;
'admin::transfer-token': AdminTransferToken;
'admin::transfer-token-permission': AdminTransferTokenPermission;
'api::podcast-show.podcast-show': ApiPodcastShowPodcastShow;
'api::post.post': ApiPostPost;
'api::tag.tag': ApiTagTag;
'plugin::upload.file': PluginUploadFile;
'plugin::upload.folder': PluginUploadFolder;
'plugin::content-releases.release': PluginContentReleasesRelease;
@ -873,9 +900,6 @@ declare module '@strapi/types' {
'plugin::users-permissions.permission': PluginUsersPermissionsPermission;
'plugin::users-permissions.role': PluginUsersPermissionsRole;
'plugin::users-permissions.user': PluginUsersPermissionsUser;
'api::article.article': ApiArticleArticle;
'api::episode.episode': ApiEpisodeEpisode;
'api::post.post': ApiPostPost;
}
}
}

1289
yarn.lock

File diff suppressed because it is too large Load Diff