Skip to content

Instantly share code, notes, and snippets.

@tauseedzaman
Created December 7, 2023 07:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tauseedzaman/e14079a6f1aac68e1d3766655f6dec9b to your computer and use it in GitHub Desktop.
Save tauseedzaman/e14079a6f1aac68e1d3766655f6dec9b to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.8.22+commit.4fc1097e.js&optimize=false&runs=200&gist=
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract TodoDapp {
enum TodoStatus {
Pending,
InProgress,
Completed,
Cancelled
}
enum TodoPriority {
High,
Medium,
Low
}
struct Todo {
uint256 id;
string title;
string description;
TodoPriority priority;
string created_at;
string updated_at;
TodoStatus status;
}
Todo[] internal todos;
uint256 public TodoCount;
function createTodo(
string memory _title,
string memory _description,
string memory _priority,
string memory _created_at,
string memory _updated_at,
string memory _status
) public {
TodoStatus status = stringToEnum(_status);
TodoPriority priority = stringToPriority(_priority);
todos.push(
Todo(
TodoCount,
_title,
_description,
priority,
_created_at,
_updated_at,
status
)
);
TodoCount++;
}
function findTodo(uint256 _id) internal view returns (uint256 todoCounter) {
for (todoCounter = 0; todoCounter <= todos.length; ) {
if (todos[todoCounter].id == _id) {
return todoCounter;
}
todoCounter++;
revert("Todo not found!");
}
}
function updateTodo(
uint256 _id,
string memory _title,
string memory _description,
string memory _priority,
string memory _created_at,
string memory _updated_at,
string memory _status
) public {
uint256 todoId = findTodo(_id);
TodoStatus status = stringToEnum(_status);
TodoPriority priority = stringToPriority(_priority);
// update vlaues
todos[todoId].title = _title;
todos[todoId].description = _description;
todos[todoId].priority = priority;
todos[todoId].created_at = _created_at;
todos[todoId].updated_at = _updated_at;
todos[todoId].status = status;
}
function showTodo(uint256 _id)
public
view
returns (
uint256,
string memory,
string memory,
string memory,
string memory,
string memory,
string memory
)
{
uint256 todoId = findTodo(_id);
string memory priority = priorityToString(todos[todoId].priority);
string memory status = statusToString(todos[todoId].status);
return (
todos[todoId].id,
todos[todoId].title,
todos[todoId].description,
priority,
todos[todoId].created_at,
todos[todoId].updated_at,
status
);
}
function destroyTodo(uint256 _id) public {
uint256 todoId = _id;
delete todos[todoId];
TodoCount--;
}
// get count of todos based on status provided
function getTodoCount(string memory _status)
public
view
returns (uint256)
{
uint256 count = 0;
TodoStatus status = stringToEnum(_status);
for (uint256 i = 0; i < todos.length; i++) {
if (todos[i].status == status) {
count++;
}
}
return count;
}
// helpers
function stringToEnum(string memory _status)
internal
pure
returns (TodoStatus)
{
if (
keccak256(abi.encodePacked(_status)) ==
keccak256(abi.encodePacked("Pending"))
) {
return TodoStatus.Pending;
} else if (
keccak256(abi.encodePacked(_status)) ==
keccak256(abi.encodePacked("InProgress"))
) {
return TodoStatus.InProgress;
} else if (
keccak256(abi.encodePacked(_status)) ==
keccak256(abi.encodePacked("Completed"))
) {
return TodoStatus.Completed;
} else if (
keccak256(abi.encodePacked(_status)) ==
keccak256(abi.encodePacked("Cancelled"))
) {
return TodoStatus.Cancelled;
} else {
revert("Invalid status value");
}
}
function stringToPriority(string memory _priority)
internal
pure
returns (TodoPriority)
{
if (
keccak256(abi.encodePacked(_priority)) ==
keccak256(abi.encodePacked("High"))
) {
return TodoPriority.High;
} else if (
keccak256(abi.encodePacked(_priority)) ==
keccak256(abi.encodePacked("Medium"))
) {
return TodoPriority.Medium;
} else if (
keccak256(abi.encodePacked(_priority)) ==
keccak256(abi.encodePacked("Low"))
) {
return TodoPriority.Low;
} else {
revert("Invalid priority value");
}
}
function priorityToString(TodoPriority _priority)
internal
pure
returns (string memory)
{
if (_priority == TodoPriority.High) {
return "High";
} else if (_priority == TodoPriority.Medium) {
return "Medium";
} else if (_priority == TodoPriority.Low) {
return "Low";
} else {
revert("Invalid priority value");
}
}
function statusToString(TodoStatus _status)
internal
pure
returns (string memory)
{
if (_status == TodoStatus.Pending) {
return "Pending";
} else if (_status == TodoStatus.InProgress) {
return "InProgress";
} else if (_status == TodoStatus.Completed) {
return "Completed";
} else if (_status == TodoStatus.Cancelled) {
return "Cancelled";
} else {
revert("Invalid status value");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment