Deleted the stored data
You can either delete all the user's metadata, or ceetain fields from them:
#
Deleting specific fields from the metadata objectThis can be done by calling the update metadata function and setting the field you want to remove to be null
. For example, if you have the following metadata object for a user:
{ "preferences": { "theme": "dark" }, "notifications": { "email": true }, "todos": ["use-text-notifs"]}
And you want to remove the "notifications"
field, you can update the metadata object with the following JSON:
{ "notifications": null}
This would result in the final metadata object:
{ "preferences": { "theme": "dark" }, "todos": ["use-text-notifs"]}
important
You can only remove the root level fields in the metadata object in this way. From the above example, if you set preferences.theme: null
, then it will not remove the "theme"
field, but instead set it to a JSON null value.
In code, it would look like:
- NodeJS
- GoLang
- Python
- Express
- Hapi
- Fastify
- Koa
- Loopback
- AWS Lambda / Netlify
- Next.js
- NestJS
import express from "express";import { verifySession } from "supertokens-node/recipe/session/framework/express";import UserMetadata from "supertokens-node/recipe/usermetadata";
let app = express();
app.post("/updateinfo", verifySession(), async (req, res) => { const session = req.session; const userId = session.getUserId();
await UserMetadata.updateUserMetadata(userId, { notifications: null });
res.json({ message: "successfully updated user metadata" });});
import Hapi from "@hapi/hapi";import { verifySession } from "supertokens-node/recipe/session/framework/hapi";import { SessionRequest } from "supertokens-node/framework/hapi";import UserMetadata from "supertokens-node/recipe/usermetadata";
let server = Hapi.server({ port: 8000 });
server.route({ path: "/updateinfo", method: "post", options: { pre: [ { method: verifySession(), }, ], }, handler: async (req: SessionRequest, res) => { const session = req.session; const userId = session!.getUserId();
await UserMetadata.updateUserMetadata(userId, { notifications: null }); return res.response({ message: "successfully updated user metadata" }).code(200); },});
import Fastify from "fastify";import { verifySession } from "supertokens-node/recipe/session/framework/fastify";import UserMetadata from "supertokens-node/recipe/usermetadata";
let fastify = Fastify();
fastify.post( "/updateinfo", { preHandler: verifySession(), }, async (req, res) => { const session = req.session; const userId = session.getUserId();
await UserMetadata.updateUserMetadata(userId, { notifications: null }); res.send({ message: "successfully updated user metadata" }); },);
import { verifySession } from "supertokens-node/recipe/session/framework/awsLambda";import { SessionEvent } from "supertokens-node/framework/awsLambda";import UserMetadata from "supertokens-node/recipe/usermetadata";
async function updateinfo(awsEvent: SessionEvent) { const session = awsEvent.session; const userId = session!.getUserId();
await UserMetadata.updateUserMetadata(userId, { notifications: null });
return { body: JSON.stringify({ message: "successfully updated user metadata" }), statusCode: 200, };}
exports.handler = verifySession(updateinfo);
import KoaRouter from "koa-router";import { verifySession } from "supertokens-node/recipe/session/framework/koa";import { SessionContext } from "supertokens-node/framework/koa";import UserMetadata from "supertokens-node/recipe/usermetadata";
let router = new KoaRouter();
router.post("/updateinfo", verifySession(), async (ctx: SessionContext, next) => { const session = ctx.session; const userId = session!.getUserId();
await UserMetadata.updateUserMetadata(userId, { notifications: null }); ctx.body = { message: "successfully updated user metadata" };});
import { inject, intercept } from "@loopback/core";import { RestBindings, post, response } from "@loopback/rest";import { verifySession } from "supertokens-node/recipe/session/framework/loopback";import { SessionContext } from "supertokens-node/framework/loopback";import UserMetadata from "supertokens-node/recipe/usermetadata";
class UpdateInfo { constructor(@inject(RestBindings.Http.CONTEXT) private ctx: SessionContext) {} @post("/updateinfo") @intercept(verifySession()) @response(200) async handler() { const session = this.ctx.session; const userId = session!.getUserId();
await UserMetadata.updateUserMetadata(userId, { notifications: null }); return { message: "successfully updated user metadata" }; }}
import { superTokensNextWrapper } from "supertokens-node/nextjs";import { verifySession } from "supertokens-node/recipe/session/framework/express";import { SessionRequest } from "supertokens-node/framework/express";import UserMetadata from "supertokens-node/recipe/usermetadata";
export default async function updateInfo(req: any, res: any) { await superTokensNextWrapper( async (next) => { await verifySession()(req, res, next); }, req, res, ); const session = (req as SessionRequest).session; const userId = session!.getUserId();
await UserMetadata.updateUserMetadata(userId, { notifications: null }); res.json({ message: "successfully updated user metadata" });}
import { Controller, Post, UseGuards, Session } from "@nestjs/common";import { SessionContainer } from "supertokens-node/recipe/session";import UserMetadata from "supertokens-node/recipe/usermetadata";import { AuthGuard } from "./auth/auth.guard";
@Controller()export class ExampleController { // For more information about "AuthGuard" and the "Session" decorator please read our NestJS guide. @Post("example") @UseGuards(new AuthGuard()) async postExample(@Session() session: SessionContainer): Promise<{ message: string }> { const userId = session.getUserId();
await UserMetadata.updateUserMetadata(userId, { notifications: null }); return { message: "successfully updated user metadata" }; }}
import "github.com/supertokens/supertokens-golang/recipe/usermetadata"
func main() { userId := "..."
usermetadata.UpdateUserMetadata(userId, map[string]interface{}{ "notifications": nil, })}
- Asyncio
- Syncio
from supertokens_python.recipe.usermetadata.asyncio import update_user_metadata
async def some_func(): user_id = "..."
await update_user_metadata(user_id, { "notifications": None })
from supertokens_python.recipe.usermetadata.syncio import update_user_metadata
user_id = "..."
update_user_metadata(user_id, { "notifications": None})
#
Deleting the entire metadata objectUsing this function will delete all the fields in the user metadata object for that user.
- NodeJS
- GoLang
- Python
- Express
- Hapi
- Fastify
- Koa
- Loopback
- AWS Lambda / Netlify
- Next.js
- NestJS
import express from "express";import { verifySession } from "supertokens-node/recipe/session/framework/express";import UserMetadata from "supertokens-node/recipe/usermetadata";
let app = express();
app.post("/updateinfo", verifySession(), async (req, res) => { const session = req.session; const userId = session!.getUserId();
await UserMetadata.clearUserMetadata(userId);
res.json({ success: true });});
import Hapi from "@hapi/hapi";import { verifySession } from "supertokens-node/recipe/session/framework/hapi";import { SessionRequest } from "supertokens-node/framework/hapi";import UserMetadata from "supertokens-node/recipe/usermetadata";
let server = Hapi.server({ port: 8000 });
server.route({ path: "/updateinfo", method: "post", options: { pre: [ { method: verifySession(), }, ], }, handler: async (req: SessionRequest, res) => { const session = req.session; const userId = session!.getUserId();
await UserMetadata.clearUserMetadata(userId); return res.response({ success: true }).code(200); },});
import Fastify from "fastify";import { verifySession } from "supertokens-node/recipe/session/framework/fastify";import UserMetadata from "supertokens-node/recipe/usermetadata";
let fastify = Fastify();
fastify.post( "/updateinfo", { preHandler: verifySession(), }, async (req, res) => { const session = req.session; const userId = session!.getUserId();
await UserMetadata.clearUserMetadata(userId); res.send({ success: true }); },);
import { verifySession } from "supertokens-node/recipe/session/framework/awsLambda";import { SessionEvent } from "supertokens-node/framework/awsLambda";import UserMetadata from "supertokens-node/recipe/usermetadata";
async function updateinfo(awsEvent: SessionEvent) { const session = awsEvent.session; const userId = session!.getUserId();
await UserMetadata.clearUserMetadata(userId);
return { body: JSON.stringify({ success: true }), statusCode: 200, };}
exports.handler = verifySession(updateinfo);
import KoaRouter from "koa-router";import { verifySession } from "supertokens-node/recipe/session/framework/koa";import { SessionContext } from "supertokens-node/framework/koa";import UserMetadata from "supertokens-node/recipe/usermetadata";
let router = new KoaRouter();
router.post("/updateinfo", verifySession(), async (ctx: SessionContext, next) => { const session = ctx.session; const userId = session!.getUserId();
await UserMetadata.clearUserMetadata(userId); ctx.body = { success: true };});
import { inject, intercept } from "@loopback/core";import { RestBindings, post, response } from "@loopback/rest";import { verifySession } from "supertokens-node/recipe/session/framework/loopback";import { SessionContext } from "supertokens-node/framework/loopback";import UserMetadata from "supertokens-node/recipe/usermetadata";
class UpdateInfo { constructor(@inject(RestBindings.Http.CONTEXT) private ctx: SessionContext) {} @post("/updateinfo") @intercept(verifySession()) @response(200) async handler() { const session = this.ctx.session; const userId = session!.getUserId();
await UserMetadata.clearUserMetadata(userId); return { success: true }; }}
import { superTokensNextWrapper } from "supertokens-node/nextjs";import { verifySession } from "supertokens-node/recipe/session/framework/express";import { SessionRequest } from "supertokens-node/framework/express";import UserMetadata from "supertokens-node/recipe/usermetadata";
export default async function updateInfo(req: any, res: any) { await superTokensNextWrapper( async (next) => { await verifySession()(req, res, next); }, req, res, ); const session = (req as SessionRequest).session; const userId = session!.getUserId();
await UserMetadata.clearUserMetadata(userId); res.json({ success: true });}
import { Controller, Post, UseGuards, Session } from "@nestjs/common";import { SessionContainer } from "supertokens-node/recipe/session";import UserMetadata from "supertokens-node/recipe/usermetadata";import { AuthGuard } from "./auth/auth.guard";
@Controller()export class ExampleController { @Post("example") @UseGuards(new AuthGuard()) async postExample(@Session() session: SessionContainer): Promise<{ success: boolean }> { const userId = session.getUserId();
// For more information about "AuthGuard" and the "Session" decorator please read our NestJS guide. await UserMetadata.clearUserMetadata(userId); return { success: true }; }}
import "github.com/supertokens/supertokens-golang/recipe/usermetadata"
func main() { userId := "..."
usermetadata.ClearUserMetadata(userId)}
- Asyncio
- Syncio
from supertokens_python.recipe.usermetadata.asyncio import clear_user_metadata
async def some_func(): user_id = "..."
await clear_user_metadata(user_id)
from supertokens_python.recipe.usermetadata.syncio import clear_user_metadata
user_id = "..."
clear_user_metadata(user_id)