Wertik-js allows extending your app with more features using the modules term. To use a module Wertik JS provides a method called useModule which allows you to create a new module. Let's create a module.
import wertik, {
useMysqlDatabase,
useMailer,
useModule,
useGraphql,
} from "wertik-js/lib/";
weritk({
port: 1200,
database: {
default: useMysqlDatabase({
name: "default",
password: "pass",
host: "localhost",
port: 3306,
username: "root",
}),
},
graphql: useGraphql(),
mailer: {
default: useMailer(),
},
modules: {
users: useModule({
table: "users",
database: "default",
name: "users",
useMysqlDatabase: true,
}),
},
});
Please check this interface file for what type of options does useModule function requires.
When you provide useMysqlDatabase: true, table and database, Wertik JS automatically generates GraphQL schema, updateInput and createInput. For example let's say you have a table called Games with following fields:
You have to initialize its module in this way:
import wertik, { useModule, useMysqlDatabase, useGraphql } from "wertik-js/lib/";
wertik({
port: 1200,
graphql: useGraphql(),
database: {
default: useMysqlDatabase({
name: "dbname",
password: "pass",
host: "localhost",
port: 3306,
username: "root",
}),
},
modules: {
games: useModule({
useMysqlDatabase: true,
name: "Games",
table: "games",
database: "default",
}),
},
});
Wertik JS will create a type called Games:
type Games {
name: String
publisher: String
}
And for Update and Create inputs it will create inputs like this:
input createGamesInput {
name: String
publisher: String
}
input updateGamesInput {
name: String
publisher: String
}
For filtering data from games table, Wertik JS will also create an input for filtering:
input GamesFilterInput {
name: StringFilterInput
publisher: StringFilterInput
}
To explore more about StringFilterInput and other filter input please visit GraphQL Playground to get more familiar with it.
type Query {
version: String
viewGames(where: GamesFilterInput): Games
listGames(
pagination: PaginationInput
where: GamesFilterInput
sorting: [SortingInput]
): GamesList
countGames(where: GamesFilterInput): Int
}
Note: When you are using enums in table please make sure that your enum value doesn't contains dashes, it should be something like this enum('X_SMALL','X_LARGE') not enum('X-SMALL','X-LARGE').
type Mutation {
version: String
updateGames(
input: updateGamesInput
where: GamesFilterInput!
): GamesBulkMutationResponse
createGames(input: [createGamesInput]): GamesBulkMutationResponse
deleteGames(where: GamesFilterInput!): SuccessResponse
createOrUpdateGames(id: Int, input: createGamesInput): Games
}
You can try these Mutations and Queries in your GraphQL playground. If you find any issues please create a new issue Here.
When you provide useMysqlDatabase: true for a module called Games. Wertik JS will create a query as:
listGames(
pagination: PaginationInput
where: GamesFilterInput
sorting: [SortingInput]
): GamesList
Where PaginationInput is
input PaginationInput {
page: Int
limit: Int
}
And GamesFilterInput is same as Sequelize search object but main keywords such as like, eq or like starts with _, For example:
query GamesList {
listGames(where: { publisher: { _eq: "rockstar" } }) {
list {
publisher
}
}
}
And for sorting it is
input SortingInput {
column: String
type: String
}
Sorting Example:
query GamesList {
listGames(sorting: [{ column: "id", type: "asc" }]) {
list {
publisher
}
}
}
To get more familiar with Schema please open your schema from Apollo Playground running at http://localhost:1200/graphql where 1200 is the default port of Wertik JS.
If you find any issues with Filtering, Sorting or Paginating rows. You can open a new issue Here.
When you run a Query or Mutation on a module(Please check Mutations and Queries) Wertik JS fires an event, Please check Typescript interface called useModuleProps.events. Those are the list of events that you can use. To explore more about types you can click Go to Type Definition of method useModule.
When events are running you get access to Apollo GraphQL Resolver arguments where you can access Request params as well. For more please see about Crud
Note: When you return something from event it will be considered as args, For more please see This file
Example:
import wertik, { useMysqlDatabase, useModule } from "wertik-js/lib/";
wertik({
port: 1200,
database: {
default: useMysqlDatabase({
name: "default",
password: "pass",
host: "localhost",
port: 3306,
username: "root",
}),
},
modules: {
games: useModule({
useMysqlDatabase: true,
name: "Games",
table: "games",
database: "jscontainer",
events: {
beforeCreate(_, args, context, info) {
console.log("This will run before creating a game");
},
},
}),
},
});
List of available events:
When using Wertik JS modules. useModule has a function called on which can be used to extend more features like:
Example:
import wertik, { useModule } from "wertik-js/lib/";
wertik({
port: 1200,
modules: {
games: useModule({
useMysqlDatabase: true,
name: "Games",
table: "games",
database: "jscontainer",
on({ useExpress, useQuery, useMutation, useSchema }) {
useExpress((express) => {
express.get("/404", (req, res) => res.status(404).send("404"));
});
useQuery({
name: "getGames",
query: "getGames: [Games]",
resolver() {
return [];
},
});
useMutation({
name: "updateAllGames",
query: "updateAllGames: [Games]",
resolver() {
return [];
},
});
useSchema(`
type MyType {
id: Int
name: String
}
`);
},
}),
},
});
To see on method interface please check this Interface File