diff --git a/index.ts b/index.ts index e188a3b5cf42196eb6747fa6f292ee01dc8c56db..c2f9288aad104e23d9276c81a64e0936bff5be8f 100644 --- a/index.ts +++ b/index.ts @@ -42,7 +42,7 @@ program.command('main') while (true) { const role: Role = await getRole(tezos) - console.log(chalk.bgBlue(`\nVous êtes connecté en tant que ${role}\n`)) + console.log(`Vous êtes connecté en tant que ${chalk.bgBlue(role)}\n`) const questions = [ { @@ -65,7 +65,7 @@ program.command('main') case 'ADHERENT': // VOTER POUR UNE PROPOSITION // CLOTURER ET RESOUDRE LES PROPOSITIONS DONT IL EST LE CREATEUR - questions[0].choices = ['Faire une proposition', 'Créer un token'] + questions[0].choices = ['Faire une proposition', 'Voir les propositions', 'Créer un token'] if (await handleHasToken(tezos)) { questions[0].choices.push('Bruler des tokens') } diff --git a/src/features/proposal/closeProposal.ts b/src/features/proposal/closeProposal.ts index da2edd1d3c2e1910a32a8c0687d4b80d8613c231..3307d31d6628ff1d20ad40a382fb7935c0b67376 100644 --- a/src/features/proposal/closeProposal.ts +++ b/src/features/proposal/closeProposal.ts @@ -1,11 +1,13 @@ import { type TezosToolkit } from '@taquito/taquito' import chalk from 'chalk' -import { handleGetProposals, handleCloseProposal } from '../../handlers/proposal/proposalHandlers.js' +import { handleGetOpenProposals, handleCloseProposal } from '../../handlers/proposal/proposalHandlers.js' async function closeProposal (tezos: TezosToolkit): Promise<void> { - await handleGetProposals(tezos).then(async (response) => { + await handleGetOpenProposals(tezos).then(async (response) => { const proposalsByTitle: string[] = response + if (response.length === 0) throw new Error("Aucune proposition n'est ouverte") + await handleCloseProposal(proposalsByTitle, tezos).then(() => { console.log(chalk.bgGreenBright('\nVous avez clôturé la proposition !!\n')) }).catch((error) => { diff --git a/src/features/proposal/resolveProposal.ts b/src/features/proposal/resolveProposal.ts index 0f1703c54b13930df3d3b82e8fbf818e38f51819..7477c596bd434413e47db79b16d40df285c6b496 100644 --- a/src/features/proposal/resolveProposal.ts +++ b/src/features/proposal/resolveProposal.ts @@ -1,11 +1,13 @@ import { type TezosToolkit } from '@taquito/taquito' import chalk from 'chalk' -import { handleGetProposals, handleResolveProposal } from '../../handlers/proposal/proposalHandlers.js' +import { handleGetSolvableProposals, handleResolveProposal } from '../../handlers/proposal/proposalHandlers.js' async function resolveProposal (tezos: TezosToolkit): Promise<void> { - await handleGetProposals(tezos).then(async (response) => { + await handleGetSolvableProposals(tezos).then(async (response) => { const proposalsByTitle: string[] = response + if (response.length === 0) throw new Error("Aucune proposition n'est résoluble") + await handleResolveProposal(proposalsByTitle, tezos).then(() => { console.log(chalk.bgGreenBright('\nVous avez résolue la proposition !!\n')) }).catch((error) => { diff --git a/src/handlers/association/associationHandlers.ts b/src/handlers/association/associationHandlers.ts index b5fac0292877dbbea21ad9f104f11654e57229a1..7bbfc678455ebfaf8a18fa2f87d0559025737532 100644 --- a/src/handlers/association/associationHandlers.ts +++ b/src/handlers/association/associationHandlers.ts @@ -57,7 +57,8 @@ async function handleCreateAssociation (tezos: TezosToolkit): Promise<void> { try { await createAssociation(association, tezos) } catch (error) { - throw new Error(`${error.lastError.with.string}`) + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) } } @@ -86,20 +87,23 @@ async function handleJoinAssociation (associations: string[], tezos: TezosToolki try { await joinAssociation(associationName, tezos) } catch (error) { - throw new Error(`${error.lastError.with.string}`) + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) } } /** * Handles the process of listing associations. * @param {TezosToolkit} tezos - The TezosToolkit instance used for blockchain operations. - * @returns {Promise<string[]>} A promise with a string of association name. + * @returns {Promise<string[]>} A promise with a list of string of association name. */ async function handleGetAssociations (tezos: TezosToolkit): Promise<string[]> { try { - return await getAssociations(tezos) + const associations = await getAssociations(tezos) + return associations.map(association => association.name) } catch (error) { - throw new Error(`${error.lastError.with.string}`) + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) } } @@ -128,7 +132,8 @@ async function handleGetAssociationDetails (associations: string[], tezos: Tezos try { return await getAssociationDetails(associationName, tezos) } catch (error) { - throw new Error(`${error.lastError.with.string}`) + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) } } @@ -141,7 +146,8 @@ async function handleIsAdmin (tezos: TezosToolkit): Promise<boolean> { try { return await isAdminOfAssociation(tezos) } catch (error) { - throw new Error(`${error}`) + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) } } diff --git a/src/handlers/proposal/proposalHandlers.ts b/src/handlers/proposal/proposalHandlers.ts index 892cfd67714aaed005a29b4233f08b9141d8753f..707f5e32f7518e3c569e904accd5b460b9adebd3 100644 --- a/src/handlers/proposal/proposalHandlers.ts +++ b/src/handlers/proposal/proposalHandlers.ts @@ -57,7 +57,8 @@ async function handleCreateProposal (tezos: TezosToolkit): Promise<void> { try { await createProposal(proposal, tezos) } catch (error) { - throw new Error(`${error.lastError.with.string}`) + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) } } @@ -86,7 +87,8 @@ async function handleResolveProposal (proposals: string[], tezos: TezosToolkit): try { await resolveProposal(associationName, tezos) } catch (error) { - throw new Error(`${error.lastError.with.string}`) + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) } } @@ -101,7 +103,7 @@ async function handleCloseProposal (proposals: string[], tezos: TezosToolkit): P { type: 'list', name: 'choice', - message: 'Quelle proposition voulez-vous clôturé ?', + message: 'Quelle proposition voulez-vous clôturer ?', choices: proposals } ] @@ -115,21 +117,54 @@ async function handleCloseProposal (proposals: string[], tezos: TezosToolkit): P try { await closeProposal(associationName, tezos) } catch (error) { - throw new Error(`${error.lastError.with.string}`) + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) } } /** * Handles the process of listing proposals. * @param {TezosToolkit} tezos - The TezosToolkit instance used for blockchain operations. - * @returns {Promise<string[]>} A promise with a string of proposal title. + * @returns {Promise<Proposal[]>} A promise with a list of proposal title. */ async function handleGetProposals (tezos: TezosToolkit): Promise<string[]> { try { - return await getProposals(tezos) + const proposals: Proposal[] = await getProposals(tezos) + return proposals.map(proposal => proposal.title) } catch (error) { - throw new Error(`${error.lastError.with.string}`) + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) } } -export { handleCreateProposal, handleResolveProposal, handleGetProposals, handleCloseProposal } +/** + * Handles the process of listing open proposals. + * @param {TezosToolkit} tezos - The TezosToolkit instance used for blockchain operations. + * @returns {Promise<string[]>} A promise with a list of open proposal title. + */ +async function handleGetOpenProposals (tezos: TezosToolkit): Promise<string[]> { + try { + const proposals: Proposal[] = await getProposals(tezos) + return proposals.filter(proposal => proposal.isOpen).map(proposal => proposal.title) + } catch (error) { + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) + } +} + +/** + * Handles the process of listing solvable proposals. + * @param {TezosToolkit} tezos - The TezosToolkit instance used for blockchain operations. + * @returns {Promise<string[]>} A promise with a list of solvable proposal title. + */ +async function handleGetSolvableProposals (tezos: TezosToolkit): Promise<string[]> { + try { + const proposals: Proposal[] = await getProposals(tezos) + return proposals.filter(proposal => proposal.approveRate >= 51).map(proposal => proposal.title) + } catch (error) { + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) + } +} + +export { handleCreateProposal, handleResolveProposal, handleGetProposals, handleCloseProposal, handleGetOpenProposals, handleGetSolvableProposals } diff --git a/src/handlers/roleHandlers.ts b/src/handlers/roleHandlers.ts index 6e6a5d7f00c996ae9e93db29eeaef50354a0873d..095352b6afbecb7272a4f39b046760e5b8597843 100644 --- a/src/handlers/roleHandlers.ts +++ b/src/handlers/roleHandlers.ts @@ -58,6 +58,9 @@ async function handleAdherentChoice (choice: string, tezos: TezosToolkit): Promi case 'Créer un token': await createToken(tezos) break + case 'Voir les propositions': + await showProposals(tezos) + break case 'Voir mon portefeuille': await showBalance(tezos) break diff --git a/src/handlers/token/tokenHandlers.ts b/src/handlers/token/tokenHandlers.ts index 8d1df95f952d9b2285677f86bb576eb4f11a8506..edb1f2728d14ba8c78fe18bb524bb9db05e9b594 100644 --- a/src/handlers/token/tokenHandlers.ts +++ b/src/handlers/token/tokenHandlers.ts @@ -38,7 +38,8 @@ async function handleCreateToken (tezos: TezosToolkit): Promise<void> { try { await createFAToken(nbTokenFungible, tezos) } catch (error) { - throw new Error(`${error.lastError.with.string}`) + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) } } @@ -75,7 +76,8 @@ async function handleBurnToken (tezos: TezosToolkit): Promise<void> { try { await burnToken(nbTokenToBurn, tezos) } catch (error) { - throw new Error(`${error.lastError.with.string}`) + const errorMessage = error.lastError.with.string ? error.lastError.with.string : 'Unknown error occurred' + throw new Error(`${errorMessage}`) } } diff --git a/src/services/association.service.ts b/src/services/association.service.ts index 7ebd20ea49038d1f4dc5b99d673674d56eed776c..6a00b3d038b4c66d874c3b2bf8a2578dcfcc8dc7 100644 --- a/src/services/association.service.ts +++ b/src/services/association.service.ts @@ -21,7 +21,6 @@ async function createAssociation (association: Association, tezos: TezosToolkit) const op: Operation = await contract.methodsObject.registerAssociation(association).send() await op.confirmation() - console.log(op.hash) } // NEED UPDATE ENTRYPOINT !! @@ -33,7 +32,7 @@ async function joinAssociation (associationName: string, tezos: TezosToolkit): P } // NEED UPDATE ENTRYPOINT !! -async function getAssociations (tezos: TezosToolkit): Promise<string[]> { +async function getAssociations (tezos: TezosToolkit): Promise<Association[]> { // const contract = await tezos.contract.at(address) // const op: Operation = await contract.methodsObject.getAssociations().send() @@ -41,7 +40,7 @@ async function getAssociations (tezos: TezosToolkit): Promise<string[]> { // return op // MOCK - return mockAssociations.map(association => association.name) + return mockAssociations } async function getAssociationDetails (associationName: string, tezos: TezosToolkit): Promise<Association> { diff --git a/src/services/proposal.service.ts b/src/services/proposal.service.ts index d4a562c0ce82c60f1a334c37f78026d7978a8e9d..c6caeff394d3ee58c7007eede278afb2851cfd66 100644 --- a/src/services/proposal.service.ts +++ b/src/services/proposal.service.ts @@ -7,7 +7,9 @@ const address = 'KT1QZJzhSPQ89K4eC59tmQYCt44qph7wXoJu' const mockProposals: Proposal[] = [ { title: 'Proposal 1', - description: 'Ceci est la proposition 1' + description: 'Ceci est la proposition 1', + isOpen: true, + approveRate: 50 }, { title: 'Proposal 2', @@ -61,14 +63,14 @@ async function viewVoteInProgressProposal (proposalName: string, tezos: TezosToo } // NEED UPDATE ENTRYPOINT !! -async function getProposals (tezos: TezosToolkit): Promise<string[]> { +async function getProposals (tezos: TezosToolkit): Promise<Proposal[]> { // const contract = await tezos.contract.at(address) // const op: Operation = await contract.methodsObject.resolveProposal(proposalName).send() // await op.confirmation() // MOCK - return mockProposals.map(association => association.title) + return mockProposals } export { createProposal, voteForProposal, viewVoteInProgressProposal, closeProposal, resolveProposal, getProposals } diff --git a/src/services/token.service.ts b/src/services/token.service.ts index 983f279ee1a9ea8a6f26ba2a9fe996d4d8932d8b..4835dd19c91fb42e7094ec7fcbbab260542db1cf 100644 --- a/src/services/token.service.ts +++ b/src/services/token.service.ts @@ -30,7 +30,7 @@ async function hasToken (tezos: TezosToolkit): Promise<boolean> { // await op.confirmation() - return false + return true } export { createFAToken, burnToken, hasToken } diff --git a/src/types/Proposal.ts b/src/types/Proposal.ts index cb05777b2f21411b0ebcc3978cb748a068476a22..5bb57811105fe0831bddac3b6baeaefc25a42e77 100644 --- a/src/types/Proposal.ts +++ b/src/types/Proposal.ts @@ -4,4 +4,5 @@ export interface Proposal { fct?: () => void participationRate?: number approveRate?: number + isOpen?: boolean } diff --git a/src/utils/getRole.ts b/src/utils/getRole.ts index 5aaaa553ffcd46e2fa0151ddac1fe47546d6f3b2..b5bab0f62daba0d5b8b2998593c9275d2d8a7e33 100644 --- a/src/utils/getRole.ts +++ b/src/utils/getRole.ts @@ -1,11 +1,11 @@ import { type TezosToolkit } from '@taquito/taquito' import { type Role } from '../types/Role' -// import { handleIsAdmin } from '../handlers/association/associationHandlers.js' +import { handleIsAdmin } from '../handlers/association/associationHandlers.js' export async function getRole (tezos: TezosToolkit): Promise<Role> { - // const isAdmin = await handleIsAdmin(tezos) + const isAdmin = await handleIsAdmin(tezos) - // if (isAdmin) return 'ADMIN' + if (isAdmin) return 'ADMIN' // TEMPORARY return 'CONNECTED' diff --git a/test/handlers/association/associationHandlers.spec.ts b/test/handlers/association/associationHandlers.spec.ts index f5a9c10ce4cdef8350b9b4a4d7e0a4a5d6aec099..5132f7254632a9fa1d5f5a4de2a0f734d65f3c7b 100644 --- a/test/handlers/association/associationHandlers.spec.ts +++ b/test/handlers/association/associationHandlers.spec.ts @@ -129,16 +129,12 @@ describe('associationHandlers', () => { const associations = await handleGetAssociations(mockedTezosToolkit) expect(getAssociationsSpy).toBeCalledWith(mockedTezosToolkit) - expect(associations).toStrictEqual([ - { - name: 'Association 1', - description: 'Association 1 description' - }, - { - name: 'Association 2', - description: 'Association 2 description' - } - ]) + expect(associations).toStrictEqual( + [ + 'Association 1', + 'Association 2' + ] + ) }) }) diff --git a/test/handlers/roleHandlers.spec.ts b/test/handlers/roleHandlers.spec.ts index 7eaae2a1e63a6b1bb7dd5e469f022999506374eb..755f601ab93910318f2ce7d5d456236f1e26f217 100644 --- a/test/handlers/roleHandlers.spec.ts +++ b/test/handlers/roleHandlers.spec.ts @@ -157,6 +157,14 @@ describe('roleHandlers', () => { }) }) + describe('when choice is "Voir les propositions"', () => { + it('should call showProposals', async () => { + await handleAdminChoice('Voir les propositions', mockedTezosToolkit) + + expect(showProposals).toBeCalled() + }) + }) + describe('when choice is invalid', () => { it('should log "Choix invalide"', async () => { const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {})