Browse Source

Merge pull request #1752 from nocodb/fix/1751-invite-email

fix: send invite email
pull/1788/head
աɨռɢӄաօռɢ 2 years ago committed by GitHub
parent
commit
7b57dd7232
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      packages/nc-gui/components/auth/shareOrInviteModal.vue
  2. 18
      packages/nc-gui/components/auth/userManagement.vue
  3. 2
      packages/nc-gui/lang/da.json
  4. 2
      packages/nc-gui/lang/de.json
  5. 2
      packages/nc-gui/lang/en.json
  6. 2
      packages/nc-gui/lang/es.json
  7. 2
      packages/nc-gui/lang/fi.json
  8. 2
      packages/nc-gui/lang/fr.json
  9. 2
      packages/nc-gui/lang/id.json
  10. 2
      packages/nc-gui/lang/it_IT.json
  11. 2
      packages/nc-gui/lang/iw.json
  12. 2
      packages/nc-gui/lang/ko.json
  13. 2
      packages/nc-gui/lang/no.json
  14. 2
      packages/nc-gui/lang/pt.json
  15. 2
      packages/nc-gui/lang/pt_BR.json
  16. 2
      packages/nc-gui/lang/sv.json
  17. 2
      packages/nc-gui/lang/th.json
  18. 2
      packages/nc-gui/lang/uk.json
  19. 2
      packages/nc-gui/lang/vi.json
  20. 1
      packages/noco-docs/content/en/developer-resources/rest-apis.md
  21. 23
      packages/nocodb-sdk/src/lib/Api.ts
  22. 76
      packages/nocodb/src/lib/noco/meta/api/projectUserApis.ts
  23. 2
      packages/nocodb/src/lib/noco/meta/helpers/NcPluginMgrv2.ts
  24. 47
      scripts/sdk/swagger.json

7
packages/nc-gui/components/auth/shareOrInviteModal.vue

@ -44,11 +44,8 @@
</v-alert>
<p class="caption grey--text mt-3">
{{ $t('msg.info.userInviteNoSMTP') }}
<!-- Looks like you have not configured mailer yet! <br>Please copy above -->
<!-- invite -->
<!-- link and send it to -->
{{ invite_token && (invite_token.email || invite_token.emails && invite_token.emails.join(', ')) }}.
<!-- Looks like you have not configured mailer yet! <br> Please copy above invite link and send it to -->
<pre>{{ $t('msg.info.userInviteNoSMTP') }} {{ invite_token && (invite_token.email || invite_token.emails && invite_token.emails.join(', ')) }}.</pre>
</p>
<div class="text-right">

18
packages/nc-gui/components/auth/userManagement.vue

@ -323,11 +323,8 @@
</v-alert>
<p class="caption grey--text mt-3">
{{ $t('msg.info.userInviteNoSMTP') }}
<!-- Looks like you have not configured mailer yet! <br>Please copy above -->
<!-- invite -->
<!-- link and send it to -->
{{ invite_token && (invite_token.email || invite_token.emails && invite_token.emails.join(', ')) }}.
<!-- Looks like you have not configured mailer yet! <br> Please copy above invite link and send it to -->
<pre>{{ $t('msg.info.userInviteNoSMTP') }} {{ invite_token && (invite_token.email || invite_token.emails && invite_token.emails.join(', ')) }}.</pre>
</p>
<div class="text-right">
@ -615,16 +612,7 @@ export default {
},
async resendInvite(id) {
try {
await this.$axios.post('/admin/resendInvite/' + id, {
projectName: this.$store.getters['project/GtrProjectName']
}, {
headers: {
'xc-auth': this.$store.state.users.token
},
params: {
project_id: this.$route.params.project_id
}
})
await this.$api.auth.projectUserResendInvite(this.$route.params.project_id, id)
this.$toast.success('Invite email sent successfully').goAway(3000)
await this.loadUsers()
} catch (e) {

2
packages/nc-gui/lang/da.json

@ -406,7 +406,7 @@
"deleteProject": "Ønsker du at slette projektet?",
"shareBasePrivate": "Generer offentligt delbart readonly base",
"shareBasePublic": "Enhver på internettet med dette link kan se",
"userInviteNoSMTP": "Ser ud som om du ikke har konfigureret mailer endnu! \\ n Kopier venligst ovenstående invitation link og send det til",
"userInviteNoSMTP": "Ser ud som om du ikke har konfigureret mailer endnu!\nKopier venligst ovenstående invitation link og send det til",
"dragDropHide": "Træk og slip felter her for at skjule",
"formInput": "Indtast formularindgangsmærke",
"formHelpText": "Tilføj nogle hjælpetekst",

2
packages/nc-gui/lang/de.json

@ -406,7 +406,7 @@
"deleteProject": "Möchten Sie das Projekt löschen?",
"shareBasePrivate": "Öffentlich freigegebene Nur-Lese-Datenbank generieren",
"shareBasePublic": "Für Jeden im Internet mit diesem Link sichtbar",
"userInviteNoSMTP": "Es sieht so aus, als hätten Sie den Mailer noch nicht konfiguriert! \\ n Bitte kopieren Sie den obigen Einladungs-Link und senden Sie ihn an",
"userInviteNoSMTP": "Es sieht so aus, als hätten Sie den Mailer noch nicht konfiguriert!\nBitte kopieren Sie den obigen Einladungs-Link und senden Sie ihn an",
"dragDropHide": "Ziehen Sie die Felder hierher, um sie zu verstecken",
"formInput": "Formularbezeichnung eingeben",
"formHelpText": "Einen Hilfs-Text hinzufügen",

2
packages/nc-gui/lang/en.json

@ -406,7 +406,7 @@
"deleteProject": "Do you want to delete the project?",
"shareBasePrivate": "Generate publicly shareable readonly base",
"shareBasePublic": "Anyone on the internet with this link can view",
"userInviteNoSMTP": "Looks like you have not configured mailer yet! \\n Please copy above invite link and send it to",
"userInviteNoSMTP": "Looks like you have not configured mailer yet!\nPlease copy above invite link and send it to",
"dragDropHide": "Drag and drop fields here to hide",
"formInput": "Enter form input label",
"formHelpText": "Add some help text",

2
packages/nc-gui/lang/es.json

@ -406,7 +406,7 @@
"deleteProject": "¿Quieres eliminar el proyecto?",
"shareBasePrivate": "Generar una base de sólo lectura compartible públicamente",
"shareBasePublic": "Cualquier persona en Internet con este enlace puede ver",
"userInviteNoSMTP": "¡Parece que aún no has configurado Mailer! \\ n Por favor, copia el link de invitación de arriba y envíalo a",
"userInviteNoSMTP": "¡Parece que aún no has configurado Mailer!\nPor favor, copia el link de invitación de arriba y envíalo a",
"dragDropHide": "Arrastra y suelta los campos a ocultar aquí",
"formInput": "Ingrese la etiqueta de entrada del formulario",
"formHelpText": "Añade algo de texto de ayuda",

2
packages/nc-gui/lang/fi.json

@ -406,7 +406,7 @@
"deleteProject": "Haluatko poistaa projektin?",
"shareBasePrivate": "Luo julkisesti jakattava Readonly Base",
"shareBasePublic": "Jokainen Internetissä tällä linkillä voi tarkastella",
"userInviteNoSMTP": "Näyttää siltä, ettet ole määrittänyt sähköpostia! \\ n Kopioi yllä kutsun linkki ja lähetä se",
"userInviteNoSMTP": "Näyttää siltä, ettet ole määrittänyt sähköpostia!\nKopioi yllä kutsun linkki ja lähetä se",
"dragDropHide": "Vedä ja pudota kentät täällä piiloutumaan",
"formInput": "Anna lomakkeen syöttömerkki",
"formHelpText": "Lisää joitain ohjeita",

2
packages/nc-gui/lang/fr.json

@ -406,7 +406,7 @@
"deleteProject": "Voulez-vous supprimer le projet ?",
"shareBasePrivate": "Générer une base partagée en lecture seule",
"shareBasePublic": "Toute personne avec ce lien peut consulter",
"userInviteNoSMTP": "On dirait que vous n'avez pas encore configuré Mailer! \\ n Merci de copier-coller le lien d'invitation ci-dessous et l'envoyer à",
"userInviteNoSMTP": "On dirait que vous n'avez pas encore configuré Mailer!\nMerci de copier-coller le lien d'invitation ci-dessous et l'envoyer à",
"dragDropHide": "Glisser et déposer des champs ici pour masquer",
"formInput": "Entrer le libelé du formulaire",
"formHelpText": "Ajouter du texte d'assitance",

2
packages/nc-gui/lang/id.json

@ -406,7 +406,7 @@
"deleteProject": "Apakah Anda ingin menghapus proyek?",
"shareBasePrivate": "Menghasilkan basis readonly yang dapat dibagikan secara publik",
"shareBasePublic": "Siapa pun di Internet dengan tautan ini dapat dilihat",
"userInviteNoSMTP": "Sepertinya Anda belum mengonfigurasi mailer! \\ n Harap salin tautan undangan di atas dan kirimkan ke",
"userInviteNoSMTP": "Sepertinya Anda belum mengonfigurasi mailer!\nHarap salin tautan undangan di atas dan kirimkan ke",
"dragDropHide": "Seret dan jatuhkan bidang di sini untuk bersembunyi",
"formInput": "Masukkan label input formulir",
"formHelpText": "Tambahkan beberapa teks bantuan",

2
packages/nc-gui/lang/it_IT.json

@ -406,7 +406,7 @@
"deleteProject": "Vuoi cancellare il progetto?",
"shareBasePrivate": "Genera base readonly condivisibile pubblicamente condivisa",
"shareBasePublic": "Chiunque su Internet con questo link può visualizzare",
"userInviteNoSMTP": "Sembra che non abbia ancora configurato mailer! \\ n Si prega di copiare sopra Invita link e invialo a",
"userInviteNoSMTP": "Sembra che non abbia ancora configurato mailer!\nSi prega di copiare sopra Invita link e invialo a",
"dragDropHide": "Trascina e rilascia i campi qui per nascondersi",
"formInput": "Inserisci l'etichetta di input del modulo",
"formHelpText": "Aggiungi un po 'di testo di aiuto",

2
packages/nc-gui/lang/iw.json

@ -406,7 +406,7 @@
"deleteProject": "האם ברצונך למחוק את הפרויקט?",
"shareBasePrivate": "ליצור בסיס שיתוף פעולה לציבור",
"shareBasePublic": "כל אחד באינטרנט עם קישור זה יכול להציג",
"userInviteNoSMTP": "נראה כאילו לא הגדרת מיילר עדיין! \\ N אנא העתק מעל הזמנת קישור ולשלוח אותו",
"userInviteNoSMTP": "נראה כאילו לא הגדרת מיילר עדיין!\nאנא העתק מעל הזמנת קישור ולשלוח אותו",
"dragDropHide": "גרור ושחרר שדות כאן כדי להסתיר",
"formInput": "הזן תווית קלט טופס",
"formHelpText": "הוסף טקסט עזרה",

2
packages/nc-gui/lang/ko.json

@ -406,7 +406,7 @@
"deleteProject": "프로젝트를 삭제 하시겠습니까?",
"shareBasePrivate": "공개적으로 공유 할 수있는 ReadOnly Base를 생성합니다",
"shareBasePublic": "이 링크가있는 인터넷의 모든 사람은 볼 수 있습니다",
"userInviteNoSMTP": "아직 메일러를 구성하지 않은 것처럼 보입니다! \\ n 초대장 링크를 복사하여 보냅니다.",
"userInviteNoSMTP": "아직 메일러를 구성하지 않은 것처럼 보입니다!\n초대장 링크를 복사하여 보냅니다.",
"dragDropHide": "여기에서 필드를 드래그 앤 드롭하십시오",
"formInput": "양식 입력 레이블을 입력하십시오",
"formHelpText": "도움말 텍스트를 추가하십시오",

2
packages/nc-gui/lang/no.json

@ -406,7 +406,7 @@
"deleteProject": "Ønsker du å slette prosjektet?",
"shareBasePrivate": "Generer offentlig delbar readonly base",
"shareBasePublic": "Alle på Internett med denne lenken kan se",
"userInviteNoSMTP": "Ser ut som om du ikke har konfigurert mailer ennå! \\ n Vennligst kopier over Inviter Link og send den til",
"userInviteNoSMTP": "Ser ut som om du ikke har konfigurert mailer ennå!\nVennligst kopier over Inviter Link og send den til",
"dragDropHide": "Dra og slipp felt her for å skjule",
"formInput": "Skriv inn skjema inngangsetikett",
"formHelpText": "Legg til litt hjelpetekst",

2
packages/nc-gui/lang/pt.json

@ -406,7 +406,7 @@
"deleteProject": "Você quer excluir o projeto?",
"shareBasePrivate": "Gerar base readonly compartilhável publicamente",
"shareBasePublic": "Qualquer pessoa na internet com este link pode ver",
"userInviteNoSMTP": "Parece que você ainda não configurou o mailer! \\ n por favor copie o link acima do convite e envie-o para",
"userInviteNoSMTP": "Parece que você ainda não configurou o mailer!\npor favor copie o link acima do convite e envie-o para",
"dragDropHide": "Arraste e solte os campos aqui para se esconder",
"formInput": "Digite a etiqueta de entrada do formulário",
"formHelpText": "Adicione um texto de ajuda",

2
packages/nc-gui/lang/pt_BR.json

@ -406,7 +406,7 @@
"deleteProject": "Você quer excluir o projeto?",
"shareBasePrivate": "Gerar base readonly compartilhável publicamente",
"shareBasePublic": "Qualquer pessoa na internet com este link pode ver",
"userInviteNoSMTP": "Parece que você ainda não configurou o mailer! \\ n por favor copie o link acima do convite e envie-o para",
"userInviteNoSMTP": "Parece que você ainda não configurou o mailer!\npor favor copie o link acima do convite e envie-o para",
"dragDropHide": "Arraste e solte os campos aqui para se esconder",
"formInput": "Digite a etiqueta de entrada do formulário",
"formHelpText": "Adicione um texto de ajuda",

2
packages/nc-gui/lang/sv.json

@ -406,7 +406,7 @@
"deleteProject": "Vill du radera projektet?",
"shareBasePrivate": "Generera offentligt delbar readonly base",
"shareBasePublic": "Någon på internet med den här länken kan visa",
"userInviteNoSMTP": "Det verkar som om du inte har konfigurerat Mailer än! \\ n Vänligen kopiera ovanför bjudningslänk och skicka den till",
"userInviteNoSMTP": "Det verkar som om du inte har konfigurerat Mailer än!\nVänligen kopiera ovanför bjudningslänk och skicka den till",
"dragDropHide": "Dra och släpp fält här för att dölja",
"formInput": "Ange formulärinmatningslabel",
"formHelpText": "Lägg till lite hjälptext",

2
packages/nc-gui/lang/th.json

@ -406,7 +406,7 @@
"deleteProject": "คณตองการลบโครงการหรอไม",
"shareBasePrivate": "สรางฐาน Readonly ทใชวมกนไดอยางเปดเผย",
"shareBasePublic": "ทกคนบนอนเทอรเนตดวยลงคสามารถดได",
"userInviteNoSMTP": "ดเหมอนวาคณยงไมไดกำหนดคาเมล! \\ n โปรดคดลอกลงกเชญดานบนและสงไปท",
"userInviteNoSMTP": "ดเหมอนวาคณยงไมไดกำหนดคาเมล!\nโปรดคดลอกลงกเชญดานบนและสงไปท",
"dragDropHide": "ลากและวางฟลดเพอซอน",
"formInput": "ปอนปายชออนพตแบบฟอรม",
"formHelpText": "เพมขอความชวยเหลอบางอยาง",

2
packages/nc-gui/lang/uk.json

@ -406,7 +406,7 @@
"deleteProject": "Ви хочете видалити проект?",
"shareBasePrivate": "Генерувати загальнодоступну групою",
"shareBasePublic": "Будь-хто в Інтернеті за допомогою цього посилання може переглядати",
"userInviteNoSMTP": "Схоже, ви ще не налаштували Mailer! \\ n Будь ласка, скопіюйте вище посилання на запрошення і надішліть його",
"userInviteNoSMTP": "Схоже, ви ще не налаштували Mailer!\nБудь ласка, скопіюйте вище посилання на запрошення і надішліть його",
"dragDropHide": "Перетягніть поля тут, щоб приховати",
"formInput": "Введіть етикетку введення форми",
"formHelpText": "Додайте деякий текст довідки",

2
packages/nc-gui/lang/vi.json

@ -406,7 +406,7 @@
"deleteProject": "Bạn có muốn xóa dự án?",
"shareBasePrivate": "Tạo cơ sở chỉ đọc chia sẻ công khai",
"shareBasePublic": "Bất cứ ai trên Internet với liên kết này có thể xem",
"userInviteNoSMTP": "Có vẻ như bạn chưa định cấu hình Mailer! \\ n Vui lòng sao chép liên kết mời trên và gửi nó đến",
"userInviteNoSMTP": "Có vẻ như bạn chưa định cấu hình Mailer!\nVui lòng sao chép liên kết mời trên và gửi nó đến",
"dragDropHide": "Kéo và thả các trường ở đây để ẩn",
"formInput": "Nhập nhãn đầu vào Mẫu",
"formHelpText": "Thêm một số văn bản trợ giúp",

1
packages/noco-docs/content/en/developer-resources/rest-apis.md

@ -78,6 +78,7 @@ Currently, the default value for {orgs} is <b>noco</b>. Users will be able to ch
| Meta | Post | auth | projectUserAdd | /api/v1/db/meta/projects/{projectId}/users |
| Meta | Patch | auth | projectUserUpdate | /api/v1/db/meta/projects/{projectId}/users/{userId} |
| Meta | Delete| auth | projectUserRemove | /api/v1/db/meta/projects/{projectId}/users/{userId} |
| Meta | Post | auth | projectUserResendInvite | /api/v1/db/meta/projects/{projectId}/users/{userId}/resend-invite |
| Meta | Post | dbTable | create | /api/v1/db/meta/projects/{projectId}/tables |
| Meta | Get | dbTable | list | /api/v1/db/meta/projects/{projectId}/tables |
| Meta | Post | dbTableColumn | create | /api/v1/db/meta/tables/{tableId}/columns |

23
packages/nocodb-sdk/src/lib/Api.ts

@ -1063,6 +1063,29 @@ export class Api<
format: 'json',
...params,
}),
/**
* @description Resend Invitation to a specific user
*
* @tags Auth
* @name ProjectUserResendInvite
* @request POST:/api/v1/db/meta/projects/{projectId}/users/{userId}/resend-invite
* @response `200` `any` OK
*/
projectUserResendInvite: (
projectId: string,
userId: string,
data: any,
params: RequestParams = {}
) =>
this.request<any, any>({
path: `/api/v1/db/meta/projects/${projectId}/users/${userId}/resend-invite`,
method: 'POST',
body: data,
type: ContentType.Json,
format: 'json',
...params,
}),
};
project = {
/**

76
packages/nocodb/src/lib/noco/meta/api/projectUserApis.ts

@ -9,7 +9,11 @@ import User from '../../../noco-models/User';
import { Tele } from 'nc-help';
import Audit from '../../../noco-models/Audit';
import NocoCache from '../../../noco-cache/NocoCache';
import { CacheGetType, CacheScope } from '../../../utils/globals';
import { CacheGetType, CacheScope, MetaTable } from '../../../utils/globals';
import * as ejs from 'ejs';
import NcPluginMgrv2 from '../helpers/NcPluginMgrv2';
import Noco from '../../Noco';
import { PluginCategory } from 'nocodb-sdk';
async function userList(req, res) {
res.json({
@ -112,15 +116,12 @@ async function userInvite(req, res, next): Promise<any> {
// in case of single user check for smtp failure
// and send back token if failed
if (
emails.length === 1
// todo: email
// &&
// !(await sendInviteEmail(email, invite_token, req))
emails.length === 1 &&
!(await sendInviteEmail(email, invite_token, req))
) {
return res.json({ invite_token, email });
} else {
// todo: email
// sendInviteEmail(email, invite_token, req);
sendInviteEmail(email, invite_token, req);
}
} catch (e) {
console.log(e);
@ -209,16 +210,13 @@ async function projectUserDelete(req, res): Promise<any> {
NcError.forbidden('Insufficient privilege to delete a owner user.');
}
// await this.users.where('id', req.params.id).del();
await ProjectUser.delete(project_id, req.params.userId);
res.json({
msg: 'success'
});
}
// todo: map api
// @ts-ignore
async function resendInvite(req, res, next): Promise<any> {
async function projectUserInviteResend(req, res): Promise<any> {
const user = await User.get(req.params.userId);
if (!user) {
@ -233,8 +231,18 @@ async function resendInvite(req, res, next): Promise<any> {
invite_token_expires: new Date(Date.now() + 24 * 60 * 60 * 1000)
});
// todo:
// await sendInviteEmail(user.email, invite_token, req);
const pluginData = await Noco.ncMeta.metaGet2(null, null, MetaTable.PLUGIN, {
category: PluginCategory.EMAIL,
active: true
});
if (!pluginData) {
NcError.badRequest(
`No Email Plugin is found. Please go to App Store to configure first or copy the invitation URL to users instead.`
);
}
await sendInviteEmail(user.email, invite_token, req);
Audit.insert({
op_type: 'AUTHENTICATION',
@ -248,6 +256,44 @@ async function resendInvite(req, res, next): Promise<any> {
res.json({ msg: 'success' });
}
async function sendInviteEmail(
email: string,
token: string,
req: any
): Promise<any> {
try {
const template = (await import('./userApi/ui/emailTemplates/invite'))
.default;
const emailAdapter = await NcPluginMgrv2.emailAdapter();
if (emailAdapter) {
await emailAdapter.mailSend({
to: email,
subject: 'Verify email',
html: ejs.render(template, {
signupLink: `${req.ncSiteUrl}${
Noco.getConfig()?.dashboardPath
}#/user/authentication/signup/${token}`,
projectName: req.body?.projectName,
roles: (req.body?.roles || '')
.split(',')
.map(r => r.replace(/^./, m => m.toUpperCase()))
.join(', '),
adminEmail: req.session?.passport?.user?.email
})
});
return true;
}
} catch (e) {
console.log(
'Warning : `mailSend` failed, Please configure emailClient configuration.',
e.message
);
throw e;
}
}
const router = Router({ mergeParams: true });
router.get(
'/api/v1/db/meta/projects/:projectId/users',
@ -265,4 +311,8 @@ router.delete(
'/api/v1/db/meta/projects/:projectId/users/:userId',
ncMetaAclMw(projectUserDelete, 'projectUserDelete')
);
router.post(
'/api/v1/db/meta/projects/:projectId/users/:userId/resend-invite',
ncMetaAclMw(projectUserInviteResend, 'projectUserInviteResend')
);
export default router;

2
packages/nocodb/src/lib/noco/meta/helpers/NcPluginMgrv2.ts

@ -134,6 +134,8 @@ class NcPluginMgrv2 {
active: true
});
if (!pluginData) return null;
const pluginConfig = defaultPlugins.find(
c => c.title === pluginData.title && c.category === PluginCategory.EMAIL
);

47
scripts/sdk/swagger.json

@ -4821,6 +4821,51 @@
}
]
}
},
"/api/v1/db/meta/projects/{projectId}/users/{userId}/resend-invite": {
"parameters": [
{
"schema": {
"type": "string"
},
"name": "projectId",
"in": "path",
"required": true
},
{
"schema": {
"type": "string"
},
"name": "userId",
"in": "path",
"required": true
}
],
"post": {
"summary": "",
"operationId": "auth-project-user-resend-invite",
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {}
}
}
}
},
"tags": [
"Auth"
],
"description": "Resend Invitation to a specific user",
"requestBody": {
"content": {
"application/json": {
"schema": {}
}
}
}
}
}
},
"components": {
@ -7718,4 +7763,4 @@
}
}
}
}
}
Loading…
Cancel
Save