mirror of
https://github.com/appwrite/appwrite
synced 2026-05-23 17:08:45 +00:00
Merge branch '1.5.x' into fix-templates-copy-hidden-files
This commit is contained in:
commit
00c8774554
49 changed files with 158 additions and 41 deletions
|
|
@ -4,7 +4,7 @@
|
|||
"settings.direction": "ltr",
|
||||
"emails.sender": "El equipo de %s",
|
||||
"emails.verification.subject": "Verificación de cuenta",
|
||||
"emails.verification.hello": "Hola, {{name}}",
|
||||
"emails.verification.hello": "Hola, {{name}}.",
|
||||
"emails.verification.body": "Haz clic en este enlace para verificar tu correo:",
|
||||
"emails.verification.footer": "Si no has solicitado verificar este correo, puedes ignorar este mensaje.",
|
||||
"emails.verification.thanks": "Gracias.",
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
"emails.magicSession.thanks": "Gracias.",
|
||||
"emails.magicSession.signature": "El equipo de {{project}}",
|
||||
"emails.recovery.subject": "Restablecer contraseña",
|
||||
"emails.recovery.hello": "Hola, {{name}}",
|
||||
"emails.recovery.hello": "Hola, {{name}}.",
|
||||
"emails.recovery.body": "Haz clic en este enlace para restablecer la contraseña de {{project}}:",
|
||||
"emails.recovery.footer": "Si no has solicitado restablecer la contraseña, puedes ignorar este mensaje.",
|
||||
"emails.recovery.thanks": "Gracias.",
|
||||
|
|
@ -236,10 +236,10 @@
|
|||
"emails.magicSession.securityPhrase": "La frase de seguridad para este correo electrónico es {{phrase}}. Puedes confiar en este correo electrónico si esta frase coincide con la frase que se muestra durante el inicio de sesión.",
|
||||
"emails.magicSession.optionUrl": "Si no puedes iniciar sesión utilizando el botón anterior, visita el siguiente enlace:",
|
||||
"emails.otpSession.subject": "Inicio de sesión en {{project}}",
|
||||
"emails.otpSession.hello": "Hola,",
|
||||
"emails.otpSession.hello": "Hola",
|
||||
"emails.otpSession.description": "Ingrese el siguiente código de verificación cuando se le solicite para iniciar sesión de forma segura en su cuenta de {{project}}. Expirará en 15 minutos.",
|
||||
"emails.otpSession.clientInfo": "Este inicio de sesión fue solicitado usando {{agentClient}} en {{agentDevice}} {{agentOs}}. Si no solicitaste el inicio de sesión, puedes ignorar este correo electrónico de forma segura.",
|
||||
"emails.otpSession.securityPhrase": "La frase de seguridad para este correo electrónico es {{phrase}}. Puedes confiar en este correo si esta frase coincide con la frase mostrada durante el inicio de sesión.",
|
||||
"emails.otpSession.thanks": "Gracias,",
|
||||
"emails.otpSession.signature": "equipo {{project}}"
|
||||
}
|
||||
"emails.otpSession.thanks": "Gracias.",
|
||||
"emails.otpSession.signature": "El equipo de {{project}}"
|
||||
}
|
||||
|
|
|
|||
1
app/config/specs/open-api3-1.5.x-client.json
Normal file
1
app/config/specs/open-api3-1.5.x-client.json
Normal file
File diff suppressed because one or more lines are too long
1
app/config/specs/open-api3-1.5.x-console.json
Normal file
1
app/config/specs/open-api3-1.5.x-console.json
Normal file
File diff suppressed because one or more lines are too long
1
app/config/specs/open-api3-1.5.x-server.json
Normal file
1
app/config/specs/open-api3-1.5.x-server.json
Normal file
File diff suppressed because one or more lines are too long
1
app/config/specs/swagger2-1.5.x-client.json
Normal file
1
app/config/specs/swagger2-1.5.x-client.json
Normal file
File diff suppressed because one or more lines are too long
1
app/config/specs/swagger2-1.5.x-console.json
Normal file
1
app/config/specs/swagger2-1.5.x-console.json
Normal file
File diff suppressed because one or more lines are too long
1
app/config/specs/swagger2-1.5.x-server.json
Normal file
1
app/config/specs/swagger2-1.5.x-server.json
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
|||
Subproject commit c72ba12e479b0d3d9b3f4e48e01625c12a38fd7f
|
||||
Subproject commit f196bcfb485adfb36324aabf32a3449471319bbd
|
||||
|
|
@ -2700,7 +2700,7 @@ App::delete('/v1/account/sessions/:sessionId')
|
|||
});
|
||||
|
||||
App::patch('/v1/account/sessions/:sessionId')
|
||||
->desc('Update (or renew) a session')
|
||||
->desc('Update (or renew) session')
|
||||
->groups(['api', 'account'])
|
||||
->label('scope', 'account')
|
||||
->label('event', 'users.[userId].sessions.[sessionId].update')
|
||||
|
|
@ -2994,7 +2994,7 @@ App::post('/v1/account/recovery')
|
|||
|
||||
$queueForMails
|
||||
->setRecipient($profile->getAttribute('email', ''))
|
||||
->setName($profile->getAttribute('name'))
|
||||
->setName($profile->getAttribute('name', ''))
|
||||
->setBody($body)
|
||||
->setVariables($emailVariables)
|
||||
->setSubject($subject)
|
||||
|
|
@ -4024,7 +4024,7 @@ App::delete('/v1/account')
|
|||
});
|
||||
|
||||
App::post('/v1/account/targets/push')
|
||||
->desc('Create a push target')
|
||||
->desc('Create push target')
|
||||
->groups(['api', 'account'])
|
||||
->label('scope', 'targets.write')
|
||||
->label('audits.event', 'target.create')
|
||||
|
|
@ -4097,7 +4097,7 @@ App::post('/v1/account/targets/push')
|
|||
});
|
||||
|
||||
App::put('/v1/account/targets/:targetId/push')
|
||||
->desc('Update a push target')
|
||||
->desc('Update push target')
|
||||
->groups(['api', 'account'])
|
||||
->label('scope', 'targets.write')
|
||||
->label('audits.event', 'target.update')
|
||||
|
|
@ -4152,7 +4152,7 @@ App::put('/v1/account/targets/:targetId/push')
|
|||
});
|
||||
|
||||
App::delete('/v1/account/targets/:targetId/push')
|
||||
->desc('Delete a push target')
|
||||
->desc('Delete push target')
|
||||
->groups(['api', 'account'])
|
||||
->label('scope', 'targets.write')
|
||||
->label('audits.event', 'target.delete')
|
||||
|
|
|
|||
|
|
@ -2404,7 +2404,7 @@ App::post('/v1/databases/:databaseId/collections/:collectionId/indexes')
|
|||
->param('databaseId', '', new UID(), 'Database ID.')
|
||||
->param('collectionId', '', new UID(), 'Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection).')
|
||||
->param('key', null, new Key(), 'Index Key.')
|
||||
->param('type', null, new WhiteList([Database::INDEX_KEY, Database::INDEX_FULLTEXT, Database::INDEX_UNIQUE, Database::INDEX_SPATIAL]), 'Index type.')
|
||||
->param('type', null, new WhiteList([Database::INDEX_KEY, Database::INDEX_FULLTEXT, Database::INDEX_UNIQUE]), 'Index type.')
|
||||
->param('attributes', null, new ArrayList(new Key(true), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of attributes to index. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' attributes are allowed, each 32 characters long.')
|
||||
->param('orders', [], new ArrayList(new WhiteList(['ASC', 'DESC'], false, Database::VAR_STRING), APP_LIMIT_ARRAY_PARAMS_SIZE), 'Array of index orders. Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' orders are allowed.', true)
|
||||
->inject('response')
|
||||
|
|
@ -3090,6 +3090,33 @@ App::get('/v1/databases/:databaseId/collections/:collectionId/documents')
|
|||
$processDocument($collection, $document);
|
||||
}
|
||||
|
||||
$select = \array_reduce($queries, function ($result, $query) {
|
||||
return $result || ($query->getMethod() === Query::TYPE_SELECT);
|
||||
}, false);
|
||||
|
||||
// Check if the SELECT query includes $databaseId and $collectionId
|
||||
$hasDatabaseId = false;
|
||||
$hasCollectionId = false;
|
||||
if ($select) {
|
||||
$hasDatabaseId = \array_reduce($queries, function ($result, $query) {
|
||||
return $result || ($query->getMethod() === Query::TYPE_SELECT && \in_array('$databaseId', $query->getValues()));
|
||||
}, false);
|
||||
$hasCollectionId = \array_reduce($queries, function ($result, $query) {
|
||||
return $result || ($query->getMethod() === Query::TYPE_SELECT && \in_array('$collectionId', $query->getValues()));
|
||||
}, false);
|
||||
}
|
||||
|
||||
if ($select) {
|
||||
foreach ($documents as $document) {
|
||||
if (!$hasDatabaseId) {
|
||||
$document->removeAttribute('$databaseId');
|
||||
}
|
||||
if (!$hasCollectionId) {
|
||||
$document->removeAttribute('$collectionId');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$response->dynamic(new Document([
|
||||
'total' => $total,
|
||||
'documents' => $documents,
|
||||
|
|
@ -3635,7 +3662,7 @@ App::delete('/v1/databases/:databaseId/collections/:collectionId/documents/:docu
|
|||
});
|
||||
|
||||
App::get('/v1/databases/usage')
|
||||
->desc('Get usage stats for the database')
|
||||
->desc('Get databases usage stats')
|
||||
->groups(['api', 'database', 'usage'])
|
||||
->label('scope', 'collections.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
@ -3713,7 +3740,7 @@ App::get('/v1/databases/usage')
|
|||
});
|
||||
|
||||
App::get('/v1/databases/:databaseId/usage')
|
||||
->desc('Get usage stats for the database')
|
||||
->desc('Get database usage stats')
|
||||
->groups(['api', 'database', 'usage'])
|
||||
->label('scope', 'collections.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
@ -3797,7 +3824,7 @@ App::get('/v1/databases/:databaseId/usage')
|
|||
|
||||
App::get('/v1/databases/:databaseId/collections/:collectionId/usage')
|
||||
->alias('/v1/database/:collectionId/usage', ['databaseId' => 'default'])
|
||||
->desc('Get usage stats for a collection')
|
||||
->desc('Get collection usage stats')
|
||||
->groups(['api', 'database', 'usage'])
|
||||
->label('scope', 'collections.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ App::post('/v1/messaging/providers/sendgrid')
|
|||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
|
||||
->label('sdk.namespace', 'messaging')
|
||||
->label('sdk.method', 'createSendgridProvider')
|
||||
->label('sdk.description', '/docs/references/messaging/create-sengrid-provider.md')
|
||||
->label('sdk.description', '/docs/references/messaging/create-sendgrid-provider.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_CREATED)
|
||||
->label('sdk.response.type', Response::CONTENT_TYPE_JSON)
|
||||
->label('sdk.response.model', Response::MODEL_PROVIDER)
|
||||
|
|
@ -1924,7 +1924,7 @@ App::delete('/v1/messaging/providers/:providerId')
|
|||
});
|
||||
|
||||
App::post('/v1/messaging/topics')
|
||||
->desc('Create a topic')
|
||||
->desc('Create topic')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('audits.event', 'topic.create')
|
||||
->label('audits.resource', 'topic/{response.$id}')
|
||||
|
|
@ -2107,7 +2107,7 @@ App::get('/v1/messaging/topics/:topicId/logs')
|
|||
});
|
||||
|
||||
App::get('/v1/messaging/topics/:topicId')
|
||||
->desc('Get a topic')
|
||||
->desc('Get topic')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('scope', 'topics.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
|
||||
|
|
@ -2134,7 +2134,7 @@ App::get('/v1/messaging/topics/:topicId')
|
|||
});
|
||||
|
||||
App::patch('/v1/messaging/topics/:topicId')
|
||||
->desc('Update a topic')
|
||||
->desc('Update topic')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('audits.event', 'topic.update')
|
||||
->label('audits.resource', 'topic/{response.$id}')
|
||||
|
|
@ -2178,7 +2178,7 @@ App::patch('/v1/messaging/topics/:topicId')
|
|||
});
|
||||
|
||||
App::delete('/v1/messaging/topics/:topicId')
|
||||
->desc('Delete a topic')
|
||||
->desc('Delete topic')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('audits.event', 'topic.delete')
|
||||
->label('audits.resource', 'topic/{request.$topicId}')
|
||||
|
|
@ -2218,7 +2218,7 @@ App::delete('/v1/messaging/topics/:topicId')
|
|||
});
|
||||
|
||||
App::post('/v1/messaging/topics/:topicId/subscribers')
|
||||
->desc('Create a subscriber')
|
||||
->desc('Create subscriber')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('audits.event', 'subscriber.create')
|
||||
->label('audits.resource', 'subscriber/{response.$id}')
|
||||
|
|
@ -2477,7 +2477,7 @@ App::get('/v1/messaging/subscribers/:subscriberId/logs')
|
|||
});
|
||||
|
||||
App::get('/v1/messaging/topics/:topicId/subscribers/:subscriberId')
|
||||
->desc('Get a subscriber')
|
||||
->desc('Get subscriber')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('scope', 'subscribers.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
|
||||
|
|
@ -2516,7 +2516,7 @@ App::get('/v1/messaging/topics/:topicId/subscribers/:subscriberId')
|
|||
});
|
||||
|
||||
App::delete('/v1/messaging/topics/:topicId/subscribers/:subscriberId')
|
||||
->desc('Delete a subscriber')
|
||||
->desc('Delete subscriber')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('audits.event', 'subscriber.delete')
|
||||
->label('audits.resource', 'subscriber/{request.$subscriberId}')
|
||||
|
|
@ -2575,7 +2575,7 @@ App::delete('/v1/messaging/topics/:topicId/subscribers/:subscriberId')
|
|||
});
|
||||
|
||||
App::post('/v1/messaging/messages/email')
|
||||
->desc('Create an email')
|
||||
->desc('Create email')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('audits.event', 'message.create')
|
||||
->label('audits.resource', 'message/{response.$id}')
|
||||
|
|
@ -2719,7 +2719,7 @@ App::post('/v1/messaging/messages/email')
|
|||
});
|
||||
|
||||
App::post('/v1/messaging/messages/sms')
|
||||
->desc('Create an SMS')
|
||||
->desc('Create SMS')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('audits.event', 'message.create')
|
||||
->label('audits.resource', 'message/{response.$id}')
|
||||
|
|
@ -2827,7 +2827,7 @@ App::post('/v1/messaging/messages/sms')
|
|||
});
|
||||
|
||||
App::post('/v1/messaging/messages/push')
|
||||
->desc('Create a push notification')
|
||||
->desc('Create push notification')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('audits.event', 'message.create')
|
||||
->label('audits.resource', 'message/{response.$id}')
|
||||
|
|
@ -3190,7 +3190,7 @@ App::get('/v1/messaging/messages/:messageId/targets')
|
|||
});
|
||||
|
||||
App::get('/v1/messaging/messages/:messageId')
|
||||
->desc('Get a message')
|
||||
->desc('Get message')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('scope', 'messages.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN, APP_AUTH_TYPE_KEY])
|
||||
|
|
@ -3214,7 +3214,7 @@ App::get('/v1/messaging/messages/:messageId')
|
|||
});
|
||||
|
||||
App::patch('/v1/messaging/messages/email/:messageId')
|
||||
->desc('Update an email')
|
||||
->desc('Update email')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('audits.event', 'message.update')
|
||||
->label('audits.resource', 'message/{response.$id}')
|
||||
|
|
@ -3352,7 +3352,7 @@ App::patch('/v1/messaging/messages/email/:messageId')
|
|||
});
|
||||
|
||||
App::patch('/v1/messaging/messages/sms/:messageId')
|
||||
->desc('Update an SMS')
|
||||
->desc('Update SMS')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('audits.event', 'message.update')
|
||||
->label('audits.resource', 'message/{response.$id}')
|
||||
|
|
@ -3470,7 +3470,7 @@ App::patch('/v1/messaging/messages/sms/:messageId')
|
|||
});
|
||||
|
||||
App::patch('/v1/messaging/messages/push/:messageId')
|
||||
->desc('Update a push notification')
|
||||
->desc('Update push notification')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('audits.event', 'message.update')
|
||||
->label('audits.resource', 'message/{response.$id}')
|
||||
|
|
@ -3661,7 +3661,7 @@ App::patch('/v1/messaging/messages/push/:messageId')
|
|||
});
|
||||
|
||||
App::delete('/v1/messaging/messages/:messageId')
|
||||
->desc('Delete a message')
|
||||
->desc('Delete message')
|
||||
->groups(['api', 'messaging'])
|
||||
->label('audits.event', 'message.delete')
|
||||
->label('audits.resource', 'message/{request.route.messageId}')
|
||||
|
|
|
|||
|
|
@ -1038,7 +1038,7 @@ App::delete('/v1/migrations/:migrationId')
|
|||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
->label('sdk.namespace', 'migrations')
|
||||
->label('sdk.method', 'delete')
|
||||
->label('sdk.description', '/docs/references/functions/delete-migration.md')
|
||||
->label('sdk.description', '/docs/references/migrations/delete-migration.md')
|
||||
->label('sdk.response.code', Response::STATUS_CODE_NOCONTENT)
|
||||
->label('sdk.response.model', Response::MODEL_NONE)
|
||||
->param('migrationId', '', new UID(), 'Migration ID.')
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ use Utopia\Validator\Text;
|
|||
use Utopia\Validator\WhiteList;
|
||||
|
||||
App::get('/v1/project/usage')
|
||||
->desc('Get usage stats for a project')
|
||||
->desc('Get project usage stats')
|
||||
->groups(['api', 'usage'])
|
||||
->label('scope', 'projects.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
|
|||
|
|
@ -1514,7 +1514,7 @@ App::delete('/v1/storage/buckets/:bucketId/files/:fileId')
|
|||
});
|
||||
|
||||
App::get('/v1/storage/usage')
|
||||
->desc('Get usage stats for storage')
|
||||
->desc('Get storage usage stats')
|
||||
->groups(['api', 'storage'])
|
||||
->label('scope', 'files.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
@ -1593,7 +1593,7 @@ App::get('/v1/storage/usage')
|
|||
});
|
||||
|
||||
App::get('/v1/storage/:bucketId/usage')
|
||||
->desc('Get usage stats for storage bucket')
|
||||
->desc('Get bucket usage stats')
|
||||
->groups(['api', 'storage'])
|
||||
->label('scope', 'files.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
|
|||
|
|
@ -756,8 +756,20 @@ App::get('/v1/teams/:teamId/memberships')
|
|||
$memberships = array_map(function ($membership) use ($dbForProject, $team) {
|
||||
$user = $dbForProject->getDocument('users', $membership->getAttribute('userId'));
|
||||
|
||||
$mfa = $user->getAttribute('mfa', false);
|
||||
|
||||
if ($mfa) {
|
||||
$totpEnabled = $user->getAttribute('totp', false) && $user->getAttribute('totpVerification', false);
|
||||
$emailEnabled = $user->getAttribute('email', false) && $user->getAttribute('emailVerification', false);
|
||||
$phoneEnabled = $user->getAttribute('phone', false) && $user->getAttribute('phoneVerification', false);
|
||||
|
||||
if (!$totpEnabled && !$emailEnabled && !$phoneEnabled) {
|
||||
$mfa = false;
|
||||
}
|
||||
}
|
||||
|
||||
$membership
|
||||
->setAttribute('mfa', $user->getAttribute('mfa'))
|
||||
->setAttribute('mfa', $mfa)
|
||||
->setAttribute('teamName', $team->getAttribute('name'))
|
||||
->setAttribute('userName', $user->getAttribute('name'))
|
||||
->setAttribute('userEmail', $user->getAttribute('email'))
|
||||
|
|
@ -805,7 +817,20 @@ App::get('/v1/teams/:teamId/memberships/:membershipId')
|
|||
|
||||
$user = $dbForProject->getDocument('users', $membership->getAttribute('userId'));
|
||||
|
||||
$mfa = $user->getAttribute('mfa', false);
|
||||
|
||||
if ($mfa) {
|
||||
$totpEnabled = $user->getAttribute('totp', false) && $user->getAttribute('totpVerification', false);
|
||||
$emailEnabled = $user->getAttribute('email', false) && $user->getAttribute('emailVerification', false);
|
||||
$phoneEnabled = $user->getAttribute('phone', false) && $user->getAttribute('phoneVerification', false);
|
||||
|
||||
if (!$totpEnabled && !$emailEnabled && !$phoneEnabled) {
|
||||
$mfa = false;
|
||||
}
|
||||
}
|
||||
|
||||
$membership
|
||||
->setAttribute('mfa', $mfa)
|
||||
->setAttribute('teamName', $team->getAttribute('name'))
|
||||
->setAttribute('userName', $user->getAttribute('name'))
|
||||
->setAttribute('userEmail', $user->getAttribute('email'))
|
||||
|
|
|
|||
|
|
@ -71,7 +71,14 @@ function createUser(string $hash, mixed $hashOptions, string $userId, ?string $e
|
|||
: ID::custom($userId);
|
||||
|
||||
if ($project->getAttribute('auths', [])['personalDataCheck'] ?? false) {
|
||||
$personalDataValidator = new PersonalData($userId, $email, $name, $phone);
|
||||
$personalDataValidator = new PersonalData(
|
||||
$userId,
|
||||
$email,
|
||||
$name,
|
||||
$phone,
|
||||
strict: false,
|
||||
allowEmpty: true
|
||||
);
|
||||
if (!$personalDataValidator->isValid($plaintextPassword)) {
|
||||
throw new Exception(Exception::USER_PASSWORD_PERSONAL_DATA);
|
||||
}
|
||||
|
|
@ -1968,7 +1975,7 @@ App::delete('/v1/users/identities/:identityId')
|
|||
});
|
||||
|
||||
App::get('/v1/users/usage')
|
||||
->desc('Get usage stats for the users API')
|
||||
->desc('Get users usage stats')
|
||||
->groups(['api', 'users'])
|
||||
->label('scope', 'users.read')
|
||||
->label('sdk.auth', [APP_AUTH_TYPE_ADMIN])
|
||||
|
|
|
|||
1
docs/references/account/add-authenticator.md
Normal file
1
docs/references/account/add-authenticator.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Add an authenticator app to be used as an MFA factor. Verify the authenticator using the [verify authenticator](/docs/references/cloud/client-web/account#verifyAuthenticator) method.
|
||||
1
docs/references/account/create-2fa-challenge.md
Normal file
1
docs/references/account/create-2fa-challenge.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Initialize an MFA challenge of the specified factor. The factor must be available on the account.
|
||||
1
docs/references/account/delete-mfa.md
Normal file
1
docs/references/account/delete-mfa.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Delete an authenticator for a user by ID.
|
||||
1
docs/references/account/list-factors.md
Normal file
1
docs/references/account/list-factors.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
List the factors available on the account to be used as a MFA challange.
|
||||
1
docs/references/account/update-challenge.md
Normal file
1
docs/references/account/update-challenge.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Complete the MFA challenge by providing the one-time password.
|
||||
1
docs/references/account/update-mfa.md
Normal file
1
docs/references/account/update-mfa.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Enable or disable MFA on an account.
|
||||
1
docs/references/account/verify-authenticator.md
Normal file
1
docs/references/account/verify-authenticator.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Verify an authenticator app after adding it using the [add authenticator](/docs/references/cloud/client-web/account#addAuthenticator) method.
|
||||
1
docs/references/databases/create-attribute-enum.md
Normal file
1
docs/references/databases/create-attribute-enum.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Create an enumeration attribute. The `elements` param acts as a white-list of accepted values for this attribute.
|
||||
1
docs/references/databases/create-datetime-attribute.md
Normal file
1
docs/references/databases/create-datetime-attribute.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Create a date time attribute according to the ISO 8601 standard.
|
||||
2
docs/references/databases/create-index.md
Normal file
2
docs/references/databases/create-index.md
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
Creates an index on the attributes listed. Your index should include all the attributes you will query in a single request.
|
||||
Attributes can be `key`, `fulltext`, and `unique`.
|
||||
1
docs/references/databases/delete-attribute.md
Normal file
1
docs/references/databases/delete-attribute.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Deletes an attribute.
|
||||
1
docs/references/databases/delete-index.md
Normal file
1
docs/references/databases/delete-index.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Delete an index.
|
||||
1
docs/references/databases/get-attribute.md
Normal file
1
docs/references/databases/get-attribute.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Get attribute by ID.
|
||||
1
docs/references/databases/get-index.md
Normal file
1
docs/references/databases/get-index.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Get index by ID.
|
||||
1
docs/references/databases/list-attributes.md
Normal file
1
docs/references/databases/list-attributes.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
List attributes in the collection.
|
||||
1
docs/references/databases/list-indexes.md
Normal file
1
docs/references/databases/list-indexes.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
List indexes in the collection.
|
||||
1
docs/references/databases/update-boolean-attribute.md
Normal file
1
docs/references/databases/update-boolean-attribute.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Update a boolean attribute. Changing the `default` value will not update already existing documents.
|
||||
1
docs/references/databases/update-datetime-attribute.md
Normal file
1
docs/references/databases/update-datetime-attribute.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Update a date time attribute. Changing the `default` value will not update already existing documents.
|
||||
1
docs/references/health/get-queue-functions.md
Normal file
1
docs/references/health/get-queue-functions.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Get the number of function executions that are waiting to be processed in the Appwrite internal queue server.
|
||||
1
docs/references/messaging/delete-message.md
Normal file
1
docs/references/messaging/delete-message.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Delete a message. If the message is not a draft or scheduled, but has been sent, this will not recall the message.
|
||||
1
docs/references/users/create-target.md
Normal file
1
docs/references/users/create-target.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Create a messaging target.
|
||||
1
docs/references/users/delete-mfa.md
Normal file
1
docs/references/users/delete-mfa.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Delete an authenticator app.
|
||||
1
docs/references/users/delete-target.md
Normal file
1
docs/references/users/delete-target.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Delete a messaging target.
|
||||
1
docs/references/users/get-user-target.md
Normal file
1
docs/references/users/get-user-target.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Get a user's push notification target by ID.
|
||||
1
docs/references/users/list-factors.md
Normal file
1
docs/references/users/list-factors.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
List the factors available on the account to be used as a MFA challange.
|
||||
1
docs/references/users/list-user-targets.md
Normal file
1
docs/references/users/list-user-targets.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
List the messaging targets that are associated with a user.
|
||||
1
docs/references/users/update-target.md
Normal file
1
docs/references/users/update-target.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Update a messaging target.
|
||||
1
docs/references/users/update-user-mfa.md
Normal file
1
docs/references/users/update-user-mfa.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Enable or disable MFA on a user account.
|
||||
|
|
@ -12,9 +12,10 @@ class PersonalData extends Password
|
|||
protected ?string $email = null,
|
||||
protected ?string $name = null,
|
||||
protected ?string $phone = null,
|
||||
protected bool $strict = false
|
||||
protected bool $strict = false,
|
||||
protected bool $allowEmpty = false,
|
||||
) {
|
||||
parent::__construct();
|
||||
parent::__construct($allowEmpty);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -4532,6 +4532,8 @@ trait DatabasesBase
|
|||
$this->assertEquals(2, count($response['body']['documents']));
|
||||
$this->assertEquals(null, $response['body']['documents'][0]['fullName']);
|
||||
$this->assertArrayNotHasKey("libraries", $response['body']['documents'][0]);
|
||||
$this->assertArrayNotHasKey('$databaseId', $response['body']['documents'][0]);
|
||||
$this->assertArrayNotHasKey('$collectionId', $response['body']['documents'][0]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -4551,6 +4553,8 @@ trait DatabasesBase
|
|||
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertArrayNotHasKey('libraries', $response['body']['documents'][0]);
|
||||
$this->assertArrayNotHasKey('$databaseId', $response['body']['documents'][0]);
|
||||
$this->assertArrayNotHasKey('$collectionId', $response['body']['documents'][0]);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_GET, '/databases/' . $data['databaseId'] . '/collections/' . $data['personCollection'] . '/documents', array_merge([
|
||||
'content-type' => 'application/json',
|
||||
|
|
@ -4563,6 +4567,8 @@ trait DatabasesBase
|
|||
$document = $response['body']['documents'][0];
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertArrayHasKey('libraries', $document);
|
||||
$this->assertArrayNotHasKey('$databaseId', $document);
|
||||
$this->assertArrayNotHasKey('$collectionId', $document);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_GET, '/databases/' . $data['databaseId'] . '/collections/' . $data['personCollection'] . '/documents/' . $document['$id'], array_merge([
|
||||
'content-type' => 'application/json',
|
||||
|
|
|
|||
|
|
@ -1731,6 +1731,19 @@ class ProjectsConsoleClientTest extends Scope
|
|||
|
||||
$this->assertEquals(201, $response['headers']['status-code']);
|
||||
|
||||
$response = $this->client->call(Client::METHOD_POST, '/users', array_merge($this->getHeaders(), [
|
||||
'content-type' => 'application/json',
|
||||
'x-appwrite-project' => $id,
|
||||
'x-appwrite-mode' => 'admin',
|
||||
]), [
|
||||
// Empty password
|
||||
'email' => uniqid() . 'user@localhost.test',
|
||||
'name' => 'User',
|
||||
'userId' => ID::unique(),
|
||||
]);
|
||||
|
||||
$this->assertEquals(201, $response['headers']['status-code']);
|
||||
|
||||
$email = uniqid() . 'user@localhost.test';
|
||||
$userId = ID::unique();
|
||||
$response = $this->client->call(Client::METHOD_POST, '/users', array_merge($this->getHeaders(), [
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ trait TeamsBaseClient
|
|||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertIsInt($response['body']['total']);
|
||||
$this->assertNotEmpty($response['body']['memberships'][0]['$id']);
|
||||
$this->assertFalse($response['body']['memberships'][0]['mfa']);
|
||||
$this->assertEquals($this->getUser()['name'], $response['body']['memberships'][0]['userName']);
|
||||
$this->assertEquals($this->getUser()['email'], $response['body']['memberships'][0]['userEmail']);
|
||||
$this->assertEquals($teamName, $response['body']['memberships'][0]['teamName']);
|
||||
|
|
@ -155,6 +156,7 @@ trait TeamsBaseClient
|
|||
|
||||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertNotEmpty($response['body']['$id']);
|
||||
$this->assertFalse($response['body']['mfa']);
|
||||
$this->assertNotEmpty($response['body']['userId']);
|
||||
$this->assertNotEmpty($response['body']['userName']);
|
||||
$this->assertNotEmpty($response['body']['userEmail']);
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ trait TeamsBaseServer
|
|||
$this->assertEquals(200, $response['headers']['status-code']);
|
||||
$this->assertNotEmpty($response['body']['$id']);
|
||||
$this->assertNotEmpty($response['body']['userId']);
|
||||
$this->assertFalse($response['body']['mfa']);
|
||||
$this->assertNotEmpty($response['body']['userName']);
|
||||
$this->assertNotEmpty($response['body']['userEmail']);
|
||||
$this->assertNotEmpty($response['body']['teamId']);
|
||||
|
|
|
|||
Loading…
Reference in a new issue