//Models
//Reward
public class Reward
{
[Key]
public int Reward_ID { get; set; }
[Required]
public string Prize { get; set; }
[Required]
public DateTime Reward_Issue_Date { get; set; }
public int Member_ID { get; set; }
[ForeignKey(nameof(Member_ID))]
public Member Member { get; set; }
public int Reward_Type_ID { get; set; }
[ForeignKey(nameof(Reward_Type_ID))]
public Reward_Type Reward_Type { get; set; }
public bool IsRedeemed { get; set; } // New property to track redemption status
}
//RewardType
public class Reward_Type
{
[Key]
public int Reward_Type_ID { get; set; }
[Required]
public string Reward_Type_Name { get; set; }
[Required]
public string Reward_Criteria { get; set; }
}
//Reward_Member
public class Reward_Member
{
[Key]
public int Reward_Member_ID { get; set; }
public int Number_Of_Qualified_Members { get; set; }
public int Member_ID { get; set; }
[ForeignKey(nameof(Member_ID))]
public Member Member { get; set; }
public int Reward_ID { get; set; }
[ForeignKey(nameof(Reward_ID))]
public Reward Reward { get; set; }
}
//ViewModels
//RewardViewModel
public class RewardViewModel
{
public int MemberId { get; set; }
public int RewardId { get; set; }
}
//AppDbContext
//Reward Seed Data
var Rewards = new Reward[]
{
new Reward { Reward_ID = 1, Prize = "Free Gym Membership", Reward_Issue_Date = new DateTime(2024, 4, 10), Member_ID = 1, Reward_Type_ID = 1 }
};
builder.Entity<Reward>().HasData(Rewards);
//Reward_Member Seed Data
var Reward_Members = new Reward_Member[]
{
new Reward_Member{ Reward_Member_ID = 1,Number_Of_Qualified_Members = 3,Member_ID = 1, Reward_ID = 1}
};
builder.Entity<Reward_Member>().HasData(Reward_Members);
//Controller
[Route("api/[controller]")]
[ApiController]
public class RewardController : ControllerBase
{
private readonly AppDbContext _appDbContext;
public RewardController(AppDbContext appDbContext)
{
_appDbContext = appDbContext;
}
[HttpPost]
[Route("createRewardType")]
public async Task<IActionResult> CreateRewardType(RewardTypeViewModel rt)
{
try
{
var rewardType = new Reward_Type
{
Reward_Type_Name = rt.Reward_Type_Name,
Reward_Criteria = rt.Reward_Criteria
};
_appDbContext.Reward_Types.Add(rewardType);
await _appDbContext.SaveChangesAsync();
return CreatedAtAction(nameof(GetRewardTypeById), new { id = rewardType.Reward_Type_ID }, rewardType);
}
catch (Exception)
{
return BadRequest();
}
}
[HttpGet]
[Route("getAllRewardTypes")]
public async Task<IActionResult> GetAllRewardTypes()
{
try
{
var rewardTypes = await _appDbContext.Reward_Types.ToListAsync();
return Ok(rewardTypes);
}
catch (Exception)
{
return BadRequest();
}
}
[HttpGet]
[Route("getRewardTypeById/{id}")]
public async Task<IActionResult> GetRewardTypeById(int id)
{
try
{
var rewardType = await _appDbContext.Reward_Types.FindAsync(id);
if (rewardType == null)
{
return NotFound();
}
return Ok(rewardType);
}
catch (Exception)
{
return BadRequest();
}
}
[HttpPut]
[Route("updateRewardType/{id}")]
public async Task<IActionResult> UpdateRewardType(int id, [FromBody] RewardTypeViewModel rt)
{
try
{
var rewardType = await _appDbContext.Reward_Types.FindAsync(id);
if(rewardType == null)
{
return NotFound();
}
//rewardType = new Reward_Type
//{
// Reward_Type_Name = rt.Reward_Type_Name,
// Reward_Criteria = rt.Reward_Criteria
//};
rewardType.Reward_Type_Name = rt.Reward_Type_Name;
rewardType.Reward_Criteria = rt.Reward_Criteria;
_appDbContext.Entry(rewardType).State = EntityState.Modified;
await _appDbContext.SaveChangesAsync();
return NoContent();
}
catch (Exception)
{
return BadRequest();
}
}
[HttpDelete]
[Route("deleteRewardType/{id}")]
public async Task<IActionResult> DeleteRewardType(int id)
{
try
{
var rewardType = await _appDbContext.Reward_Types.FindAsync(id);
if(rewardType == null)
{
return NotFound();
}
_appDbContext.Reward_Types.Remove(rewardType);
await _appDbContext.SaveChangesAsync();
return NoContent();
}
catch (Exception)
{
return BadRequest();
}
}
[HttpPost]
[Route("redeemReward")]
public async Task<IActionResult> RedeemReward([FromBody] RewardViewModel request)
{
try
{
// Fetch the reward by ID
var reward = await _appDbContext.Rewards
.FirstOrDefaultAsync(r => r.Reward_ID == request.RewardId && r.Member_ID == request.MemberId);
if (reward == null)
{
return NotFound("Reward not found or not eligible for the member.");
}
// Check if the reward is already redeemed
if (reward.IsRedeemed)
{
return BadRequest("Reward is already redeemed.");
}
// Mark the reward as redeemed
reward.IsRedeemed = true;
_appDbContext.Entry(reward).State = EntityState.Modified;
await _appDbContext.SaveChangesAsync();
return Ok(new { Status = "Success", Message = "Reward redeemed successfully!" });
}
catch (Exception)
{
return BadRequest("An error occurred while redeeming the reward.");
}
}
[HttpPost]
[Route("setReward")]
public async Task<IActionResult> SetReward(Reward r)
{
try
{
var reward = new Reward
{
Prize = r.Prize,
Reward_Issue_Date = r.Reward_Issue_Date,
Member_ID = r.Member_ID,
Reward_Type_ID = r.Reward_Type_ID
};
_appDbContext.Rewards.Add(reward);
await _appDbContext.SaveChangesAsync();
return CreatedAtAction(nameof(GetRewardById), new { id = reward.Reward_ID }, reward);
}
catch (Exception)
{
return BadRequest();
}
}
[HttpGet]
[Route("getRewardById/{id}")]
public async Task<IActionResult> GetRewardById(int id)
{
try
{
var reward = await _appDbContext.Reward_Types.FindAsync(id);
if (reward == null)
{
return NotFound();
}
return Ok(reward);
}
catch (Exception)
{
return BadRequest();
}
}
[HttpGet]
[Route("getAllRewards")]
public async Task<IActionResult> GetAllRewards()
{
try
{
var rewards = await _appDbContext.Rewards.ToListAsync();
return Ok(rewards);
}
catch (Exception)
{
return BadRequest();
}
}
}
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter