Skip to content

Examples

Appwrite Functions is all about flexibility. Behind the simple workflow hides some useful examples that can help you accomplish your goals faster. Take a look at the following.

1

Here's a currency conversion API that converts from Euros and Indian Rupees to US Dollars. We'll use an external API to get the latest exchange rates and query it using a dependency specific to each runtime.

Prerequisites

Code

import { fetch } from 'undici';

export default async function ({ req, res }) {
  if (req.path === '/eur') {
    const amountInEuros = Number(req.query.amount);
    const response = await fetch('https://api.exchangerate.host/latest?base=EUR&symbols=USD');
    const data = await response.json();
    const amountInDollars = amountInEuros * data.rates.USD;
    return res.text(amountInDollars.toString());
  }

  if (req.path === '/inr') {
    const amountInRupees = Number(req.query.amount);
    const response = await fetch('https://api.exchangerate.host/latest?base=INR&symbols=USD');
    const data = await response.json();
    const amountInDollars = amountInRupees * data.rates.USD;
    return res.text(amountInDollars.toString());
  }

  return res.text('Invalid path');
};
2

Here's a simple voting system that allows users to vote on various topics. Appwrite Functions and the server SDK are used to enforce voting rules and prevent multiple votes from the same user for a single topic.

Prerequisites

Create a Topics table with the following columns:

NameTypeDescription
title
string
The name of the topic
description
string
Long form description of the topic

Create a Votes table with the following columns:

NameTypeDescription
userId
string
The ID of the user who cast the vote
topicId
string
The ID of the topic that was voted on
vote
string
The vote cast by the user. Must be either "yes" or "no"

Code

import { Client, TablesDB, Query, ID } from 'node-appwrite';

export default async function ({ req, res }) {
  const vote = {
    userId: req.query.userId,
    topicId: req.query.topicId,
    vote: req.query.vote
  };

  if (vote.vote !== 'yes' && vote.vote !== 'no') {
    return res.json({ ok: false, message: 'You must vote yes or no.' }, 400);
  }

  // Set project and set API key
  const client = new Client();
  client
    .setProject(process.env.APPWRITE_FUNCTION_PROJECT_ID)
    .setKey(req.headers['x-appwrite-key']);

  const tablesDB = new TablesDB(client);

  const existingVotes = await tablesDB.listRows({
    databaseId: '<DATABASE_ID>',
    tableId: '<VOTES_TABLE_ID>',
    queries: [
      Query.equals('userId', vote.userId),
      Query.equals('topicId', vote.topicId)
    ]
  });

  if (existingVotes.total > 0) {
    return res.json({ ok: false, message: 'You have already voted on this topic.' }, 400);
  }

  const voteDocument = await tablesDB.createRow({
    databaseId: '<DATABASE_ID>',
    tableId: '<VOTES_TABLE_ID>',
    rowId: ID.unique(),
    data: {
      userId: vote.userId,
      topicId: vote.topicId,
      vote: vote.vote,
    }
  });

  return res.json({ ok: true, message: 'Vote cast.', vote: voteDocument });
};

Use the function by navigating to the function URL in the browser. The URL should contain the required parameters. For example, <YOUR_FUNCTION_URL>/?userId=<USER_ID>&topicId=<TOPIC_ID>&vote=yes to cast a vote.

3

Here's a simple form page that handles form submissions, and can be used to store a user's message in a table. The form is submitted to the function using the POST method and the form data is sent as a URL-encoded string in the request body.

Prerequisites

Create a Messages table with the following columns:

NameTypeDescription
name
string
The name of the message author
email
string
The email of the message author
content
string
The content of the message

Code

import { Client, TablesDB, Query, ID } from 'node-appwrite';
import querystring from 'node:querystring';

const html = `<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Contact Form</title>
  </head>
  <body>
    <form action="/" method="POST">
      <input type="text" id="name" name="name" placeholder="Name" required>
      <input type="email" id="email" name="email" placeholder="Email" required>
      <textarea id="content" name="content" placeholder="Message" required></textarea>
      <button type="submit">Submit</button>
    </form>
  </body>
</html>`

export default async function ({ req, res }) {
  if (req.method === 'GET') {
    return res.text(html, 200, {'content-type': 'text/html'});
  }

  if (req.method === 'POST' && req.headers['content-type'] === 'application/x-www-form-urlencoded') {
    const formData = querystring.parse(req.body);

    const message = {
      name: formData.name,
      email: formData.email,
      content: formData.content
    };

    // Set project and set API key
    const client = new Client()
      .setProject(process.env.APPWRITE_FUNCTION_PROJECT_ID)
      .setKey(req.headers['x-appwrite-key']);

    const tablesDB = new TablesDB(client);
    const row = await tablesDB.createRow({
        databaseId: '<DATABASE_ID>',
        tableId: '<MESSAGES_TABLE_ID>',
        rowId: ID.unique(),
        data: message
    });

    return res.text("Message sent");
  }

  return res.text('Not found', 404);
}

Use the function by navigating to the function URL in the browser. Submit the form to store the message in the table.