raisfast 0.2.23

The last backend you'll ever need. Rust-powered headless CMS with built-in blog, ecommerce, wallet, payment and 4 plugin engines.
package raisfast:plugin-wit;

interface types {
    record post-input {
        title: string,
        content: string,
        slug: option<string>,
        excerpt: option<string>,
        category-id: option<string>,
        tag-ids: option<list<string>>,
        status: option<string>,
        cover-image: option<string>,
    }

    record post-output {
        id: string,
        title: string,
        slug: string,
        content: string,
        excerpt: option<string>,
        status: string,
        created-by: string,
        updated-by: option<string>,
        category-id: option<string>,
        view-count: s64,
        created-at: string,
        updated-at: string,
        published-at: option<string>,
    }

    record comment-input {
        content: string,
        nickname: option<string>,
        email: option<string>,
        parent-id: option<string>,
    }

    record content-event {
        content-type: string,
        data: string,
        id: option<string>,
    }
}

interface host-api {
    use types.{post-output};

    log: func(level: string, msg: string);
    get-config: func(key: string) -> option<string>;
    http-get: func(url: string) -> option<string>;
    http-post: func(url: string, body: string) -> option<string>;
    get-data: func(key: string) -> option<string>;
    set-data: func(key: string, value: string) -> bool;
    get-post: func(slug: string) -> option<string>;
    db-query: func(sql: string, params: option<string>) -> string;
    db-execute: func(sql: string, params: option<string>) -> string;
    db-begin: func() -> string;
    db-commit: func() -> string;
    db-rollback: func() -> string;
    vfs-read: func(path: string) -> option<string>;
    vfs-write: func(path: string, content: string) -> bool;
    vfs-delete: func(path: string) -> bool;
    vfs-exists: func(path: string) -> bool;
    vfs-list: func(path: string) -> option<string>;
    vfs-stat: func(path: string) -> option<string>;
    emit-event: func(event-type: string, data: string) -> string;
}

interface plugin-hooks {
    use types.{post-input, post-output, comment-input, content-event};

    on-post-creating: func(input: post-input) -> option<post-input>;
    on-post-updating: func(input: post-input) -> option<post-input>;
    on-comment-creating: func(input: comment-input) -> option<comment-input>;
    on-content-creating: func(input: content-event) -> option<content-event>;
    on-content-updating: func(input: content-event) -> option<content-event>;
    render-markdown: func(input: string) -> option<string>;
    filter-html: func(input: string) -> option<string>;
    on-post-created: func(output: post-output);
    on-post-updated: func(output: post-output);
    on-post-deleted: func(id: string);
    on-comment-created: func(input: comment-input);
    on-content-created: func(input: content-event);
    on-content-updated: func(input: content-event);
    on-content-deleted: func(content-type: string, id: string);
    on-login: func(user-id: string);
    on-cron-tick: func(payload: option<string>);
}

world plugin-world {
    import host-api;
    export plugin-hooks;
}