Tenant Connection String Düzenlemeleri

This commit is contained in:
Sedat ÖZTÜRK 2025-06-12 10:55:35 +03:00
parent 00e3f6c17b
commit 904126191e
4 changed files with 96 additions and 47 deletions

View file

@ -111,34 +111,3 @@ username=system%40sozsoft.com
- Proje build olmuyorsa hatalar çözülür - Proje build olmuyorsa hatalar çözülür
- Yeni migration eklenir (varsa). Migration boş çıkıyorsa kaldırılır. (Örn dotnet ef migrations add Abp902 ve dotnet ef migrations remove) - Yeni migration eklenir (varsa). Migration boş çıkıyorsa kaldırılır. (Örn dotnet ef migrations add Abp902 ve dotnet ef migrations remove)
- Migration boş değilse çalıştırılır (dotnet ef database update) - Migration boş değilse çalıştırılır (dotnet ef database update)
# PostgreSQL Komutları
- FDW eklentisini yükle (sadece 1 kez gerekir)
```
CREATE EXTENSION IF NOT EXISTS postgres_fdw;
```
- Uzak veritabanı için bağlantı tanımı yap
```
CREATE SERVER kurs_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (
host 'Ip_Adress',
dbname 'DbName',
port '5432'
);
```
- Uzak veritabanı için kullanıcı eşlemesi
```
CREATE USER MAPPING FOR sa
SERVER kurs_server
OPTIONS (user 'user', password 'password');
```
- Uzak schema'dan tabloyu kendi veritabanına import et
```
IMPORT FOREIGN SCHEMA public
FROM SERVER kurs_server
INTO public;
```

View file

@ -816,6 +816,18 @@
"en": "Users Moved", "en": "Users Moved",
"tr": "Kullanıcılar Taşındı" "tr": "Kullanıcılar Taşındı"
}, },
{
"resourceName": "Platform",
"key": "Abp.Identity.CreateUser",
"en": "Create User",
"tr": "Kullanıcı Oluştur"
},
{
"resourceName": "Platform",
"key": "Abp.Identity.UserCreating",
"en": "User Creating",
"tr": "Kullanıcı Oluşturuluyor..."
},
{ {
"resourceName": "Platform", "resourceName": "Platform",
"key": "Abp.Identity.OrganizationUnit.Delete", "key": "Abp.Identity.OrganizationUnit.Delete",

View file

@ -82,7 +82,7 @@ define(['./workbox-54d0af47'], (function (workbox) { 'use strict';
"revision": "3ca0b8505b4bec776b69afdba2768812" "revision": "3ca0b8505b4bec776b69afdba2768812"
}, { }, {
"url": "index.html", "url": "index.html",
"revision": "0.05gfa4u7tj8" "revision": "0.tgk2t9rlh7"
}], {}); }], {});
workbox.cleanupOutdatedCaches(); workbox.cleanupOutdatedCaches();
workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), {

View file

@ -5,6 +5,7 @@ import {
FormItem, FormItem,
Input, Input,
Notification, Notification,
Select,
Tabs, Tabs,
toast, toast,
} from '@/components/ui' } from '@/components/ui'
@ -17,21 +18,26 @@ import {
postSeedTenantData, postSeedTenantData,
putTenantDefaultConnectionString, putTenantDefaultConnectionString,
} from '@/proxy/admin/tenant/tenant.service' } from '@/proxy/admin/tenant/tenant.service'
import { DataSourceTypeEnum } from '@/proxy/form'
import { useLocalization } from '@/utils/hooks/useLocalization' import { useLocalization } from '@/utils/hooks/useLocalization'
import { Field, Form, Formik, FormikHelpers } from 'formik' import { Field, FieldProps, Form, Formik, FormikHelpers } from 'formik'
import { Suspense, useEffect, useRef, useState } from 'react' import { Suspense, useEffect, useRef, useState } from 'react'
import * as Yup from 'yup' import * as Yup from 'yup'
import { dataSourceTypeOptions } from '../listForm/edit/options'
export interface ConnectionStringDto { export interface ConnectionStringDto {
id: string id: string
name: string name: string
value: string value: string
isNew?: boolean isNew?: boolean
dataSourceType?: number
} }
const schemaCs = Yup.object().shape({ const schemaCs = Yup.object().shape({
id: Yup.string().required(), id: Yup.string().required(),
name: Yup.string().required(), name: Yup.string().required(),
dataSourceType: Yup.number().required(),
value: Yup.string().required(),
}) })
const schemaSeed = Yup.object().shape({ const schemaSeed = Yup.object().shape({
@ -67,7 +73,7 @@ function TenantConnectionString({
if (response.data.length == 0) { if (response.data.length == 0) {
isNew = true isNew = true
value = 'User ID=sa;Password=NvQp8s@l;Host=postgres;Port=5432;Database=' + name + ';' value = ''
} else { } else {
isNew = false isNew = false
value = response.data value = response.data
@ -78,6 +84,7 @@ function TenantConnectionString({
name: 'Default', name: 'Default',
value, value,
isNew, isNew,
...(value && { dataSourceType: value.startsWith('Server') ? 1 : 2 }),
}) })
setLoading(false) setLoading(false)
} }
@ -138,7 +145,9 @@ function TenantConnectionString({
placement: 'top-center', placement: 'top-center',
}, },
) )
onDialogClose()
await fetchDataTenants()
//onDialogClose()
} catch (error) { } catch (error) {
toast.push( toast.push(
<Notification type="danger" duration={2000}> <Notification type="danger" duration={2000}>
@ -165,8 +174,6 @@ function TenantConnectionString({
setLoading(true) setLoading(true)
setSubmitting(true) setSubmitting(true)
setLoading(true)
try { try {
await postSeedTenantData(values) await postSeedTenantData(values)
toast.push( toast.push(
@ -207,7 +214,9 @@ function TenantConnectionString({
Connection String Connection String
</TabNav> </TabNav>
<TabNav key="seed" value="seed"> <TabNav key="seed" value="seed">
Create DB / Seed Data {connectionString.isNew
? translate('::Abp.Account.SignUp')
: translate('::AbpTenantManagement.Tenants.DatabaseSeed')}
</TabNav> </TabNav>
</TabList> </TabList>
</Tabs> </Tabs>
@ -224,7 +233,7 @@ function TenantConnectionString({
<Form> <Form>
<FormContainer size="sm"> <FormContainer size="sm">
<FormItem <FormItem
label="Name" label={translate('AbpAccount::DisplayName:Name')}
invalid={errors.name && touched.name} invalid={errors.name && touched.name}
errorMessage={errors.name} errorMessage={errors.name}
> >
@ -239,7 +248,55 @@ function TenantConnectionString({
</FormItem> </FormItem>
<FormItem <FormItem
label="Value" label={translate('::ListForms.ListFormFieldEdit.LookupDataSourceType')}
invalid={errors.dataSourceType && touched.dataSourceType}
errorMessage={errors.dataSourceType}
>
<Field
type="text"
autoComplete="off"
name="dataSourceType"
placeholder={translate(
'::ListForms.ListFormFieldEdit.LookupDataSourceType',
)}
>
{({ field, form }: FieldProps<DataSourceTypeEnum>) => (
<Select
field={field}
form={form}
autoFocus
isClearable={true}
options={dataSourceTypeOptions}
value={dataSourceTypeOptions?.filter(
(option) => option.value === values.dataSourceType,
)}
onChange={(option) => {
form.setFieldValue(field.name, option?.value)
if (option?.value == 1)
//PostgreSQL
form.setFieldValue(
'value',
'Server=sql;Database=' +
name +
';User Id=sa;password=@Password;Trusted_Connection=False;TrustServerCertificate=True;',
)
else if (option?.value == 2)
//MsSql
form.setFieldValue(
'value',
'User ID=sa;Password=@Password;Host=postgres;Port=5432;Database=' +
name +
';',
)
}}
/>
)}
</Field>
</FormItem>
<FormItem
label="Connection String"
invalid={errors.value && touched.value} invalid={errors.value && touched.value}
errorMessage={errors.value} errorMessage={errors.value}
> >
@ -252,6 +309,7 @@ function TenantConnectionString({
component={Input} component={Input}
/> />
</FormItem> </FormItem>
<div className="mt-6 flex flex-row justify-end gap-3"> <div className="mt-6 flex flex-row justify-end gap-3">
<Button <Button
disabled={connectionString.isNew} disabled={connectionString.isNew}
@ -287,15 +345,21 @@ function TenantConnectionString({
<Form> <Form>
<FormContainer size="sm"> <FormContainer size="sm">
<FormItem <FormItem
label="Admin Email" label={translate('::Abp.Account.EmailAddress')}
invalid={errors.adminEmail && touched.adminEmail} invalid={errors.adminEmail && touched.adminEmail}
errorMessage={errors.adminEmail} errorMessage={errors.adminEmail}
> >
<Field type="text" autoComplete="off" name="adminEmail" component={Input} /> <Field
type="text"
autoFocus
autoComplete="off"
name="adminEmail"
component={Input}
/>
</FormItem> </FormItem>
<FormItem <FormItem
label="Admin Password" label={translate('::Abp.Account.Password')}
invalid={errors.adminPassword && touched.adminPassword} invalid={errors.adminPassword && touched.adminPassword}
errorMessage={errors.adminPassword} errorMessage={errors.adminPassword}
> >
@ -310,8 +374,12 @@ function TenantConnectionString({
<div className="mt-6 flex flex-row justify-end gap-3"> <div className="mt-6 flex flex-row justify-end gap-3">
<Button variant="solid" loading={isSubmitting} type="submit"> <Button variant="solid" loading={isSubmitting} type="submit">
{isSubmitting {isSubmitting
? translate('::AbpTenantManagement.Tenants.DatabaseSeeding') ? connectionString.isNew
: translate('::AbpTenantManagement.Tenants.DatabaseSeed')} ? translate('::Abp.Identity.UserCreating')
: translate('::AbpTenantManagement.Tenants.DatabaseSeeding')
: connectionString.isNew
? translate('::Abp.Identity.CreateUser')
: translate('::AbpTenantManagement.Tenants.DatabaseSeed')}
</Button> </Button>
<Button type="button" variant="plain" onClick={onDialogClose}> <Button type="button" variant="plain" onClick={onDialogClose}>
{translate('::Cancel')} {translate('::Cancel')}