CLASSROOMIO-T-46: Forum CRUD MVP

Co-authored-by: Rotimi Best <[email protected]>

Merge-request: CLASSROOMIO-MR-13
Merged-by: Digdippa Team <[email protected]>
This commit is contained in:
Rotimi Best
2023-05-20 23:53:28 +00:00
committed by Space Cloud
co-authored by Rotimi Best
parent 779827ba46
commit c36a49a1ee
42 changed files with 871 additions and 1573 deletions
+9
View File
@@ -0,0 +1,9 @@
function generateSlug(title) {
return title
.match(/[^\W\s\d]*/g, '')
.join('')
.toLowerCase()
.concat(`-${new Date().getTime()}`);
}
export default generateSlug;
+29
View File
@@ -1,6 +1,23 @@
import z from 'zod';
import { validateEmail } from './validateEmail';
const askCommunityValidationSchema = z.object({
title: z.string().min(6, {
message: 'Must be 6 or more characters long',
invalid_type_error: 'Must not be empty',
}),
body: z.string().min(20, {
message: 'Must be 10 or more characters long',
invalid_type_error: 'Must not be empty',
}),
});
const commentInCommunityValidationSchema = z.object({
comment: z.string().min(6, {
message: 'Must be 6 or more characters long',
invalid_type_error: 'Must not be empty',
}),
});
const forgotValidationSchema = z.object({
email: z.string().email({
message: 'Invalid email address',
@@ -98,6 +115,18 @@ export const onboardingValidation = (fields = {}, step) => {
return processErrors(error);
};
export const askCommunityValidation = (fields = {}) => {
const { error } = askCommunityValidationSchema.safeParse(fields);
return processErrors(error);
};
export const commentInCommunityValidation = (fields = {}) => {
const { error } = commentInCommunityValidationSchema.safeParse(fields);
return processErrors(error);
};
export const getDisableSubmit = ({ password, confirmPassword }) => {
return !!(password && confirmPassword && password !== confirmPassword);
};
+9 -9
View File
@@ -52,8 +52,9 @@ export async function getOrganizations(userId) {
.from('organizationmember')
.select(
`
id,
profile_id,
organization (
organization!organizationmember_organization_id_fkey (
id,
name,
siteName,
@@ -64,7 +65,7 @@ export async function getOrganizations(userId) {
.eq('profile_id', userId);
const orgsArray = [];
if (data.length) {
if (Array.isArray(data) && data.length) {
data.forEach((orgMember) => {
orgsArray.push({
id: orgMember?.organization?.id,
@@ -73,6 +74,7 @@ export async function getOrganizations(userId) {
orgMember?.organization?.name?.substring(0, 2)?.toUpperCase() || '',
siteName: orgMember?.organization?.siteName,
avatar_url: orgMember?.organization?.avatar_url,
memberId: orgMember?.id,
});
});
@@ -98,16 +100,14 @@ export async function getOrgAudience(orgId) {
email,
avatar_url,
created_at,
groupmember!inner(
organizationmember!inner(
role_id,
group!inner(
organization!inner(id)
)
organization_id
)
`
)
.eq('groupmember.group.organization.id', orgId)
.eq('groupmember.role_id', 3); // is a student, tutor is 2 and admin is 1
.eq('organizationmember.organization_id', orgId)
.eq('organizationmember.role_id', 3); // is a student, tutor is 2 and admin is 1
console.log('data', data);
@@ -173,5 +173,5 @@ export async function getCurrentOrg(siteName) {
return goto('/404');
}
currentOrg.set(data);
currentOrg.set(data[0]);
}
+5 -1
View File
@@ -1,4 +1,4 @@
import { writable } from 'svelte/store';
import { writable, derived } from 'svelte/store';
export const orgs = writable([]);
export const currentOrg = writable({
@@ -10,3 +10,7 @@ export const currentOrg = writable({
});
export const orgAudience = writable([]);
export const orgTeam = writable([]);
export const currentOrgPath = derived(
currentOrg,
($currentOrg) => `/org/${$currentOrg.siteName}`
);