Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 26 additions & 16 deletions components/Organization/UpdateOrganization.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,38 @@ interface IProps {
setError: Function
setOrg: Function
setOrgEdit: Function
editType: 'name' | 'address'
loading: boolean
setLoading: Function
}

interface UpdateOrganizationForm {
name: string
name?: string
address?: string
}

const UpdateOrganization = ({ user, setError, setOrg, setOrgEdit }: IProps): JSX.Element => {
const UpdateOrganization = ({ user, setError, setOrg, setOrgEdit, editType, loading, setLoading }: IProps): JSX.Element => {
const { register, handleSubmit, reset } = useForm<UpdateOrganizationForm>({})

const onSubmit = async (params: any): Promise<void> => {
const onSubmit = async (params: UpdateOrganizationForm): Promise<void> => {
setLoading(true)
const res = await fetch('/api/organization', {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: params.name,
userId: user.userProfile.id
userId: user.userProfile.id,
...(editType === 'name' ? { name: params.name } : {}),
...(editType === 'address' ? { address: params.address } : {})
})
})

if (res.status === 200) {
const data = await res.json()
setOrg(data.organization)
reset()
setLoading(false)
setOrgEdit('')
} else {
const json = await res.json()
Expand All @@ -46,22 +54,24 @@ const UpdateOrganization = ({ user, setError, setOrg, setOrgEdit }: IProps): JSX
}}
method="post"
>
<label className={style.label}>Change name</label>
<label className={style.label}>
{editType === 'name' ? 'Change name' : 'Change address'}
</label>
<div className={style.create_input_ctn}>
<input
{...register('name')}
type="text"
placeholder="Enter the new name for your organization."
required
className={style.text_input}
autoFocus
/>
<Button className='ml' type='submit'>
<input
{...register(editType)}
type="text"
placeholder={`Enter the new ${editType} for your organization.`}
required
className={style.text_input}
autoFocus
/>
<Button className="ml" type="submit" loading={loading}>
Update
</Button>
</div>
<button className={style.cancel_btn} onClick={() => setOrgEdit('')}>
Cancel
Cancel
</button>
</form>
)
Expand Down
19 changes: 19 additions & 0 deletions components/Organization/ViewOrganization.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,13 @@ const ViewOrganization = ({ user, orgMembers, setOrgMembers, organization }: IPr
</div>
<InviteLink/>
</div>

{org.address?.trim() !== '' && (
<div className={style.row_ctn}>
<div>Address</div>
<div><b>{org.address}</b></div>
</div>
)}
<div className={style.sub_header}>Manage</div>
{orgEdit === ''
? (
Expand All @@ -59,6 +66,15 @@ const ViewOrganization = ({ user, orgMembers, setOrgMembers, organization }: IPr
Edit Name
</Button>
</div>
<div className={style.row_ctn}>
<div>Organization Address</div>
<Button
variant='xs'
onClick={() => setOrgEdit('address')}
>
Edit Address
</Button>
</div>
<div className={style.row_ctn}>
<div>Delete Organization</div>
<Button
Expand Down Expand Up @@ -87,6 +103,9 @@ const ViewOrganization = ({ user, orgMembers, setOrgMembers, organization }: IPr
setError={setError}
setOrg={setOrg}
setOrgEdit={setOrgEdit}
editType={orgEdit as 'name' | 'address'}
loading={loading}
setLoading={setLoading}
/>
)}
</>
Expand Down
1 change: 1 addition & 0 deletions constants/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ export const RESPONSE_MESSAGES = {
INVALID_INVITE_400: { statusCode: 400, message: 'Invalid invite.' },
INVITATION_TOKEN_NOT_PROVIDED_400: { statusCode: 400, message: "'token' not provided." },
ORGANIZATION_NAME_NOT_PROVIDED_400: { statusCode: 400, message: "'organizationName' not provided." },
MISSING_PARAMS_TO_UPDATE_ORGANIZATION_400: { statusCode: 400, message: 'Missing params to update organization.' },
INVITE_EXPIRED_400: { statusCode: 400, message: 'Invite expired.' },
INVALID_EMAIL_400: { statusCode: 400, message: 'Invalid email.' },
USER_OUT_OF_EMAIL_CREDITS_400: { statusCode: 400, message: 'User out of email credits.' },
Expand Down
2 changes: 2 additions & 0 deletions prisma/migrations/20250711220324_/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE `Organization` ADD COLUMN `address` VARCHAR(191) NOT NULL;
1 change: 1 addition & 0 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ model Organization {
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
creatorId String @unique
address String
users UserProfile[]
invites OrganizationInvite[]
}
Expand Down
12 changes: 9 additions & 3 deletions services/organizationService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ export async function createOrganization ({ creatorId, name }: CreateOrganizatio
connect: {
id: creatorId
}
}
},
address: ''
}
})
}
Expand Down Expand Up @@ -71,7 +72,7 @@ export async function deleteOrganization (organizationId: string, userId: string
})
}

export async function updateOrganization ({ userId, name }: UpdateOrganizationInput): Promise<Organization> {
export async function updateOrganization ({ userId, name, address }: UpdateOrganizationInput): Promise<Organization> {
const organization = await prisma.organization.findFirst({
where: { creatorId: userId }
})
Expand All @@ -80,9 +81,14 @@ export async function updateOrganization ({ userId, name }: UpdateOrganizationIn
throw new Error(RESPONSE_MESSAGES.USER_HAS_NO_ORGANIZATION_400.message)
}

const updateData: Partial<Organization> = {}

if (name !== undefined && name !== '') updateData.name = name
if (address !== undefined && address !== '') updateData.address = address

return await prisma.organization.update({
where: { id: organization.id },
data: { name }
data: updateData
})
}

Expand Down
9 changes: 6 additions & 3 deletions utils/validators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -477,11 +477,13 @@ export interface CreateOrganizationInput {
export interface UpdateOrganizationPUTParameters {
userId?: string
name?: string
address?: string
}

export interface UpdateOrganizationInput {
userId: string
name: string
name?: string
address?: string
}

export interface JoinOrganizationPOSTParameters {
Expand Down Expand Up @@ -513,10 +515,11 @@ export const parseJoinOrganizationPOSTRequest = function (params: JoinOrganizati

export const parseUpdateOrganizationPUTRequest = function (params: UpdateOrganizationPUTParameters): UpdateOrganizationInput {
if (params.userId === '' || params.userId === undefined) throw new Error(RESPONSE_MESSAGES.USER_ID_NOT_PROVIDED_400.message)
if (params.name === '' || params.name === undefined) throw new Error(RESPONSE_MESSAGES.ORGANIZATION_NAME_NOT_PROVIDED_400.message)
if ((params.name === '' || params.name === undefined) && (params.address === '' || params.address === undefined)) throw new Error(RESPONSE_MESSAGES.MISSING_PARAMS_TO_UPDATE_ORGANIZATION_400.message)
return {
userId: params.userId,
name: params.name
name: params.name,
address: params.address
}
}

Expand Down