mirror of
https://github.com/flarum/core.git
synced 2025-07-16 14:26:25 +02:00
Merge remote-tracking branch 'extensions_nicknames/REWRITE'
This commit is contained in:
19
extensions/nicknames/.editorconfig
Normal file
19
extensions/nicknames/.editorconfig
Normal file
@ -0,0 +1,19 @@
|
||||
# EditorConfig helps developers define and maintain consistent
|
||||
# coding styles between different editors and IDEs
|
||||
# editorconfig.org
|
||||
|
||||
root = true
|
||||
|
||||
[*]
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.{diff,md}]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.{php,xml,json}]
|
||||
indent_size = 4
|
18
extensions/nicknames/.gitattributes
vendored
Normal file
18
extensions/nicknames/.gitattributes
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
.gitattributes export-ignore
|
||||
.gitignore export-ignore
|
||||
.gitmodules export-ignore
|
||||
.github export-ignore
|
||||
.travis export-ignore
|
||||
.travis.yml export-ignore
|
||||
.editorconfig export-ignore
|
||||
.styleci.yml export-ignore
|
||||
|
||||
phpunit.xml export-ignore
|
||||
tests export-ignore
|
||||
|
||||
js/dist/* -diff
|
||||
js/dist/* linguist-generated
|
||||
js/dist-typings/* linguist-generated
|
||||
js/yarn.lock -diff
|
||||
|
||||
* text=auto eol=lf
|
15
extensions/nicknames/.github/workflows/backend.yml
vendored
Normal file
15
extensions/nicknames/.github/workflows/backend.yml
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
name: Nicknames PHP
|
||||
|
||||
on: [workflow_dispatch, push, pull_request]
|
||||
|
||||
# The reusable workflow definitions will be moved to the `flarum/framework` repo soon.
|
||||
# This will break your current script.
|
||||
# When this happens, run `flarum-cli audit infra --fix` to update your infrastructure.
|
||||
|
||||
jobs:
|
||||
run:
|
||||
uses: flarum/.github/.github/workflows/REUSABLE_backend.yml@main
|
||||
with:
|
||||
enable_backend_testing: true
|
||||
|
||||
backend_directory: .
|
21
extensions/nicknames/.github/workflows/frontend.yml
vendored
Executable file
21
extensions/nicknames/.github/workflows/frontend.yml
vendored
Executable file
@ -0,0 +1,21 @@
|
||||
name: Nicknames JS
|
||||
|
||||
on: [workflow_dispatch, push, pull_request]
|
||||
|
||||
# The reusable workflow definitions will be moved to the `flarum/framework` repo soon.
|
||||
# This will break your current script.
|
||||
# When this happens, run `flarum-cli audit infra --fix` to update your infrastructure.
|
||||
|
||||
jobs:
|
||||
run:
|
||||
uses: flarum/.github/.github/workflows/REUSABLE_frontend.yml@main
|
||||
with:
|
||||
enable_bundlewatch: false
|
||||
enable_prettier: true
|
||||
enable_typescript: false
|
||||
|
||||
frontend_directory: ./js
|
||||
main_git_branch: master
|
||||
|
||||
secrets:
|
||||
bundlewatch_github_token: ${{ secrets.BUNDLEWATCH_GITHUB_TOKEN }}
|
12
extensions/nicknames/.gitignore
vendored
Normal file
12
extensions/nicknames/.gitignore
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
/vendor
|
||||
composer.lock
|
||||
composer.phar
|
||||
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
tests/.phpunit.result.cache
|
||||
/tests/integration/tmp
|
||||
.vagrant
|
||||
.idea/*
|
||||
.vscode
|
||||
js/coverage-ts
|
14
extensions/nicknames/.styleci.yml
Normal file
14
extensions/nicknames/.styleci.yml
Normal file
@ -0,0 +1,14 @@
|
||||
preset: recommended
|
||||
|
||||
enabled:
|
||||
- logical_not_operators_with_successor_space
|
||||
|
||||
disabled:
|
||||
- align_double_arrow
|
||||
- blank_line_after_opening_tag
|
||||
- multiline_array_trailing_comma
|
||||
- new_with_braces
|
||||
- phpdoc_align
|
||||
- phpdoc_order
|
||||
- phpdoc_separation
|
||||
- phpdoc_types
|
35
extensions/nicknames/CHANGELOG.md
Normal file
35
extensions/nicknames/CHANGELOG.md
Normal file
@ -0,0 +1,35 @@
|
||||
# Changelog
|
||||
|
||||
## [1.2.0](https://github.com/flarum/nicknames/compare/v1.1.0...v1.2.0)
|
||||
|
||||
### Added
|
||||
- Prompt for nickname on registration (https://github.com/flarum/nicknames/pull/4).
|
||||
|
||||
## [1.1.0](https://github.com/flarum/nicknames/compare/v1.0.0...v1.1.0)
|
||||
|
||||
No changes.
|
||||
|
||||
## [1.0.0](https://github.com/flarum/nicknames/compare/v0.1.0-beta.16.1...v1.0.0)
|
||||
|
||||
### Changed
|
||||
- Compatibility with Flarum v1.0.0.
|
||||
|
||||
## [0.1.0-beta.16.1](https://github.com/flarum/nicknames/compare/v0.1.0-beta.16...v0.1.0-beta.16.1)
|
||||
|
||||
- Update for beta 16 search API changes
|
||||
|
||||
## [0.1.0-beta.16](https://github.com/flarum/nicknames/compare/v0.1.0-beta.15...v0.1.0-beta.16)
|
||||
|
||||
### Changed
|
||||
- Moved locale files from translation pack to extension (https://github.com/flarum/nicknames/pull/3)
|
||||
|
||||
## [0.1.0-beta.15](https://github.com/flarum/nicknames/compare/f139899d706e174128f5e07bcec78ba275181b73...v0.1.0-beta.15)
|
||||
|
||||
### Added
|
||||
- First release.
|
||||
|
||||
### Changed
|
||||
- Updated composer.json and admin javascript for new admin area.
|
||||
|
||||
### Fixed
|
||||
- Usernames can take the value of nicknames (#1)
|
21
extensions/nicknames/LICENSE
Normal file
21
extensions/nicknames/LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2020-2021 Stichting Flarum (Flarum Foundation)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
79
extensions/nicknames/composer.json
Normal file
79
extensions/nicknames/composer.json
Normal file
@ -0,0 +1,79 @@
|
||||
{
|
||||
"name": "flarum/nicknames",
|
||||
"description": "Allow users to set nicknames.",
|
||||
"type": "flarum-extension",
|
||||
"keywords": [
|
||||
"nicknames"
|
||||
],
|
||||
"license": "MIT",
|
||||
"support": {
|
||||
"issues": "https://github.com/flarum/core/issues",
|
||||
"source": "https://github.com/flarum/nicknames",
|
||||
"forum": "https://discuss.flarum.org"
|
||||
},
|
||||
"homepage": "https://flarum.org",
|
||||
"funding": [
|
||||
{
|
||||
"type": "website",
|
||||
"url": "https://flarum.org/donate/"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"flarum/core": "^1.2"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Flarum\\Nicknames\\": "src/"
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.x-dev"
|
||||
},
|
||||
"flarum-extension": {
|
||||
"title": "Nicknames",
|
||||
"category": "feature",
|
||||
"icon": {
|
||||
"name": "fas fa-user-tag",
|
||||
"backgroundColor": "#8E4529",
|
||||
"color": "#ffffff"
|
||||
}
|
||||
},
|
||||
"flarum-cli": {
|
||||
"modules": {
|
||||
"admin": true,
|
||||
"forum": true,
|
||||
"js": true,
|
||||
"jsCommon": false,
|
||||
"css": false,
|
||||
"gitConf": true,
|
||||
"githubActions": true,
|
||||
"prettier": true,
|
||||
"typescript": false,
|
||||
"bundlewatch": false,
|
||||
"backendTesting": true,
|
||||
"editorConfig": true,
|
||||
"styleci": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"test": [
|
||||
"@test:unit",
|
||||
"@test:integration"
|
||||
],
|
||||
"test:unit": "phpunit -c tests/phpunit.unit.xml",
|
||||
"test:integration": "phpunit -c tests/phpunit.integration.xml",
|
||||
"test:setup": "@php tests/integration/setup.php"
|
||||
},
|
||||
"require-dev": {
|
||||
"flarum/testing": "^1.0.0",
|
||||
"flarum/core": "1.x-dev"
|
||||
},
|
||||
"scripts-descriptions": {
|
||||
"test": "Runs all tests.",
|
||||
"test:unit": "Runs all unit tests.",
|
||||
"test:integration": "Runs all integration tests.",
|
||||
"test:setup": "Sets up a database for use with integration tests. Execute this only once."
|
||||
}
|
||||
}
|
58
extensions/nicknames/extend.php
Normal file
58
extensions/nicknames/extend.php
Normal file
@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of flarum/nickname.
|
||||
*
|
||||
* Copyright (c) 2020 Flarum.
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE.md
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Flarum\Nicknames;
|
||||
|
||||
use Flarum\Api\Serializer\UserSerializer;
|
||||
use Flarum\Extend;
|
||||
use Flarum\Nicknames\Access\UserPolicy;
|
||||
use Flarum\User\Event\Saving;
|
||||
use Flarum\User\Search\UserSearcher;
|
||||
use Flarum\User\User;
|
||||
use Flarum\User\UserValidator;
|
||||
|
||||
return [
|
||||
(new Extend\Frontend('forum'))
|
||||
->js(__DIR__ . '/js/dist/forum.js'),
|
||||
|
||||
(new Extend\Frontend('admin'))
|
||||
->js(__DIR__ . '/js/dist/admin.js'),
|
||||
|
||||
new Extend\Locales(__DIR__ . '/locale'),
|
||||
|
||||
(new Extend\User())
|
||||
->displayNameDriver('nickname', NicknameDriver::class),
|
||||
|
||||
(new Extend\Event())
|
||||
->listen(Saving::class, SaveNicknameToDatabase::class),
|
||||
|
||||
(new Extend\ApiSerializer(UserSerializer::class))
|
||||
->attribute('canEditNickname', function (UserSerializer $serializer, User $user) {
|
||||
return $serializer->getActor()->can('editNickname', $user);
|
||||
}),
|
||||
|
||||
(new Extend\Settings())
|
||||
->default('flarum-nicknames.set_on_registration', true)
|
||||
->default('flarum-nicknames.min', 1)
|
||||
->default('flarum-nicknames.max', 150)
|
||||
->serializeToForum('displayNameDriver', 'display_name_driver', null, 'username')
|
||||
->serializeToForum('setNicknameOnRegistration', 'flarum-nicknames.set_on_registration', 'boolval')
|
||||
->serializeToForum('randomizeUsernameOnRegistration', 'flarum-nicknames.random_username', 'boolval'),
|
||||
|
||||
(new Extend\Validator(UserValidator::class))
|
||||
->configure(AddNicknameValidation::class),
|
||||
|
||||
(new Extend\SimpleFlarumSearch(UserSearcher::class))
|
||||
->setFullTextGambit(NicknameFullTextGambit::class),
|
||||
|
||||
(new Extend\Policy())
|
||||
->modelPolicy(User::class, UserPolicy::class),
|
||||
];
|
9
extensions/nicknames/js/.gitignore
vendored
Normal file
9
extensions/nicknames/js/.gitignore
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
.pnp.*
|
||||
.yarn/*
|
||||
!.yarn/patches
|
||||
!.yarn/plugins
|
||||
!.yarn/releases
|
||||
!.yarn/sdks
|
||||
!.yarn/versions
|
||||
|
||||
node_modules
|
1
extensions/nicknames/js/admin.js
Normal file
1
extensions/nicknames/js/admin.js
Normal file
@ -0,0 +1 @@
|
||||
export * from './src/admin';
|
2
extensions/nicknames/js/dist/admin.js
generated
vendored
Normal file
2
extensions/nicknames/js/dist/admin.js
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
(()=>{var e={n:n=>{var a=n&&n.__esModule?()=>n.default:()=>n;return e.d(a,{a}),a},d:(n,a)=>{for(var t in a)e.o(a,t)&&!e.o(n,t)&&Object.defineProperty(n,t,{enumerable:!0,get:a[t]})},o:(e,n)=>Object.prototype.hasOwnProperty.call(e,n),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},n={};(()=>{"use strict";e.r(n);const a=flarum.core.compat["admin/app"];var t=e.n(a);const r=flarum.core.compat["common/components/Alert"];var s=e.n(r);const i=flarum.core.compat["common/components/Link"];var l=e.n(i);t().initializers.add("flarum/nicknames",(function(){t().extensionData.for("flarum-nicknames").registerSetting((function(){if("nickname"!==t().data.settings.display_name_driver)return m("div",{className:"Form-group"},m(s(),{dismissible:!1},t().translator.trans("flarum-nicknames.admin.wrong_driver",{a:m(l(),{href:t().route("basics")})})))})).registerSetting({setting:"flarum-nicknames.set_on_registration",type:"boolean",label:t().translator.trans("flarum-nicknames.admin.settings.set_on_registration_label")}).registerSetting({setting:"flarum-nicknames.random_username",type:"boolean",label:t().translator.trans("flarum-nicknames.admin.settings.random_username_label"),help:t().translator.trans("flarum-nicknames.admin.settings.random_username_help")}).registerSetting({setting:"flarum-nicknames.unique",type:"boolean",label:t().translator.trans("flarum-nicknames.admin.settings.unique_label")}).registerSetting({setting:"flarum-nicknames.regex",type:"text",label:t().translator.trans("flarum-nicknames.admin.settings.regex_label")}).registerSetting({setting:"flarum-nicknames.min",type:"number",label:t().translator.trans("flarum-nicknames.admin.settings.min_label")}).registerSetting({setting:"flarum-nicknames.max",type:"number",label:t().translator.trans("flarum-nicknames.admin.settings.max_label")}).registerPermission({icon:"fas fa-user-tag",label:t().translator.trans("flarum-nicknames.admin.permissions.edit_own_nickname_label"),permission:"user.editOwnNickname"},"start")}))})(),module.exports=n})();
|
||||
//# sourceMappingURL=admin.js.map
|
1
extensions/nicknames/js/dist/admin.js.map
generated
vendored
Normal file
1
extensions/nicknames/js/dist/admin.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
2
extensions/nicknames/js/dist/forum.js
generated
vendored
Normal file
2
extensions/nicknames/js/dist/forum.js
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
(()=>{var t={n:e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return t.d(n,{a:n}),n},d:(e,n)=>{for(var a in n)t.o(n,a)&&!t.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:n[a]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};(()=>{"use strict";t.r(e);const n=flarum.core.compat["forum/app"];var a=t.n(n);const r=flarum.core.compat["common/extend"],o=flarum.core.compat["common/components/Button"];var i=t.n(o);const s=flarum.core.compat["common/components/EditUserModal"];var c=t.n(s);const u=flarum.core.compat["forum/components/SignUpModal"];var l=t.n(u);const d=flarum.core.compat["forum/components/SettingsPage"];var p=t.n(d);const f=flarum.core.compat["common/Model"];var k=t.n(f);const h=flarum.core.compat["common/models/User"];var y=t.n(h);const b=flarum.core.compat["common/utils/extractText"];var v=t.n(b);const g=flarum.core.compat["common/utils/Stream"];var N=t.n(g);function _(t,e){return _=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t},_(t,e)}const x=flarum.core.compat["common/components/Modal"];var O=function(t){var e,n;function r(){return t.apply(this,arguments)||this}n=t,(e=r).prototype=Object.create(n.prototype),e.prototype.constructor=e,_(e,n);var o=r.prototype;return o.oninit=function(e){t.prototype.oninit.call(this,e),this.nickname=N()(a().session.user.displayName())},o.className=function(){return"NickameModal Modal--small"},o.title=function(){return a().translator.trans("flarum-nicknames.forum.change_nickname.title")},o.content=function(){return m("div",{className:"Modal-body"},m("div",{className:"Form Form--centered"},m("div",{className:"Form-group"},m("input",{type:"text",autocomplete:"off",name:"nickname",className:"FormControl",bidi:this.nickname,disabled:this.loading})),m("div",{className:"Form-group"},i().component({className:"Button Button--primary Button--block",type:"submit",loading:this.loading},a().translator.trans("flarum-nicknames.forum.change_nickname.submit_button")))))},o.onsubmit=function(t){var e=this;t.preventDefault(),this.nickname()!==a().session.user.displayName()?(this.loading=!0,a().session.user.save({nickname:this.nickname()},{errorHandler:this.onerror.bind(this)}).then(this.hide.bind(this)).catch((function(){e.loading=!1,m.redraw()}))):this.hide()},r}(t.n(x)());a().initializers.add("flarum/nicknames",(function(){y().prototype.canEditNickname=k().attribute("canEditNickname"),(0,r.extend)(p().prototype,"accountItems",(function(t){"nickname"===a().forum.attribute("displayNameDriver")&&this.user.canEditNickname()&&t.add("changeNickname",m(i(),{className:"Button",onclick:function(){return a().modal.show(O)}},a().translator.trans("flarum-nicknames.forum.settings.change_nickname_button")))})),(0,r.extend)(c().prototype,"oninit",(function(){this.nickname=N()(this.attrs.user.displayName())})),(0,r.extend)(c().prototype,"fields",(function(t){"nickname"===a().forum.attribute("displayNameDriver")&&this.attrs.user.canEditNickname()&&t.add("nickname",m("div",{className:"Form-group"},m("label",null,a().translator.trans("flarum-nicknames.forum.edit_user.nicknames_heading")),m("input",{className:"FormControl",placeholder:v()(a().translator.trans("flarum-nicknames.forum.edit_user.nicknames_text")),bidi:this.nickname})),100)})),(0,r.extend)(c().prototype,"data",(function(t){"nickname"===a().forum.attribute("displayNameDriver")&&this.attrs.user.canEditNickname()&&this.nickname()!==this.attrs.user.displayName()&&(t.nickname=this.nickname())})),(0,r.extend)(l().prototype,"oninit",(function(){"nickname"===a().forum.attribute("displayNameDriver")&&(this.nickname=N()(this.attrs.username||""))})),(0,r.extend)(l().prototype,"onready",(function(){"nickname"===a().forum.attribute("displayNameDriver")&&a().forum.attribute("setNicknameOnRegistration")&&a().forum.attribute("randomizeUsernameOnRegistration")&&this.$("[name=nickname]").select()})),(0,r.extend)(l().prototype,"fields",(function(t){"nickname"===a().forum.attribute("displayNameDriver")&&a().forum.attribute("setNicknameOnRegistration")&&(t.add("nickname",m("div",{className:"Form-group"},m("input",{className:"FormControl",name:"nickname",type:"text",placeholder:v()(a().translator.trans("flarum-nicknames.forum.sign_up.nickname_placeholder")),bidi:this.nickname,disabled:this.loading||this.isProvided("nickname"),required:a().forum.attribute("randomizeUsernameOnRegistration")})),25),a().forum.attribute("randomizeUsernameOnRegistration")&&t.remove("username"))})),(0,r.extend)(l().prototype,"submitData",(function(t){if("nickname"===a().forum.attribute("displayNameDriver")&&a().forum.attribute("setNicknameOnRegistration")&&(t.nickname=this.nickname(),a().forum.attribute("randomizeUsernameOnRegistration"))){var e=new Uint32Array(2);crypto.getRandomValues(e),t.username=e.join("")}}))}))})(),module.exports=e})();
|
||||
//# sourceMappingURL=forum.js.map
|
1
extensions/nicknames/js/dist/forum.js.map
generated
vendored
Normal file
1
extensions/nicknames/js/dist/forum.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
1
extensions/nicknames/js/forum.js
Normal file
1
extensions/nicknames/js/forum.js
Normal file
@ -0,0 +1 @@
|
||||
export * from './src/forum';
|
20
extensions/nicknames/js/package.json
Normal file
20
extensions/nicknames/js/package.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "@flarum/nicknames",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"prettier": "@flarum/prettier-config",
|
||||
"devDependencies": {
|
||||
"prettier": "^2.5.1",
|
||||
"flarum-webpack-config": "^2.0.0",
|
||||
"webpack": "^5.65.0",
|
||||
"webpack-cli": "^4.9.1",
|
||||
"@flarum/prettier-config": "^1.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "webpack --mode development --watch",
|
||||
"build": "webpack --mode production",
|
||||
"format": "prettier --write src",
|
||||
"format-check": "prettier --check src",
|
||||
"analyze": "cross-env ANALYZER=true yarn build"
|
||||
}
|
||||
}
|
58
extensions/nicknames/js/src/admin/index.js
Normal file
58
extensions/nicknames/js/src/admin/index.js
Normal file
@ -0,0 +1,58 @@
|
||||
import app from 'flarum/admin/app';
|
||||
import Alert from 'flarum/common/components/Alert';
|
||||
import Link from 'flarum/common/components/Link';
|
||||
|
||||
app.initializers.add('flarum/nicknames', () => {
|
||||
app.extensionData
|
||||
.for('flarum-nicknames')
|
||||
.registerSetting(function () {
|
||||
if (app.data.settings.display_name_driver === 'nickname') return;
|
||||
|
||||
return (
|
||||
<div className="Form-group">
|
||||
<Alert dismissible={false}>
|
||||
{app.translator.trans('flarum-nicknames.admin.wrong_driver', { a: <Link href={app.route('basics')}></Link> })}
|
||||
</Alert>
|
||||
</div>
|
||||
);
|
||||
})
|
||||
.registerSetting({
|
||||
setting: 'flarum-nicknames.set_on_registration',
|
||||
type: 'boolean',
|
||||
label: app.translator.trans('flarum-nicknames.admin.settings.set_on_registration_label'),
|
||||
})
|
||||
.registerSetting({
|
||||
setting: 'flarum-nicknames.random_username',
|
||||
type: 'boolean',
|
||||
label: app.translator.trans('flarum-nicknames.admin.settings.random_username_label'),
|
||||
help: app.translator.trans('flarum-nicknames.admin.settings.random_username_help'),
|
||||
})
|
||||
.registerSetting({
|
||||
setting: 'flarum-nicknames.unique',
|
||||
type: 'boolean',
|
||||
label: app.translator.trans('flarum-nicknames.admin.settings.unique_label'),
|
||||
})
|
||||
.registerSetting({
|
||||
setting: 'flarum-nicknames.regex',
|
||||
type: 'text',
|
||||
label: app.translator.trans('flarum-nicknames.admin.settings.regex_label'),
|
||||
})
|
||||
.registerSetting({
|
||||
setting: 'flarum-nicknames.min',
|
||||
type: 'number',
|
||||
label: app.translator.trans('flarum-nicknames.admin.settings.min_label'),
|
||||
})
|
||||
.registerSetting({
|
||||
setting: 'flarum-nicknames.max',
|
||||
type: 'number',
|
||||
label: app.translator.trans('flarum-nicknames.admin.settings.max_label'),
|
||||
})
|
||||
.registerPermission(
|
||||
{
|
||||
icon: 'fas fa-user-tag',
|
||||
label: app.translator.trans('flarum-nicknames.admin.permissions.edit_own_nickname_label'),
|
||||
permission: 'user.editOwnNickname',
|
||||
},
|
||||
'start'
|
||||
);
|
||||
});
|
@ -0,0 +1,65 @@
|
||||
import app from 'flarum/forum/app';
|
||||
import Modal from 'flarum/common/components/Modal';
|
||||
import Button from 'flarum/common/components/Button';
|
||||
import Stream from 'flarum/common/utils/Stream';
|
||||
|
||||
export default class NicknameModal extends Modal {
|
||||
oninit(vnode) {
|
||||
super.oninit(vnode);
|
||||
this.nickname = Stream(app.session.user.displayName());
|
||||
}
|
||||
|
||||
className() {
|
||||
return 'NickameModal Modal--small';
|
||||
}
|
||||
|
||||
title() {
|
||||
return app.translator.trans('flarum-nicknames.forum.change_nickname.title');
|
||||
}
|
||||
|
||||
content() {
|
||||
return (
|
||||
<div className="Modal-body">
|
||||
<div className="Form Form--centered">
|
||||
<div className="Form-group">
|
||||
<input type="text" autocomplete="off" name="nickname" className="FormControl" bidi={this.nickname} disabled={this.loading} />
|
||||
</div>
|
||||
<div className="Form-group">
|
||||
{Button.component(
|
||||
{
|
||||
className: 'Button Button--primary Button--block',
|
||||
type: 'submit',
|
||||
loading: this.loading,
|
||||
},
|
||||
app.translator.trans('flarum-nicknames.forum.change_nickname.submit_button')
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
onsubmit(e) {
|
||||
e.preventDefault();
|
||||
|
||||
if (this.nickname() === app.session.user.displayName()) {
|
||||
this.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
this.loading = true;
|
||||
|
||||
app.session.user
|
||||
.save(
|
||||
{ nickname: this.nickname() },
|
||||
{
|
||||
errorHandler: this.onerror.bind(this),
|
||||
}
|
||||
)
|
||||
.then(this.hide.bind(this))
|
||||
.catch(() => {
|
||||
this.loading = false;
|
||||
m.redraw();
|
||||
});
|
||||
}
|
||||
}
|
114
extensions/nicknames/js/src/forum/index.js
Normal file
114
extensions/nicknames/js/src/forum/index.js
Normal file
@ -0,0 +1,114 @@
|
||||
import app from 'flarum/forum/app';
|
||||
import { extend } from 'flarum/common/extend';
|
||||
import Button from 'flarum/common/components/Button';
|
||||
import EditUserModal from 'flarum/common/components/EditUserModal';
|
||||
import SignUpModal from 'flarum/forum/components/SignUpModal';
|
||||
import SettingsPage from 'flarum/forum/components/SettingsPage';
|
||||
import Model from 'flarum/common/Model';
|
||||
import User from 'flarum/common/models/User';
|
||||
import extractText from 'flarum/common/utils/extractText';
|
||||
import Stream from 'flarum/common/utils/Stream';
|
||||
import NickNameModal from './components/NicknameModal';
|
||||
|
||||
app.initializers.add('flarum/nicknames', () => {
|
||||
User.prototype.canEditNickname = Model.attribute('canEditNickname');
|
||||
|
||||
extend(SettingsPage.prototype, 'accountItems', function (items) {
|
||||
if (app.forum.attribute('displayNameDriver') !== 'nickname') return;
|
||||
|
||||
if (this.user.canEditNickname()) {
|
||||
items.add(
|
||||
'changeNickname',
|
||||
<Button className="Button" onclick={() => app.modal.show(NickNameModal)}>
|
||||
{app.translator.trans('flarum-nicknames.forum.settings.change_nickname_button')}
|
||||
</Button>
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
extend(EditUserModal.prototype, 'oninit', function () {
|
||||
this.nickname = Stream(this.attrs.user.displayName());
|
||||
});
|
||||
|
||||
extend(EditUserModal.prototype, 'fields', function (items) {
|
||||
if (app.forum.attribute('displayNameDriver') !== 'nickname') return;
|
||||
|
||||
if (!this.attrs.user.canEditNickname()) return;
|
||||
|
||||
items.add(
|
||||
'nickname',
|
||||
<div className="Form-group">
|
||||
<label>{app.translator.trans('flarum-nicknames.forum.edit_user.nicknames_heading')}</label>
|
||||
<input
|
||||
className="FormControl"
|
||||
placeholder={extractText(app.translator.trans('flarum-nicknames.forum.edit_user.nicknames_text'))}
|
||||
bidi={this.nickname}
|
||||
/>
|
||||
</div>,
|
||||
100
|
||||
);
|
||||
});
|
||||
|
||||
extend(EditUserModal.prototype, 'data', function (data) {
|
||||
if (app.forum.attribute('displayNameDriver') !== 'nickname') return;
|
||||
|
||||
if (!this.attrs.user.canEditNickname()) return;
|
||||
|
||||
if (this.nickname() !== this.attrs.user.displayName()) {
|
||||
data.nickname = this.nickname();
|
||||
}
|
||||
});
|
||||
|
||||
extend(SignUpModal.prototype, 'oninit', function () {
|
||||
if (app.forum.attribute('displayNameDriver') !== 'nickname') return;
|
||||
|
||||
this.nickname = Stream(this.attrs.username || '');
|
||||
});
|
||||
|
||||
extend(SignUpModal.prototype, 'onready', function () {
|
||||
if (app.forum.attribute('displayNameDriver') !== 'nickname') return;
|
||||
|
||||
if (app.forum.attribute('setNicknameOnRegistration') && app.forum.attribute('randomizeUsernameOnRegistration')) {
|
||||
this.$('[name=nickname]').select();
|
||||
}
|
||||
});
|
||||
|
||||
extend(SignUpModal.prototype, 'fields', function (items) {
|
||||
if (app.forum.attribute('displayNameDriver') !== 'nickname') return;
|
||||
|
||||
if (app.forum.attribute('setNicknameOnRegistration')) {
|
||||
items.add(
|
||||
'nickname',
|
||||
<div className="Form-group">
|
||||
<input
|
||||
className="FormControl"
|
||||
name="nickname"
|
||||
type="text"
|
||||
placeholder={extractText(app.translator.trans('flarum-nicknames.forum.sign_up.nickname_placeholder'))}
|
||||
bidi={this.nickname}
|
||||
disabled={this.loading || this.isProvided('nickname')}
|
||||
required={app.forum.attribute('randomizeUsernameOnRegistration')}
|
||||
/>
|
||||
</div>,
|
||||
25
|
||||
);
|
||||
|
||||
if (app.forum.attribute('randomizeUsernameOnRegistration')) {
|
||||
items.remove('username');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
extend(SignUpModal.prototype, 'submitData', function (data) {
|
||||
if (app.forum.attribute('displayNameDriver') !== 'nickname') return;
|
||||
|
||||
if (app.forum.attribute('setNicknameOnRegistration')) {
|
||||
data.nickname = this.nickname();
|
||||
if (app.forum.attribute('randomizeUsernameOnRegistration')) {
|
||||
const arr = new Uint32Array(2);
|
||||
crypto.getRandomValues(arr);
|
||||
data.username = arr.join('');
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
1
extensions/nicknames/js/webpack.config.js
Normal file
1
extensions/nicknames/js/webpack.config.js
Normal file
@ -0,0 +1 @@
|
||||
module.exports = require('flarum-webpack-config')();
|
2284
extensions/nicknames/js/yarn.lock
Normal file
2284
extensions/nicknames/js/yarn.lock
Normal file
File diff suppressed because it is too large
Load Diff
29
extensions/nicknames/locale/en.yml
Normal file
29
extensions/nicknames/locale/en.yml
Normal file
@ -0,0 +1,29 @@
|
||||
flarum-nicknames:
|
||||
admin:
|
||||
permissions:
|
||||
edit_own_nickname_label: Edit own nickname
|
||||
settings:
|
||||
max_label: Maximum nickname length
|
||||
min_label: Minimum nickname length
|
||||
random_username_label: Randomize Usernames
|
||||
random_username_help: This will hide the `username` input on registration, and use a random number instead. It will also make the `nickname` field mandatory. This will only take effect if "Allow setting nicknames on registration" is enabled.
|
||||
regex_label: Regular expression for validation
|
||||
set_on_registration_label: Allow setting nicknames on registration
|
||||
unique_label: Require unique nicknames
|
||||
wrong_driver: You must select "nickname" as the display name driver on the <a><strong>Basics Page</strong></a> for this extension to take effect.
|
||||
api:
|
||||
invalid_nickname_message: This nickname is invalid. Please contact your forum administrator for more information on nickname rules.
|
||||
forum:
|
||||
change_nickname:
|
||||
submit_button: => core.ref.save_changes
|
||||
title: => flarum-nicknames.ref.change_nickname
|
||||
edit_user:
|
||||
nicknames_heading: => flarum-nicknames.ref.change_nickname
|
||||
nicknames_text: => flarum-nicknames.ref.nickname
|
||||
settings:
|
||||
change_nickname_button: => flarum-nicknames.ref.change_nickname
|
||||
sign_up:
|
||||
nickname_placeholder: => flarum-nicknames.ref.nickname
|
||||
ref:
|
||||
change_nickname: Change Nickname
|
||||
nickname: Nickname
|
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Schema\Builder;
|
||||
|
||||
return [
|
||||
'up' => function(Builder $schema) {
|
||||
if (!$schema->hasColumn('users', 'nickname')) {
|
||||
$schema->table('users', function (Blueprint $table) use ($schema) {
|
||||
$table->string('nickname', 150)->after('username')->index()->nullable();
|
||||
});
|
||||
}
|
||||
},
|
||||
'down' => function(Builder $schema) {
|
||||
$schema->table('users', function (Blueprint $table) use ($schema) {
|
||||
$table->dropColumn('nickname');
|
||||
});
|
||||
}
|
||||
];
|
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
use Flarum\Database\Migration;
|
||||
use Flarum\Group\Group;
|
||||
|
||||
return Migration::addPermissions([
|
||||
'user.editOwnNickname' => Group::MEMBER_ID
|
||||
]);
|
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Schema\Builder;
|
||||
|
||||
return [
|
||||
'up' => function (Builder $schema) {
|
||||
$schema->table('users', function (Blueprint $table) {
|
||||
$table->string('nickname')->nullable()->change();
|
||||
});
|
||||
},
|
||||
'down' => function (Builder $schema) {
|
||||
}
|
||||
];
|
43
extensions/nicknames/src/Access/UserPolicy.php
Normal file
43
extensions/nicknames/src/Access/UserPolicy.php
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Flarum\Nicknames\Access;
|
||||
|
||||
use Flarum\Settings\SettingsRepositoryInterface;
|
||||
use Flarum\User\Access\AbstractPolicy;
|
||||
use Flarum\User\User;
|
||||
|
||||
class UserPolicy extends AbstractPolicy
|
||||
{
|
||||
/**
|
||||
* @var SettingsRepositoryInterface
|
||||
*/
|
||||
protected $settings;
|
||||
|
||||
public function __construct(SettingsRepositoryInterface $settings)
|
||||
{
|
||||
$this->settings = $settings;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param User $actor
|
||||
* @param User $user
|
||||
* @return bool|null
|
||||
*/
|
||||
public function editNickname(User $actor, User $user)
|
||||
{
|
||||
if ($actor->isGuest() && !$user->exists && $this->settings->get('flarum-nicknames.set_on_registration')) {
|
||||
return $this->allow();
|
||||
} else if ($actor->id === $user->id && $actor->hasPermission('user.editOwnNickname')) {
|
||||
return $this->allow();
|
||||
} else if ($actor->can('edit', $user)) {
|
||||
return $this->allow();
|
||||
}
|
||||
}
|
||||
}
|
54
extensions/nicknames/src/AddNicknameValidation.php
Normal file
54
extensions/nicknames/src/AddNicknameValidation.php
Normal file
@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace Flarum\Nicknames;
|
||||
|
||||
use Flarum\Settings\SettingsRepositoryInterface;
|
||||
use Illuminate\Validation\Validator;
|
||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||
|
||||
class AddNicknameValidation
|
||||
{
|
||||
/**
|
||||
* @var SettingsRepositoryInterface
|
||||
*/
|
||||
protected $settings;
|
||||
|
||||
/**
|
||||
* @var TranslatorInterface
|
||||
*/
|
||||
protected $translator;
|
||||
|
||||
|
||||
public function __construct(SettingsRepositoryInterface $settings, TranslatorInterface $translator)
|
||||
{
|
||||
$this->settings = $settings;
|
||||
$this->translator = $translator;
|
||||
}
|
||||
|
||||
public function __invoke($flarumValidator, Validator $validator)
|
||||
{
|
||||
$idSuffix = $flarumValidator->getUser() ? ','.$flarumValidator->getUser()->id : '';
|
||||
$rules = $validator->getRules();
|
||||
|
||||
$rules['nickname'] = [
|
||||
function ($attribute, $value, $fail) {
|
||||
$regex = $this->settings->get('flarum-nicknames.regex');
|
||||
if ($regex && !preg_match_all("/$regex/", $value)) {
|
||||
$this->translator->trans('flarum-nicknames.api.invalid_nickname_message');
|
||||
}
|
||||
},
|
||||
'min:' . $this->settings->get('flarum-nicknames.min'),
|
||||
'max:' . $this->settings->get('flarum-nicknames.max'),
|
||||
'nullable'
|
||||
];
|
||||
|
||||
if ($this->settings->get('flarum-nicknames.unique')) {
|
||||
$rules['nickname'][] = 'unique:users,username'.$idSuffix;
|
||||
$rules['nickname'][] = 'unique:users,nickname'.$idSuffix;
|
||||
$rules['username'][] = 'unique:users,nickname'.$idSuffix;
|
||||
}
|
||||
|
||||
$validator->setRules($rules);
|
||||
}
|
||||
}
|
14
extensions/nicknames/src/NicknameDriver.php
Normal file
14
extensions/nicknames/src/NicknameDriver.php
Normal file
@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace Flarum\Nicknames;
|
||||
|
||||
use Flarum\User\DisplayName\DriverInterface;
|
||||
use Flarum\User\User;
|
||||
|
||||
class NicknameDriver implements DriverInterface {
|
||||
|
||||
public function displayName(User $user): string
|
||||
{
|
||||
return $user->nickname ? $user->nickname : $user->username;
|
||||
}
|
||||
}
|
57
extensions/nicknames/src/NicknameFullTextGambit.php
Normal file
57
extensions/nicknames/src/NicknameFullTextGambit.php
Normal file
@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace Flarum\Nicknames;
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
use Flarum\Search\GambitInterface;
|
||||
use Flarum\Search\SearchState;
|
||||
use Flarum\User\UserRepository;
|
||||
|
||||
|
||||
class NicknameFullTextGambit implements GambitInterface
|
||||
{
|
||||
/**
|
||||
* @var UserRepository
|
||||
*/
|
||||
protected $users;
|
||||
|
||||
/**
|
||||
* @param \Flarum\User\UserRepository $users
|
||||
*/
|
||||
public function __construct(UserRepository $users)
|
||||
{
|
||||
$this->users = $users;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $searchValue
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
private function getUserSearchSubQuery($searchValue)
|
||||
{
|
||||
return $this->users
|
||||
->query()
|
||||
->select('id')
|
||||
->where('username', 'like', "{$searchValue}%")
|
||||
->orWhere('nickname', 'like',"{$searchValue}%");
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function apply(SearchState $search, $searchValue)
|
||||
{
|
||||
$search->getQuery()
|
||||
->whereIn(
|
||||
'id',
|
||||
$this->getUserSearchSubQuery($searchValue)
|
||||
);
|
||||
}
|
||||
}
|
41
extensions/nicknames/src/SaveNicknameToDatabase.php
Normal file
41
extensions/nicknames/src/SaveNicknameToDatabase.php
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace Flarum\Nicknames;
|
||||
|
||||
use Flarum\Settings\SettingsRepositoryInterface;
|
||||
use Flarum\User\Event\Saving;
|
||||
use Flarum\User\Exception\PermissionDeniedException;
|
||||
use Illuminate\Support\Arr;
|
||||
|
||||
class SaveNicknameToDatabase {
|
||||
/**
|
||||
* @var SettingsRepositoryInterface
|
||||
*/
|
||||
protected $settings;
|
||||
|
||||
public function __construct(SettingsRepositoryInterface $settings) {
|
||||
$this->settings = $settings;
|
||||
}
|
||||
|
||||
public function handle(Saving $event)
|
||||
{
|
||||
$user = $event->user;
|
||||
$data = $event->data;
|
||||
$actor = $event->actor;
|
||||
$attributes = Arr::get($data, 'attributes', []);
|
||||
|
||||
if (isset($attributes['nickname'])) {
|
||||
$actor->assertCan('editNickname', $user);
|
||||
|
||||
$nickname = $attributes['nickname'];
|
||||
|
||||
// If the user sets their nickname back to the username
|
||||
// set the nickname to null so that it just falls back to the username
|
||||
if ($user->username === $nickname) {
|
||||
$user->nickname = null;
|
||||
} else {
|
||||
$user->nickname = $nickname;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
0
extensions/nicknames/tests/fixtures/.gitkeep
vendored
Normal file
0
extensions/nicknames/tests/fixtures/.gitkeep
vendored
Normal file
87
extensions/nicknames/tests/integration/api/EditUserTest.php
Normal file
87
extensions/nicknames/tests/integration/api/EditUserTest.php
Normal file
@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Flarum\Nicknames\Tests\integration;
|
||||
|
||||
use Flarum\Group\Group;
|
||||
use Flarum\Testing\integration\RetrievesAuthorizedUsers;
|
||||
use Flarum\Testing\integration\TestCase;
|
||||
use Flarum\User\User;
|
||||
|
||||
class UpdateTest extends TestCase
|
||||
{
|
||||
use RetrievesAuthorizedUsers;
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->extension('flarum-nicknames');
|
||||
$this->prepareDatabase([
|
||||
'users' => [
|
||||
$this->normalUser(),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function user_cant_edit_own_nickname_if_not_allowed()
|
||||
{
|
||||
$this->database()->table('group_permission')->where('permission', 'user.editOwnNickname')->where('group_id', Group::MEMBER_ID)->delete();
|
||||
|
||||
$response = $this->send(
|
||||
$this->request('PATCH', '/api/users/2', [
|
||||
'authenticatedAs' => 2,
|
||||
'json' => [
|
||||
'data' => [
|
||||
'attributes' => [
|
||||
'nickname' => 'new nickname',
|
||||
],
|
||||
],
|
||||
],
|
||||
])
|
||||
);
|
||||
|
||||
$this->assertEquals(403, $response->getStatusCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function user_can_edit_own_nickname_if_allowed()
|
||||
{
|
||||
$this->prepareDatabase([
|
||||
'group_permission' => [
|
||||
['permission' => 'user.editOwnNickname', 'group_id' => 2],
|
||||
]
|
||||
]);
|
||||
|
||||
$response = $this->send(
|
||||
$this->request('PATCH', '/api/users/2', [
|
||||
'authenticatedAs' => 2,
|
||||
'json' => [
|
||||
'data' => [
|
||||
'attributes' => [
|
||||
'nickname' => 'new nickname',
|
||||
],
|
||||
],
|
||||
],
|
||||
])
|
||||
);
|
||||
|
||||
$this->assertEquals(200, $response->getStatusCode());
|
||||
|
||||
$this->assertEquals('new nickname', User::find(2)->nickname);
|
||||
}
|
||||
}
|
77
extensions/nicknames/tests/integration/api/RegisterTest.php
Normal file
77
extensions/nicknames/tests/integration/api/RegisterTest.php
Normal file
@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Flarum\Nicknames\Tests\integration;
|
||||
|
||||
use Flarum\Extend;
|
||||
use Flarum\Testing\integration\TestCase;
|
||||
use Flarum\User\User;
|
||||
|
||||
class RegisterTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->extension('flarum-nicknames');
|
||||
$this->extend(
|
||||
(new Extend\Csrf)->exemptRoute('register')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function can_register_with_nickname()
|
||||
{
|
||||
$this->setting('flarum-nicknames.set_on_registration', true);
|
||||
|
||||
$response = $this->send(
|
||||
$this->request('POST', '/register', [
|
||||
'json' => [
|
||||
'nickname' => 'фларум',
|
||||
'username' => 'test',
|
||||
'password' => 'too-obscure',
|
||||
'email' => 'test@machine.local',
|
||||
]
|
||||
])
|
||||
);
|
||||
|
||||
$this->assertEquals(201, $response->getStatusCode());
|
||||
|
||||
/** @var User $user */
|
||||
$user = User::where('username', 'test')->firstOrFail();
|
||||
|
||||
$this->assertEquals(0, $user->is_email_confirmed);
|
||||
$this->assertEquals('test', $user->username);
|
||||
$this->assertEquals('test@machine.local', $user->email);
|
||||
}
|
||||
|
||||
/**
|
||||
* @test
|
||||
*/
|
||||
public function cant_register_with_nickname_if_not_allowed()
|
||||
{
|
||||
$this->setting('flarum-nicknames.set_on_registration', false);
|
||||
|
||||
$response = $this->send(
|
||||
$this->request('POST', '/register', [
|
||||
'json' => [
|
||||
'nickname' => 'фларум',
|
||||
'username' => 'test',
|
||||
'password' => 'too-obscure',
|
||||
'email' => 'test@machine.local',
|
||||
]
|
||||
])
|
||||
);
|
||||
|
||||
$this->assertEquals(403, $response->getStatusCode());
|
||||
}
|
||||
}
|
16
extensions/nicknames/tests/integration/setup.php
Normal file
16
extensions/nicknames/tests/integration/setup.php
Normal file
@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Flarum.
|
||||
*
|
||||
* For detailed copyright and license information, please view the
|
||||
* LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
use Flarum\Testing\integration\Setup\SetupScript;
|
||||
|
||||
require __DIR__.'/../../vendor/autoload.php';
|
||||
|
||||
$setup = new SetupScript();
|
||||
|
||||
$setup->run();
|
24
extensions/nicknames/tests/phpunit.integration.xml
Normal file
24
extensions/nicknames/tests/phpunit.integration.xml
Normal file
@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
|
||||
backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="true"
|
||||
stopOnFailure="false"
|
||||
>
|
||||
<coverage processUncoveredFiles="true">
|
||||
<include>
|
||||
<directory suffix=".php">../src/</directory>
|
||||
</include>
|
||||
</coverage>
|
||||
<testsuites>
|
||||
<testsuite name="Flarum Integration Tests">
|
||||
<directory suffix="Test.php">./integration</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
</phpunit>
|
27
extensions/nicknames/tests/phpunit.unit.xml
Normal file
27
extensions/nicknames/tests/phpunit.unit.xml
Normal file
@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"
|
||||
backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false"
|
||||
>
|
||||
<coverage processUncoveredFiles="true">
|
||||
<include>
|
||||
<directory suffix=".php">../src/</directory>
|
||||
</include>
|
||||
</coverage>
|
||||
<testsuites>
|
||||
<testsuite name="Flarum Unit Tests">
|
||||
<directory suffix="Test.php">./unit</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<listeners>
|
||||
<listener class="\Mockery\Adapter\Phpunit\TestListener" />
|
||||
</listeners>
|
||||
</phpunit>
|
0
extensions/nicknames/tests/unit/.gitkeep
Normal file
0
extensions/nicknames/tests/unit/.gitkeep
Normal file
Reference in New Issue
Block a user