(Resolved)How can i delete a database row after 10 button clicks

Hi does anyone know how to do this? its for a repeater advert, i want it to expire once 10 people have enquired about the job thanks

my page code and what Ive tried so far but it doesn’t work

import wixLocation from 'wix-location';
import wixUsers from 'wix-users';
import wixData from 'wix-data';
import { sendEmail } from 'backend/emailJobPosts';

$w.onReady(() => {

    $w("#dynamicDataset").onReady(() => {

 var currentItem = $w("#dynamicDataset").getCurrentItem();
        $w("#textTitle").text = "Send a message to - " + currentItem.firstName;
 //added by snshah, to send email after applicants successfully applied for the job.
 
        $w("#dataset1").onAfterSave(() => {

            wixData.query("Trader-Job-Post-Clicks").find().then((result) => {

 let SearchStatsitem = result.items[0]; //item with values
 let id = SearchStatsitem._id; 
        id = $w('#dataset4').getCurrentItem().traderJobPostsClickLimit;
 // this will be used for
 //writing data back

        SearchStatsitem.traderJobPostsClickLimit++;
 // increment field with yes by 1
 // write updated value back to collection
        wixData.insert("Trader-Job-Post-Clicks", SearchStatsitem).then(() => {
 // refresh dataset to show new value
 //(this should be done in promise,
 //after updating collection)
            $w("#dataset4").refresh();
 
 
        });
    });

 // $w('#uploadGif').hide('FadeOut');
 // let jobTitleVal = currentItem.traderBusinessName;
 

 //let contactId = $w("#idFieldText").text;
 let jobPosterFirstName = currentItem.firstName;
 //let contactId = currentItem._id;
 let emails = $w("#JobPosterEmail").text;
 let jobPostersJob = $w("#jobPostersJob").text;
 let contactNumber = $w("#contactMobileNumber").text;
 let jobPostersHomeNumber = $w("#jobPostersHomeNumber").text;
 let jobLocation = $w('#jobLocation').text;
 let jobDescription = $w('#jobPosterMessage').text;
 let jobId = $w('#jobId').text;
 let lastName = $w('#lastName').text;

 let messageBack = $w("#messageTextBox").value;
 let companyName = $w("#traderName").value;
 let fullName = $w("#traderFullName").text;
 let traderEmail = $w("#traderEmailAddress").value;
 let traderContactNumber = $w("#traderContactNumber").value;
 

            $w("#postingMailTo").show();
            $w("#postingMailTo").text = "Posting message to " + jobPosterFirstName;

            sendEmail(emails, fullName, jobPostersJob, jobDescription, contactNumber, jobPostersHomeNumber,
             jobLocation, companyName, messageBack, lastName, jobId, jobPosterFirstName, traderEmail, traderContactNumber)
                .then(sendEmailStat => {
 //$w("#successMessage").show();
                    $w("#successMessage").text = 'Email Status is  : ' + sendEmailStat;
                    console.log(sendEmailStat);
                })
                .catch(error => {
                    console.log(error);
                    $w("#error").show();
                    $w("#error").text = "There was an Error sending message! please try again later! " + error;
                });

        });

    });
})

$w.onReady(function () {

    $w('#dataset4').onReady(() => {
 const myCount = $w('#dataset4').getCurrentItem().traderJobPostsClickLimit;
        $w('#count').text = myCount.toLocaleString('en');

        $w('#submitMessage').onClick(() => { 
if(myCount > 2){
 let ID = $w('#dynamicDataset').getCurrentItem()._id
wixData.remove("JobPosts", ID)
  .then( (results) => {
 let item = results;
    console.log(results) //see item below
  } )
  .catch( (err) => {
 let errorMsg = err;
    console.log(err)
  } );
}
 
        })

})
})

 // This function was added from the Properties & Events panel. To learn more, visit http://wix.to/UcBnC-4
 // Add your code for this event here: 

Add to your collection:

  1. field: numberOfClicks ; Type: number.

  2. Add to your repeater an onClick event listener (using repeater. onItemReady($itme)

  3. On your backed create a jsw file that contains something like:

import wixData from 'wix-data';
export function updateClicks(item){
return wixData.get("CollectionName", item._id).then(r => {
if(!r){return Promise.reject("already deleted");}
r.numberOfClicks ? item.numberOfClicks = r.numberOfClicks + 1 : item.numberOfClicks = 1;
if(item.numberOfClicks === 10){return wixData.remove("CollectionName", item._id);}
return wixData.update("CollectionName", item);
})
}
  1. Import the function to the front end, and call it from the event handler (see #2) and pass the clicked item as a parameter.

Hi thanks J.D i tried calling your code from the backend like you said but i kept getting errors with either _id is undefined or itemId isn’t a string or ’ Cannot create property ‘numberOfClicks’ on string ‘e484ca01-46f9-4811-a59e-327881d97adb’’ ?

my frontend code


let item;

export function submitMessage_click(event,$w) {
    item = $w("#dynamicDataset").getCurrentItem();
            updateClicks(item._id)
            .catch(error => {
                    console.log(error);
                    $w("#error").show();
                    $w("#error").text = "There was an Error sending message! please try again later! " + error;
                });

        }


your backend file named clicks.jsw

import wixData from 'wix-data';
export function updateClicks(item){
return wixData.get("JobPosts", item).then(r => {
if(!r){return Promise.reject("already deleted");}
r.numberOfClicks ? item.numberOfClicks = r.numberOfClicks + 1 : item.numberOfClicks = 1;
if(item.numberOfClicks === 2){return wixData.remove("JobPosts", item._id);}
return wixData.update("JobPosts", item);
})
}

so basically when they click contact on the advert it takes them through to a page where they can submit a message to and when different trades click on the submit message button x amount of times i want the advert (repeater item) to expire that has the contact button in if that makes sense

I’ve sorted it now thanks @J.D i altered a little bit of code here in backend and frontend code also changed my database permissions from who can delete content to anyone and it now works :slight_smile:

working code:

frontend

import wixLocation from 'wix-location';
import wixUsers from 'wix-users';
import wixData from 'wix-data';
import { sendEmail } from 'backend/emailJobPosts';
import { updateClicks } from 'backend/clicks';


$w.onReady(() => {

    $w("#dynamicDataset").onReady(() => {
 let userId = $w('#idFieldText').text;
 var item;
 var currentItem = $w("#dynamicDataset").getCurrentItem();
        $w("#textTitle").text = "Send a message to - " + currentItem.firstName;

        item = $w("#dynamicDataset").getCurrentItem();
        
        $w("#dataset1").onAfterSave(() => {

 
            updateClicks(item)
            .catch(error => {
                    console.log(error);
                    $w("#error").show();
                    $w("#error").text = "There was an Error sending message! please try again later! " + error;
                });

 

 //let contactId = $w("#idFieldText").text;
 let jobPosterFirstName = currentItem.firstName;
 //let contactId = currentItem._id;
 let emails = $w("#JobPosterEmail").text;
 let jobPostersJob = $w("#jobPostersJob").text;
 let contactNumber = $w("#contactMobileNumber").text;
 let jobPostersHomeNumber = $w("#jobPostersHomeNumber").text;
 let jobLocation = $w('#jobLocation').text;
 let jobDescription = $w('#jobPosterMessage').text;
 let jobId = $w('#jobId').text;
 let lastName = $w('#lastName').text;

 let messageBack = $w("#messageTextBox").value;
 let companyName = $w("#traderName").value;
 let fullName = $w("#traderFullName").text;
 let traderEmail = $w("#traderEmailAddress").value;
 let traderContactNumber = $w("#traderContactNumber").value;
 


            $w("#postingMailTo").show();
            $w("#postingMailTo").text = "Posting message to " + jobPosterFirstName;

            sendEmail(emails, fullName, jobPostersJob, jobDescription, contactNumber, jobPostersHomeNumber,
             jobLocation, companyName, messageBack, lastName, jobId, jobPosterFirstName, traderEmail, traderContactNumber)
                .then(sendEmailStat => {
 //$w("#successMessage").show();
                    $w("#successMessage").text = 'Email Status is  : ' + sendEmailStat;
                    console.log(sendEmailStat);
                })
                .catch(error => {
                    console.log(error);
                    $w("#error").show();
                    $w("#error").text = "There was an Error sending message! please try again later! " + error;
                });

        });

    });
})




 
 


 
 

backend

file clicks.jsw

import wixData from 'wix-data';
export function updateClicks(item){
return wixData.get("JobPosts", item._id).then(r => {
if(!r){return Promise.reject("already deleted");}
r.numberOfClicks ? item.numberOfClicks = r.numberOfClicks + 1 : item.numberOfClicks = 1;
if(item.numberOfClicks === 8){return wixData.remove("JobPosts", item._id);}
return wixData.update("JobPosts", item)

.catch(error => {
                    console.log(error);
                    $w("#error").show();
                    $w("#error").text = "There was an Error sending message! please try again later! " + error;
})
}
)}

You can’t use $w on the backend.
You should have there:

.catch(error => error)

and handle the returned error on the front end.

Ok thanks @J.D. are you taking any projects on at all?

You’re welcome. No. currently I’m not.