{"version":3,"file":"user.mjs","sources":["../../../server/controllers/user.js"],"sourcesContent":["'use strict';\n\n/**\n * User.js controller\n *\n * @description: A set of functions called \"actions\" for managing `User`.\n */\n\nconst _ = require('lodash');\nconst utils = require('@strapi/utils');\nconst { getService } = require('../utils');\nconst { validateCreateUserBody, validateUpdateUserBody } = require('./validation/user');\n\nconst { ApplicationError, ValidationError, NotFoundError } = utils.errors;\n\nconst sanitizeOutput = async (user, ctx) => {\n  const schema = strapi.getModel('plugin::users-permissions.user');\n  const { auth } = ctx.state;\n\n  return strapi.contentAPI.sanitize.output(user, schema, { auth });\n};\n\nconst validateQuery = async (query, ctx) => {\n  const schema = strapi.getModel('plugin::users-permissions.user');\n  const { auth } = ctx.state;\n\n  return strapi.contentAPI.validate.query(query, schema, { auth });\n};\n\nconst sanitizeQuery = async (query, ctx) => {\n  const schema = strapi.getModel('plugin::users-permissions.user');\n  const { auth } = ctx.state;\n\n  return strapi.contentAPI.sanitize.query(query, schema, { auth });\n};\n\nmodule.exports = {\n  /**\n   * Create a/an user record.\n   * @return {Object}\n   */\n  async create(ctx) {\n    const advanced = await strapi\n      .store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })\n      .get();\n\n    await validateCreateUserBody(ctx.request.body);\n\n    const { email, username, role } = ctx.request.body;\n\n    const userWithSameUsername = await strapi.db\n      .query('plugin::users-permissions.user')\n      .findOne({ where: { username } });\n\n    if (userWithSameUsername) {\n      if (!email) throw new ApplicationError('Username already taken');\n    }\n\n    if (advanced.unique_email) {\n      const userWithSameEmail = await strapi.db\n        .query('plugin::users-permissions.user')\n        .findOne({ where: { email: email.toLowerCase() } });\n\n      if (userWithSameEmail) {\n        throw new ApplicationError('Email already taken');\n      }\n    }\n\n    const user = {\n      ...ctx.request.body,\n      email: email.toLowerCase(),\n      provider: 'local',\n    };\n\n    if (!role) {\n      const defaultRole = await strapi.db\n        .query('plugin::users-permissions.role')\n        .findOne({ where: { type: advanced.default_role } });\n\n      user.role = defaultRole.id;\n    }\n\n    try {\n      const data = await getService('user').add(user);\n      const sanitizedData = await sanitizeOutput(data, ctx);\n\n      ctx.created(sanitizedData);\n    } catch (error) {\n      throw new ApplicationError(error.message);\n    }\n  },\n\n  /**\n   * Update a/an user record.\n   * @return {Object}\n   */\n  async update(ctx) {\n    const advancedConfigs = await strapi\n      .store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })\n      .get();\n\n    const { id } = ctx.params;\n    const { email, username, password } = ctx.request.body;\n\n    const user = await getService('user').fetch(id);\n    if (!user) {\n      throw new NotFoundError(`User not found`);\n    }\n\n    await validateUpdateUserBody(ctx.request.body);\n\n    if (user.provider === 'local' && _.has(ctx.request.body, 'password') && !password) {\n      throw new ValidationError('password.notNull');\n    }\n\n    if (_.has(ctx.request.body, 'username')) {\n      const userWithSameUsername = await strapi.db\n        .query('plugin::users-permissions.user')\n        .findOne({ where: { username } });\n\n      if (userWithSameUsername && _.toString(userWithSameUsername.id) !== _.toString(id)) {\n        throw new ApplicationError('Username already taken');\n      }\n    }\n\n    if (_.has(ctx.request.body, 'email') && advancedConfigs.unique_email) {\n      const userWithSameEmail = await strapi.db\n        .query('plugin::users-permissions.user')\n        .findOne({ where: { email: email.toLowerCase() } });\n\n      if (userWithSameEmail && _.toString(userWithSameEmail.id) !== _.toString(id)) {\n        throw new ApplicationError('Email already taken');\n      }\n      ctx.request.body.email = ctx.request.body.email.toLowerCase();\n    }\n\n    const updateData = {\n      ...ctx.request.body,\n    };\n\n    const data = await getService('user').edit(user.id, updateData);\n    const sanitizedData = await sanitizeOutput(data, ctx);\n\n    ctx.send(sanitizedData);\n  },\n\n  /**\n   * Retrieve user records.\n   * @return {Object|Array}\n   */\n  async find(ctx) {\n    await validateQuery(ctx.query, ctx);\n    const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n    const users = await getService('user').fetchAll(sanitizedQuery);\n\n    ctx.body = await Promise.all(users.map((user) => sanitizeOutput(user, ctx)));\n  },\n\n  /**\n   * Retrieve a user record.\n   * @return {Object}\n   */\n  async findOne(ctx) {\n    const { id } = ctx.params;\n    await validateQuery(ctx.query, ctx);\n    const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n    let data = await getService('user').fetch(id, sanitizedQuery);\n\n    if (data) {\n      data = await sanitizeOutput(data, ctx);\n    }\n\n    ctx.body = data;\n  },\n\n  /**\n   * Retrieve user count.\n   * @return {Number}\n   */\n  async count(ctx) {\n    await validateQuery(ctx.query, ctx);\n    const sanitizedQuery = await sanitizeQuery(ctx.query, ctx);\n\n    ctx.body = await getService('user').count(sanitizedQuery);\n  },\n\n  /**\n   * Destroy a/an user record.\n   * @return {Object}\n   */\n  async destroy(ctx) {\n    const { id } = ctx.params;\n\n    const data = await getService('user').remove({ id });\n    const sanitizedUser = await sanitizeOutput(data, ctx);\n\n    ctx.send(sanitizedUser);\n  },\n\n  /**\n   * Retrieve authenticated user.\n   * @return {Object|Array}\n   */\n  async me(ctx) {\n    const authUser = ctx.state.user;\n    const { query } = ctx;\n\n    if (!authUser) {\n      return ctx.unauthorized();\n    }\n\n    await validateQuery(query, ctx);\n    const sanitizedQuery = await sanitizeQuery(query, ctx);\n    const user = await getService('user').fetch(authUser.id, sanitizedQuery);\n\n    ctx.body = await sanitizeOutput(user, ctx);\n  },\n};\n"],"names":["_","require$$0","utils","require$$1","getService","require$$2","validateCreateUserBody","validateUpdateUserBody","require$$3","ApplicationError","ValidationError","NotFoundError","errors","sanitizeOutput","user","ctx","schema","strapi","getModel","auth","state","contentAPI","sanitize","output","validateQuery","query","validate","sanitizeQuery","create","advanced","store","type","name","key","get","request","body","email","username","role","userWithSameUsername","db","findOne","where","unique_email","userWithSameEmail","toLowerCase","provider","defaultRole","default_role","id","data","add","sanitizedData","created","error","message","update","advancedConfigs","params","password","fetch","has","toString","updateData","edit","send","find","sanitizedQuery","users","fetchAll","Promise","all","map","count","destroy","remove","sanitizedUser","me","authUser","unauthorized"],"mappings":"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"}